EasyAR 座標系
3D プログラムでは、座標系の定義が非常に重要です。特に説明がない場合、次の規約を使用します。
ベクトルはすべて列ベクトルです。
行列はすべて row-major を使用します。(OpenGL は column-major)
座標系はすべて右手座標系を使用します。(OpenGL と一致)
座標系に物理スケールがある場合、単位はメートルです。
ワールド座標系の Y 軸負方向は重力方向です。
デバイス座標系の X 軸は右、Y 軸は上、Z 軸は画面から外側を向きます。画面を回転できるデバイスでは、右と上の定義はデフォルト方向を基準にします。特に、Android のデフォルト方向はシステム定義に従います。(メガネと一部のタブレットでは横向き配置がデフォルト方向で、スマートフォンと一部のタブレットでは縦向き配置がデフォルト方向です。)iOS のデフォルト方向は縦向き配置です。(Android と iOS の IMU ドキュメントの定義と一致)
Object tracking の pose
平面画像トラッキング(ImageTracker)と 3D object tracking(ObjectTracker)のオブジェクト pose は pose に格納され、現在トラッキングされている target の camera に対する姿勢を表します。camera 座標系と target 座標系はいずれも右手座標系です。camera 座標系の原点はカメラの光心で、x 軸正方向は右、y 軸正方向は上、z 軸正方向は光がカメラに入る方向(画面の外側)です。(ここでの右と上は camera 画像内の右と上を指し、デバイスの自然方向とは異なる場合があります。)データの並びは row-major で、OpenGL の column-major とは逆です。
pose は次のように書けます。
3D engine が他の座標軸定義を採用している場合、3D engine で transform 行列を設定するときに考慮する必要があります。たとえば camera 座標系と target 座標系の z 方向がどちらも反対の場合、3D engine の target ノード transform 行列値は次のように設定します。
Motion tracking の transform
surface tracking(SurfaceTracker)の transform、および motion tracking(MotionTrackerCameraDevice)、ARKit(ARKitCameraDevice)、ARCore(ARCoreCameraDevice)の cameraTransform は、ワールド座標系に対する camera の transform を表します。camera 座標系とワールド座標系はいずれも右手座標系です。camera 座標系の原点はカメラの光心で、x 軸正方向は右、y 軸正方向は上、z 軸正方向は光がカメラに入る方向(画面の外側)です。(ここでの右と上は、モバイルデバイスではデバイスの自然方向の右と上を指します。)ワールド座標系の y 軸は上向き(重力方向と反対)で、原点は motion tracking システムによって決まります。データの並びは row-major で、OpenGL の column-major とは逆です。
Sparse spatial map と Mega の pose
sparse spatial map SparseSpatialMap の getMapPose と Mega の pose は、camera 座標系内における map block の位置と姿勢を表します。camera 座標系と map block 座標系はいずれも右手座標系です。camera 座標系の原点はカメラの光心で、x 軸正方向は右、y 軸正方向は上、z 軸正方向は光がカメラに入る方向(画面の外側)です。(ここでの右と上は、モバイルデバイスではデバイスの自然方向の右と上を指します。)map block 座標系の y 軸は上向き(重力方向と反対)で、原点は map block データによって決まります。データの並びは row-major で、OpenGL の column-major とは逆です。