Table of Contents

Sistema de coordenadas do EasyAR

Em programas 3D, a definição do sistema de coordenadas é crucial. Sem indicação em contrário, adotam-se as seguintes convenções.

  • Vetores são vetores coluna.
  • Matrizes seguem a ordem row-major. (OpenGL usa column-major)
  • Sistemas de coordenadas seguem a regra da mão direita. (coincidente com OpenGL)
  • Se houver escala física, a unidade é o metro.
  • No sistema de coordenadas mundial, o eixo Y aponta na direção oposta à gravidade.
  • iOS tem orientação retrato como padrão. (Coincidente com as definições de IMU do Android e iOS)

Pose de rastreamento de objetos

A pose do objeto para rastreamento de imagem plana (ImageTracker) e rastreamento 3D de objetos (ObjectTracker) está armazenada em pose. Ela representa a pose do target atualmente rastreado em relação à câmera. Os sistemas de coordenadas da câmera e do target são sistemas de mão direita. A origem do sistema da câmera está no centro óptico, com o eixo X positivo para a direita, Y positivo para cima e Z positivo na direção da luz entrando na câmera (saindo da tela). (Direita e cima referem-se à imagem da câmera, podendo diferir da orientação natural do dispositivo.) Os dados são organizados em row-major, oposto ao column-major do OpenGL.

A pose pode ser expressa como:

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

Se um motor 3D usar outra definição de eixos, é necessário considerar isso ao configurar a matriz de transformação. Por exemplo, se ambos os sistemas (câmera e target) tiverem a direção Z invertida, a matriz de transformação do nó do target no motor 3D deve ser:

\[ \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 de rastreamento de movimento

O transform do rastreamento de superfície (SurfaceTracker) e o cameraTransform do rastreamento de movimento (MotionTrackerCameraDevice), ARKit (ARKitCameraDevice), ARCore (ARCoreCameraDevice) representam a transformação da câmera em relação ao sistema de coordenadas mundial. Os sistemas de coordenadas da câmera e mundial são sistemas de mão direita. A origem do sistema da câmera está no centro óptico, com X positivo para a direita, Y positivo para cima e Z positivo na direção da luz entrando na câmera (saindo da tela). (Direita e cima referem-se à orientação natural do dispositivo em dispositivos móveis.) O sistema mundial tem o eixo Y para cima (oposto à gravidade), com origem definida pelo sistema de rastreamento de movimento. Os dados são organizados em row-major, oposto ao column-major do OpenGL.

Pose em mapas espaciais esparsos e Mega

A getMapPose de mapas espaciais esparsos (SparseSpatialMap) e a pose no Mega representam a posição e orientação de um bloco do mapa no sistema de coordenadas da câmera. Os sistemas de coordenadas da câmera e do bloco do mapa são sistemas de mão direita. A origem do sistema da câmera está no centro óptico, com X positivo para a direita, Y positivo para cima e Z positivo na direção da luz entrando na câmera (saindo da tela). (Direita e cima referem-se à orientação natural do dispositivo em dispositivos móveis.) O sistema do bloco do mapa tem o eixo Y para cima (oposto à gravidade), com origem definida pelos dados do bloco. Os dados são organizados em row-major, oposto ao column-major do OpenGL.