Como sei se uma matriz de perspectiva é um sistema de coordenadas para a direita ou para a esquerda?

7

Por exemplo, se eu definir minha matriz de perspectiva da seguinte maneira:

m[0]  = 1.f / ( aspect * focalLength );
m[5]  = 1.f / focalLength;
m[10] = -zFar / (zFar - zNear);
m[11] = -1;
m[14] = -(zFar*zNear)/(zFar - zNear);

Como posso saber se minha matriz de perspectiva é o sistema de coordenadas para a direita ou para a esquerda?

Athena
fonte

Respostas:

7

Eu acho que você pode dizer a diferença se você tem 1 ou -1 na linha Z (ou coluna, dependendo da orientação da matriz). Em particular:

  • Canhoto: 1
  • Destro: -1

Para uma comparação, consulte os dois links - D3DXMatrixPerspectiveLH e D3DXMatrixPerspectiveRH . Como o DirectX é canhoto, você usaria normalmente a versão para canhotos, que possui 1 na quarta linha da terceira linha.

Por outro lado, o OpenGL e o XNA são destros e posso confirmar que as matrizes de perspectiva que geram usam -1, embora o OpenGL tenha na quarta linha da terceira coluna, enquanto o XNA tem na terceira linha da quarta coluna, como o DirectX (matrizes principais da coluna versus matrizes principais da linha).

David Gouveia
fonte
4
Na verdade, não é correto descrever a API como tendo uma entrega específica; a mão comumente atribuída a cada um é mais uma convenção histórica do que qualquer outra coisa hoje em dia, e cada um é perfeitamente capaz de apoiar a outra mão se necessário / desejado. Algumas notas do OpenGL: opengl.org/resources/faq/technical/transformations.htm (9.150).
Maximus Minimus
@ mh01 Certamente, a conversão entre sistemas de coordenadas para destros e canhotos pode ser tão fácil quanto aplicar uma transformação de escala (1,1, -1) antes de tudo. Mas é mais sensato jogar com as convenções de cada API do que ter que fazer a conversão você mesmo.
David Gouveia
2
Quanto ao D3D, ele explicitamente não especifica nenhuma convenção e possui as versões -RH e -LH de todas as suas funções da matriz de projeção desde pelo menos D3D8. Em relação a RM vs CM - o D3D realmente usa CM internamente e a matriz deve ser transposta ao enviá-la ao shader. O D3D9 fará isso automaticamente para você; em 10 e 11 você deve fazer isso sozinho. No entanto, concordamos que, se você estiver seguindo um código de amostra, é mais provável que você use convenções estabelecidas, portanto será mais claro se você as seguir.
Maximus Minimus