Table of Contents

Easyar 좌표계

3D 프로그램에서 좌표계 정의는 매우 중요합니다. 별도의 언급이 없는 경우 아래 규칙을 따릅니다.

  • 벡터는 모두 열 벡터(column vector)입니다.
  • 행렬은 모두 row-major 방식을 사용합니다. (OpenGL은 column-major)
  • 좌표계는 모두 오른손 좌표계(right-handed coordinate system)를 사용합니다. (OpenGL과 일치)
  • 좌표계에 물리적 척도가 존재하는 경우, 단위는 미터(meter)를 사용합니다.
  • 세계 좌표계(World coordinate system)의 Y축 음의 방향이 중력 방향입니다.
  • 장치 좌표계(Device coordinate system)의 X축은 오른쪽, Y축은 위쪽, Z축은 화면 밖으로 향합니다. 화면 회전이 가능한 장치의 경우, 오른쪽과 위쪽의 정의는 기본 방향을 따릅니다. 특히, Android의 기본 방향은 시스템 정의를 따릅니다. (안경 및 일부 태블릿의 가로 모드 배치가 기본 방향, 휴대폰 및 일부 태블릿의 세로 모드 배치가 기본 방향). iOS의 기본 방향은 세로 모드 배치입니다. (Android 및 iOS의 IMU 설명에서의 정의와 일치)

물체 추적의 포즈

평면 이미지 추적(ImageTracker)과 3D 물체 추적(ObjectTracker)의 물체 포즈(pose)는 pose에 저장되며, 이는 현재 추적 중인 타겟(target)이 카메라(camera)에 상대적인 위치 및 자세를 나타냅니다. 여기서 카메라 좌표계와 타겟 좌표계 모두 오른손 좌표계입니다. 카메라 좌표계의 원점은 카메라 광학 중심(optical center)이며, X축 양의 방향은 오른쪽, Y축 양의 방향은 위쪽, Z축 양의 방향은 빛이 카메라로 들어오는 방향(화면 밖으로)입니다. (여기서의 오른쪽과 위쪽은 카메라 이미지의 오른쪽과 위쪽을 의미하며, 장치의 자연스러운 방향과 다를 수 있습니다.) 데이터는 row-major 방식으로 배열되며, OpenGL의 column-major 방식과 반대입니다.

포즈는 다음과 같이 쓸 수 있습니다:

\[ 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 엔진에서 변환 행렬(transform matrix)을 설정할 때 이를 고려해야 합니다. 예를 들어, 카메라 좌표계와 타겟 좌표계의 Z 방향이 모두 반대일 경우, 3D 엔진의 타겟 노드(node) 변환 행렬 값은 다음과 같이 설정해야 합니다:

\[ \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) \]

모션 추적의 변환

표면 추적(SurfaceTracker)의 transform과 모션 추적(MotionTrackerCameraDevice), ARKit(ARKitCameraDevice), ARCore(ARCoreCameraDevice)의 cameraTransform은 카메라의 세계 좌표계(World coordinate system)에 대한 변환을 나타냅니다. 여기서 카메라 좌표계와 세계 좌표계 모두 오른손 좌표계입니다. 카메라 좌표계의 원점은 카메라 광학 중심(optical center)이며, X축 양의 방향은 오른쪽, Y축 양의 방향은 위쪽, Z축 양의 방향은 빛이 카메라로 들어오는 방향(화면 밖으로)입니다. (여기서의 오른쪽과 위쪽은 모바일 장치에서 장치의 자연스러운 방향의 오른쪽과 위쪽을 의미합니다.) 세계 좌표계의 Y축은 위쪽(중력 방향과 반대)이며, 원점은 모션 추적 시스템에 의해 결정됩니다. 데이터는 row-major 방식으로 배열되며, OpenGL의 column-major 방식과 반대입니다.

희소 공간 지도와 메가의 포즈

희소 공간 지도(Sparse Spatial Map, SparseSpatialMap)의 getMapPose와 메가(Mega)의 pose는 지도 블록(map block)의 카메라 좌표계 내 위치와 자세를 나타냅니다. 여기서 카메라 좌표계와 지도 블록 좌표계 모두 오른손 좌표계입니다. 카메라 좌표계의 원점은 카메라 광학 중심(optical center)이며, X축 양의 방향은 오른쪽, Y축 양의 방향은 위쪽, Z축 양의 방향은 빛이 카메라로 들어오는 방향(화면 밖으로)입니다. (여기서의 오른쪽과 위쪽은 모바일 장치에서 장치의 자연스러운 방향의 오른쪽과 위쪽을 의미합니다.) 지도 블록 좌표계의 Y축은 위쪽(중력 방향과 반대)이며, 원점은 지도 블록 데이터에 의해 결정됩니다. 데이터는 row-major 방식으로 배열되며, OpenGL의 column-major 방식과 반대입니다.