2010-02-18 6 views
13

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!

Respuesta

10

Bueno, el quid de la cuestión es que las pruebas de recorte se realiza a través de:

-w_c < x_c < w_c 
-w_c < y_c < w_c 
-w_c < z_c < w_c 

Multiplicando por que se rompe un valor negativo de esta prueba.

+1

¡Buena respuesta! Supuse que la prueba de recorte sería: -1

2

Acabo de encontrar este dato, lo que hace que el progreso hacia una respuesta:

De Libro rojo, Apéndice G:

Evitar el uso negativo w vértices de coordenadas y las coordenadas q textura negativos. Es posible que OpenGL no recorta dichas coordenadas correctamente y pueda cometer errores de interpolación al sombrear las primitivas definidas por dichas coordenadas.

Invertir la matriz de proyección dará como resultado W coordenada de recorte negativo, y aparentemente opengl no le gusta esto. Pero, ¿alguien puede explicar por qué opengl no maneja este caso?

referencia: http://glprogramming.com/red/appendixg.html

0

razones que se me ocurren:

  • invirtiendo la matriz de proyección, las coordenadas ya no estarán dentro de sus aviones y zNear zFar de la vista de cono truncado (necesariamente mayor que 0).
  • Para crear coordenadas de ventana, las coordenadas del dispositivo normalizado son traducidas/escaladas por la ventana gráfica. Entonces, si ha usado un escalar negativo para las coordenadas del clip, las coordenadas del dispositivo normalizado (ahora invertido) traducen la ventana gráfica a las coordenadas de la ventana que están ... fuera de su ventana (a la izquierda y debajo, si lo prefiere)

Además, como mencionaste usando una matriz de cámara y que has invertido la matriz de proyección, tengo que preguntar ... ¿a qué matrices estás aplicando qué desde la matriz de la cámara? Operar en la matriz de proyección save near/far/fovy/aspect causa todo tipo de problemas en el búfer de profundidad, incluido todo lo que utiliza z (pruebas de profundidad, eliminación de caras, etc.).

La sección de preguntas frecuentes de OpenGL en transformations tiene más detalles.

+0

Después de convertir de coordenadas homogéneas a no homogéneas (es decir, dividiendo por w_c), las coordenadas aún caen entre zNear y zFar,, porque el signo negativo de w_c cancela el signo invertido de {x, y, z} _c. así que creo que esto no es todo. Por la misma razón, las coordenadas del dispositivo normalizado tampoco están invertidas. Solo estoy usando la matriz de proyección para los parámetros intrínsecos de la cámara (fovy, aspecto, inclinación del eje, etc.); los parámetros extrínsecos van a la matriz modelview. Entonces creo que este no es el problema tampoco. –

+0

No conozco los detalles de implementación del controlador, pero supongo que en realidad no es el caso de zNear y zFar. La prueba de clip probablemente no sea de rango sino de profundidad y, por lo tanto, se prueba que el valor numérico es mayor que zNear (ya que es el requisito positivo en primer lugar). Si todo el sistema de coordenadas y la matriz se invierten, la prueba falla, como señaló Bahbar. – charstar

Cuestiones relacionadas