Estoy trabajando en un problema de visión artificial que requiere renderizar un modelo 3D con una cámara calibrada. Estoy escribiendo una función que rompe la matriz de la cámara calibrada en una matriz de modelos y una matriz de proyección, pero me encontré con un fenómeno interesante en OpenGL que desafía la explicación (al menos por mí).¿Por qué importa el signo en la matriz de proyección opengl?
La breve descripción es que al negar la matriz de proyección no se obtiene nada (al menos en mi experiencia). Yo esperaría que multiplicar la matriz de proyección por cualquier escalar no tendría ningún efecto, porque transforma coordenadas homogéneas, que no se ven afectadas por la escala.
A continuación se detalla mi razonamiento por el cual considero que esto es inesperado; tal vez alguien pueda señalar dónde mi razonamiento es defectuoso.
Imagine la siguiente matriz de proyección en perspectiva, lo que da resultados correctos:
[ a b c 0 ]
P = [ 0 d e 0 ]
[ 0 0 f g ]
[ 0 0 h 0 ]
multiplicando este por coordenadas de la cámara da el clip homogénea coordenadas:
[x_c] [ a b c 0 ] [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c] [ 0 0 f g ] [Z_e]
[w_c] [ 0 0 h 0 ] [W_e]
Por último, de obtener coordenadas normalizadas, dividimos x_c, y_c, y z_c por w_c:
[x_n] [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n] [z_c/w_c]
Ahora, si negamos a P, las coordenadas del clip resultantes deberían ser negadas, pero dado que son coordenadas homogéneas, se multiplican por cualquier escalar (p. -1) no debería tener ningún efecto sobre las coordenadas de dispositivo normalizadas resultantes. Sin embargo, en openGl, al negar P no se obtiene nada. Puedo multiplicar P por cualquier escalar no negativo y obtener exactamente los mismos resultados representados, pero tan pronto como multiplique por un escalar negativo, no se renderiza nada. ¿¿Que esta pasando aqui??
Gracias!
¡Buena respuesta! Supuse que la prueba de recorte sería: -1