Pregunta

Estoy trabajando en un problema de visión por ordenador que requiere la prestación de un modelo 3D utilizando una cámara calibrada. Estoy escribiendo una función que rompe la matriz de cámara calibrada en una matriz modelview y una matriz de proyección, pero me he encontrado con un fenómeno interesante en OpenGL que desafía la explicación (al menos por mí).

La descripción breve es que la negación de los resultados de la matriz de proyección en nada está representando (al menos en mi experiencia). Yo esperaría que la multiplicación de la matriz de proyección por cualquier escalar no tendría ningún efecto, ya que transforma las coordenadas homogéneas, no afectados por la ampliación.

A continuación se muestra mi razonamiento por qué me parece que esto es inesperado; tal vez alguien puede señalar que mi razonamiento es defectuoso.

Imagine la siguiente matriz de proyección en perspectiva, que da resultados correctos:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]

Multiplicando esto mediante las coordenadas de la cámara da el clip homogénea coordina:

[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 P, las coordenadas de clip resultantes deben ser negado, pero puesto que son coordenadas homogéneas, multiplicando por cualquier escalar (por ejemplo, -1) no deben tener ningún efecto sobre las coordenadas de dispositivos normalizados resultantes. Sin embargo, en OpenGL, lo que anula los resultados de P en nada que se queden. Puedo multiplicar P por cualquier escalar no negativo y obtener exactamente los mismos resultados prestados, pero tan pronto como se multiplico por un escalar negativo, nada renders. Lo que está pasando aquí ??

Gracias!

¿Fue útil?

Solución

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

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

Otros consejos

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 coordenadas de los vértices y coordenadas q textura negativos. OpenGL podría no recortar tales coordenadas correctamente y podría hacer errores de interpolación al sombrear primitivas definidas por dichas coordenadas.

La inversión de la matriz de proyección dará como resultado negativo W recorte de coordenadas, y al parecer OpenGL no le gusta esto. Pero, ¿puede alguien explicar ¿Por qué OpenGL no maneja este caso?

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

Las razones que se me ocurren:

  • invirtiendo la matriz de proyección, las coordenadas ya no estarán dentro de sus planos zNear y zFar de la vista de tronco de cono (necesariamente mayor que 0).
  • Para crear coordenadas de la ventana, las coordenadas de dispositivos normalizados se traducen / escalado por la ventana. Por lo tanto, si usted ha utilizado un escalar negativo para las coordenadas del clip, las coordenadas de dispositivos normalizados (ahora invertidas) traducen la ventana de coordenadas de la ventana, los cuales ... fuera de la ventana (a la izquierda y abajo, si se quiere)

Además, ya que ha mencionado el uso de una matriz de cámara y que ha invertido la matriz de proyección, tengo que preguntar ... a matrices que están solicitando que lo de la matriz de la cámara? Operando en la matriz de proyección guardar cerca / lejos / fovy / aspecto provoca todo tipo de problemas en el tampón de profundidad incluyendo cualquier cosa que utiliza z (pruebas de profundidad, la cara sacrificio, etc).

La sección de preguntas frecuentes en OpenGL transformaciones tiene un poco más de detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top