Table of Contents

EasyAR 座標系

3D プログラムにおいて、座標系の定義は非常に重要です。特に明記されていない場合、以下の慣例に従います。

  • ベクトルはすべて列ベクトルです。

  • 行列はすべて row-major です。(OpenGL は column-major)

  • 座標系はすべて右手座標系です。(OpenGL と一致)

  • 座標系に物理的な目盛りが存在する場合、単位はメートルを使用します。

  • 世界座標系の Y 軸の負の方向が重力方向です。

  • デバイス座標系の X 軸は右方向、Y 軸は上方向、Z 軸は画面から外に向かう方向です。画面が回転可能なデバイスでは、右と上の定義はデフォルトの方向に基づきます。具体的には、Android のデフォルト方向はシステムの定義に従います(メガネや一部のタブレットでは横置きがデフォルト、スマートフォンや一部のタブレットでは縦置きがデフォルト)。iOS のデフォルト方向は縦置きです。(Android および iOS の IMU 説明での定義と一致)

物体追跡の pose

平面画像追跡(ImageTracker)および 3D 物体追跡(ObjectTracker)の物体の pose は pose に格納され、現在追跡中の target の camera に対する位置姿勢を表します。ここで、camera 座標系と target 座標系はともに右手座標系です。camera 座標系の原点はカメラの光学中心、x 軸の正方向は右、y 軸の正方向は上、z 軸の正方向は光がカメラに入る(画面から出る)方向です。(ここでの右と上は、カメラ画像における右と上を指し、デバイスの自然な方向とは異なる可能性があります。)データの並びは row-major で、OpenGL の column-major とは逆です。

pose は次のように記述できます:

\[ P = \left( \begin{array}{cccc} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ p_{31} & p_{32} & p_{33} & p_{34} \\ 0 & 0 & 0 & 1 \\ \end{array} \right) \]

3D エンジンが異なる座標軸定義を採用している場合、3D エンジンに変換行列を設定する際に考慮する必要があります。例えば、camera 座標系と target 座標系の両方で z 方向が反対の場合、3D エンジンの target ノードの変換行列の値は次のように設定する必要があります:

\[ \left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right)\left( \begin{array}{cccc} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ p_{31} & p_{32} & p_{33} & p_{34} \\ 0 & 0 & 0 & 1 \\ \end{array} \right)\left( \begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array} \right)=\left( \begin{array}{cccc} p_{11} & p_{12} & -p_{13} & p_{14} \\ p_{21} & p_{22} & -p_{23} & p_{24} \\ -p_{31} & -p_{32} & p_{33} & -p_{34} \\ 0 & 0 & 0 & 1 \\ \end{array} \right) \]

モーション追跡の transform

表面追跡(SurfaceTracker)の transform およびモーション追跡(MotionTrackerCameraDevice)、ARKit(ARKitCameraDevice)、ARCore(ARCoreCameraDevice)の cameraTransform は、camera の世界座標系に対する変換を表します。ここで、camera 座標系と世界座標系はともに右手座標系です。camera 座標系の原点はカメラの光学中心、x 軸の正方向は右、y 軸の正方向は上、z 軸の正方向は光がカメラに入る(画面から出る)方向です。(ここでの右と上は、モバイルデバイス上ではデバイスの自然な方向の右と上を指します。)世界座標系の y 軸は上方向(重力方向と反対)、原点はモーション追跡システムによって決定されます。データの並びは row-major で、OpenGL の column-major とは逆です。

疎空間マップと Mega における pose

疎空間マップ SparseSpatialMapgetMapPose および Mega 内の pose は、マップ block の camera 座標系における位置と姿勢を表します。ここで、camera 座標系とマップ block 座標系はともに右手座標系です。camera 座標系の原点はカメラの光学中心、x 軸の正方向は右、y 軸の正方向は上、z 軸の正方向は光がカメラに入る(画面から出る)方向です。(ここでの右と上は、モバイルデバイス上ではデバイスの自然な方向の右と上を指します。)マップ block 座標系の y 軸は上方向(重力方向と反対)、原点はマップ block データによって決定されます。データの並びは row-major で、OpenGL の column-major とは逆です。