Google TangoのMotion Trackingを使用してサンプルアプリを作ったときにハマったので残しておきます(多分3D系に慣れている人は常に気にしていることと思いますorz)。

Google TangoとUnityの座標系は残念なことに異なっていて、それぞれ以下のようになっています。
Google TangoUnity
座標系Right-HandLeft-Hand
デバイスと
座標系の関係

なので、Motion Trackingで得られるYZ方向の値は、Unity的にはZY方向の値を指していることになります。そのため、TangoPoseDataを画面上に表現する際に、YZ->ZY変換を行わないと意図した表示が得られないので、気を付けましょう。
※ 作成したサンプルアプリにおいては、単純にYZ方向の値を入れ替えました。
TangoCoordinateFramePair framePair = new TangoCoordinateFramePair();
framePair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_START_OF_SERVICE;
framePair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE;
TangoPoseData poseData = new TangoPoseData();
PoseProvider.GetPoseAtTime(poseData, 0.0, framePair);

DVector3 trackingPositionDV3 = poseData.translation;

// 座標系がTangoとUnityで異なる(Tango: Right-Hand、Unity: Left-Hand)ので、YZ方向の値を入れ替える
Vector3 trackingPositionV3 = new Vector3((float)trackingPositionDV3.x, (float)trackingPositionDV3.z, (float)trackingPositionDV3.y);
DVector4 trackingOrientationDV4 = poseData.orientation;
// QuaternionもYZ方向の値を入れ替える
Quaternion trackingOrientationQ = new Quaternion((float)trackingOrientationDV4.x, (float)trackingOrientationDV4.z, (float)trackingOrientationDV4.y, (float)trackingOrientationDV4.w);
// Trackingした位置・方向に合ったGameObjectを生成
Instantiate(MotionTrackingCapsule, trackingPositionV3, trackingOrientationQ).SetActive(true);

### 2017.07.13 15:30 追記(START) ###
上記の変更はTangoSupport.TangoPoseToWorldTransformにて変換できました。
### 2017.07.13 15:30 追記(END) ###

参考文献:
Coordinate Systems

コメントの投稿