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 相反。