HMD を使用した仮想現実環境で作業しており、連続トラッカー データがクォータニオンとして送られてきます。そこから回転行列を計算し、あとは OpenGL に任せます。
ここで、最初に特定の方向を設定します。つまり、トラッカーからのデータをリセットし、常にオフセットを計算します。
編集:さらにテストした後、計算とソースの軸を変更して左手から右手の座標系に切り替えると、次が正しいことがわかりました。
public void trackerPositionUpdate(TrackerUpdate u, TrackerRemote tracker) {
if (!isreset){
//Set reference reset-viewpoint here
Matrix4f.setIdentity(reset);
reset.m00=1;
reset.m11=-1;
reset.m22=1;
//get quaternion
float qx = (float)u.quat[0];
float qy = (float)u.quat[1];
float qz = (float)u.quat[2];
float qw = (float)u.quat[3];
//quaternion to rotation matrix for reset reasons - axis 2 and 3 switched
orientation.m00 = 1.0f - (2.0f*(qy*qy) + 2.0f*(qz*qz));
orientation.m02 = 2.0f*qx*qy - 2.0f*qz*qw;
orientation.m01 = 2.0f*qx*qz + 2.0f*qy*qw;
orientation.m03 = 0.0f;
orientation.m10 = 2.0f*qx*qy + 2.0f*qz*qw;
orientation.m12 = 1.0f - (2.0f*qx*qx + 2.0f*qz*qz);
orientation.m11 = 2.0f*qy*qz - 2.0f*qx*qw;
orientation.m13 = 0.0f;
orientation.m20 = 2.0f*qx*qz - 2.0f*qy*qw;
orientation.m22 = 2.0f*qy*qz + 2.0f*qx*qw;
orientation.m21 = 1.0f - (2.0f*qx*qx + 2.0f*qy*qy);
orientation.m23 = 0.0f;
orientation.m30 = 0.0f;
orientation.m32 = 0.0f;
orientation.m31 = 0.0f;
orientation.m33 = 1.0f;
//this inverts the elevation and needs to be set for the tracker to work correctly with the audio coordinate system
orientation.m01 *= -1 ;
orientation.m11 *= -1 ;
orientation.m21 *= -1 ;
orientation.m31 *= -1 ;
//invert matrix
orientation.invert();
//Mreset = Mdest * Morientation^(-1)
Matrix4f.mul(reset, orientation, reset);
isreset=true;
System.out.println("Ivas_VRPNTracker# bool isreset: " + isreset);
}
// Get quaternion from trackerinput
float qx = (float)u.quat[0];
float qy = (float)u.quat[1];
float qz = (float)u.quat[2];
float qw = (float)u.quat[3];
//original :x = 0,y = 1 , z = 2;
Tracker_X = u.pos[0];
Tracker_Y = u.pos[2];
Tracker_Z = -u.pos[1];
//1st row
orientation.m00 = 1.0f - (2.0f*(qy*qy) + 2.0f*(qz*qz));
orientation.m02 = 2.0f*qx*qy - 2.0f*qz*qw;
orientation.m01 = 2.0f*qx*qz + 2.0f*qy*qw;
orientation.m03 = 0.0f;
//2nd row
orientation.m10 = 2.0f*qx*qy + 2.0f*qz*qw;
orientation.m12 = 1.0f - (2.0f*qx*qx + 2.0f*qz*qz);
orientation.m11 = 2.0f*qy*qz - 2.0f*qx*qw;
orientation.m13 = 0.0f;
//3rd row
orientation.m20 = 2.0f*qx*qz - 2.0f*qy*qw;
orientation.m22 = 2.0f*qy*qz + 2.0f*qx*qw;
orientation.m21 = 1.0f - (2.0f*qx*qx + 2.0f*qy*qy);
orientation.m23 = 0.0f;
//4th row
orientation.m30 = 0.0f;
orientation.m32 = 0.0f;
orientation.m31 = 0.0f;
orientation.m33 = 1.0f;
//this inverts the elevation and needs to be set for the tracker to work correctly with the audio coordinate system
orientation.m01 *= -1 ;
orientation.m11 *= -1 ;
orientation.m21 *= -1 ;
orientation.m31 *= -1 ;
//define reset by multiplication with rotational reset matrix
//Mview = Morientationcurrent * Mreset
Matrix4f.mul(orientation,reset, orientation);
次に、方向マトリックスにモデル ビュー マトリックスを掛けます。これは問題なく動作しますが、Enter キーを押したときに位置をリセットするルーチンを見つけるのに苦労しています。