Table of Contents

EasyAR 좌표계

3D 프로그램에서 좌표계의 정의는 매우 중요합니다. 별도로 설명하지 않는 경우 다음 규칙을 사용합니다.

  • 벡터는 모두 열 벡터입니다.

  • 행렬은 모두 row-major를 사용합니다. (OpenGL은 column-major)

  • 좌표계는 모두 오른손 좌표계를 사용합니다. (OpenGL과 일치)

  • 좌표계에 물리적 척도가 있으면 단위는 미터입니다.

  • 월드 좌표계의 Y축 음의 방향은 중력 방향입니다.

  • 디바이스 좌표계의 X축은 오른쪽, Y축은 위쪽, Z축은 화면 밖을 향합니다. 화면을 회전할 수 있는 디바이스의 경우 오른쪽과 위쪽의 정의는 기본 방향을 기준으로 합니다. 특히 Android의 기본 방향은 시스템 정의를 따릅니다. (안경과 일부 태블릿은 가로 배치가 기본 방향이고, 휴대폰과 일부 태블릿은 세로 배치가 기본 방향입니다.) iOS의 기본 방향은 세로 배치입니다. (Android 및 iOS IMU 문서의 정의와 일치)

Object tracking의 pose

평면 이미지 tracking(ImageTracker)과 3D object tracking(ObjectTracker)의 객체 pose는 pose에 저장되며, 현재 tracking 중인 target이 camera에 대해 가지는 자세를 나타냅니다. camera 좌표계와 target 좌표계는 모두 오른손 좌표계입니다. camera 좌표계의 원점은 카메라 광심이고, x축 양의 방향은 오른쪽, y축 양의 방향은 위쪽, z축 양의 방향은 빛이 카메라로 들어가는 방향(화면 밖)입니다. (여기서 오른쪽과 위쪽은 camera 이미지에서의 오른쪽과 위쪽을 의미하며, 디바이스의 자연 방향과 다를 수 있습니다.) 데이터 배열 방식은 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 engine이 다른 좌표축 정의를 사용하는 경우, 3D engine에서 transform 행렬을 설정할 때 이를 고려해야 합니다. 예를 들어 camera 좌표계와 target 좌표계의 z 방향이 모두 반대인 경우, 3D engine의 target 노드 transform 행렬 값은 다음과 같이 설정해야 합니다.

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

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 SparseSpatialMapgetMapPose와 Mega의 pose는 camera 좌표계에서 map block의 위치와 자세를 나타냅니다. camera 좌표계와 map block 좌표계는 모두 오른손 좌표계입니다. camera 좌표계의 원점은 카메라 광심이고, x축 양의 방향은 오른쪽, y축 양의 방향은 위쪽, z축 양의 방향은 빛이 카메라로 들어가는 방향(화면 밖)입니다. (여기서 오른쪽과 위쪽은 모바일 디바이스에서 디바이스 자연 방향의 오른쪽과 위쪽을 의미합니다.) map block 좌표계의 y축은 위쪽(중력 방향의 반대)을 향하며, 원점은 map block 데이터가 결정합니다. 데이터 배열 방식은 row-major이며, OpenGL의 column-major와 반대입니다.