Sistemas de coordenadas do EasyAR
Em programas 3D, a definição dos sistemas de coordenadas é muito importante. Se não houver indicação especial, as convenções a seguir são usadas.
Os vetores são vetores coluna.
As matrizes usam row-major. (OpenGL usa column-major)
Os sistemas de coordenadas usam sistemas de coordenadas de mão direita. (Consistente com OpenGL)
Se um sistema de coordenadas tiver uma escala física, a unidade é metro.
A direção negativa do eixo Y do sistema de coordenadas do mundo é a direção da gravidade.
No sistema de coordenadas do dispositivo, o eixo X aponta para a direita, o eixo Y aponta para cima e o eixo Z aponta para fora da tela. Para dispositivos cuja tela pode girar, as definições de direita e cima são baseadas na orientação padrão. Em particular, a orientação padrão do Android segue a definição do sistema. (A disposição em paisagem é a orientação padrão para óculos e alguns tablets, e a disposição em retrato é a orientação padrão para telefones e alguns tablets.) A orientação padrão do iOS é retrato. (Consistente com as definições na documentação de IMU do Android e iOS)
Pose para object tracking
A pose do objeto em planar image tracking (ImageTracker) e 3D object tracking (ObjectTracker) é armazenada em pose, e representa a pose do target atualmente rastreado em relação à camera. Tanto o sistema de coordenadas da camera quanto o sistema de coordenadas do target são sistemas de mão direita. A origem do sistema de coordenadas da camera é o centro óptico da câmera, a direção positiva do eixo x aponta para a direita, a direção positiva do eixo y aponta para cima, e a direção positiva do eixo z aponta na direção em que a luz entra na câmera (para fora da tela). (Aqui, direita e cima referem-se à direita e cima na imagem da camera, que podem ser diferentes da orientação natural do dispositivo.) O layout dos dados é row-major, oposto ao column-major do OpenGL.
A pose pode ser escrita como:
Se o 3D engine usa outras definições de eixos de coordenadas, isso precisa ser considerado ao configurar a matriz transform no 3D engine. Por exemplo, quando as direções z do sistema de coordenadas da camera e do sistema de coordenadas do target são ambas opostas, o valor da matriz transform do nó target no 3D engine deve ser definido como:
Transform para motion tracking
transform de surface tracking (SurfaceTracker) e cameraTransform de motion tracking (MotionTrackerCameraDevice), ARKit (ARKitCameraDevice) e ARCore (ARCoreCameraDevice) representam o transform da camera em relação ao sistema de coordenadas do mundo. Tanto o sistema de coordenadas da camera quanto o sistema de coordenadas do mundo são sistemas de mão direita. A origem do sistema de coordenadas da camera é o centro óptico da câmera, a direção positiva do eixo x aponta para a direita, a direção positiva do eixo y aponta para cima, e a direção positiva do eixo z aponta na direção em que a luz entra na câmera (para fora da tela). (Aqui, direita e cima em dispositivos móveis referem-se à direita e cima na orientação natural do dispositivo.) O eixo y do sistema de coordenadas do mundo aponta para cima (oposto à gravidade), e a origem é determinada pelo sistema de motion tracking. O layout dos dados é row-major, oposto ao column-major do OpenGL.
Pose em sparse spatial maps e Mega
getMapPose do sparse spatial map SparseSpatialMap e pose no Mega representam a posição e orientação do map block no sistema de coordenadas da camera. Tanto o sistema de coordenadas da camera quanto o sistema de coordenadas do map block são sistemas de mão direita. A origem do sistema de coordenadas da camera é o centro óptico da câmera, a direção positiva do eixo x aponta para a direita, a direção positiva do eixo y aponta para cima, e a direção positiva do eixo z aponta na direção em que a luz entra na câmera (para fora da tela). (Aqui, direita e cima em dispositivos móveis referem-se à direita e cima na orientação natural do dispositivo.) O eixo y do sistema de coordenadas do map block aponta para cima (oposto à gravidade), e a origem é determinada pelos dados do map block. O layout dos dados é row-major, oposto ao column-major do OpenGL.