2012-03-02 8 views
8

La documentación de OpenGL decir que el gluLookAt() llama debe hacerse sobre la matriz GL_MODELVIEW:gluLookAt() mejor uso, en matriz GL_PROJECTION o en la matriz GL_MODELVIEW

http://www.opengl.org/resources/faq/technical/viewing.htm

De hecho, los documentos enlazar a una artículo que dice que el uso de gluLookAt() en la matriz GL_PROJECTION es extremadamente malo:

Help stamp out GL_PROJECTION abuse

por otro lado, hay una gran cantidad de tutoriales y ejemplos en los que gluLookAt() es i n hecho llamado en la matriz GL_PROJECTION. Y, al mismo tiempo, aunque el artículo mencionado anteriormente dice NO usarlo en la matriz GL_PROJECTION, significa que en la mayoría de estos usos no hay ningún problema visible al hacerlo.

Mi pregunta es: ¿cuál es la mejor manera de utilizar gluLookAt() en proyectos de la vida real? ¿Realmente es un gran no no usarlo en la matriz GL_PROJECTION?

+4

"Por otro lado, hay muchos tutoriales y ejemplos en los que se llama de hecho a gluLookAt() en la matriz GL_PROJECTION". Hay muchos tutoriales GL ejemplos que hacen cosas estúpidas. Esa no es una justificación para hacerlas. De hecho, es una razón más para evitar los tutoriales GL que no usan sombreadores; al menos los tutoriales de sombreado están escritos por personas que saben cosas. –

Respuesta

8

La función gluLookAt() le proporciona una matriz de transformación que transforma la rotación de un objeto en su escena. Así que esto es claramente una transformación de modelo y debe ir a la matriz GL_MODELVIEW.

En cuanto al por qué, esta se vuelve más clara cuando lo hace usted mismo en un vertex shader:

Mientras que la posición de los vértices son de hecho solo v.pos * modelview * projection, es necesaria la matriz modelview sin el componente de proyección para otros cálculos (por ejemplo, iluminación y niebla). Es por eso que la tubería de función fija separa estas dos matrices.

Por lo tanto, debe ajustarse a los paradigmas que se especifican en la API y, especialmente, nunca confíe en una miríada de "tutoriales" de Opengl incorrectos.

+0

El orden de las operaciones al transformar un vértice normalmente es a la inversa: 'proyección * modelview * v.pos' si lo haces de esta manera, tienes que transponer todas las matrices y vectores. – datenwolf

2

No estoy seguro de entender la pregunta. ¿Estás preguntando por qué la página te dice que no hagas algo que solo funciona "la mayoría" de las veces?

Realmente no es tan difícil de entender. "La mayoría de estos usos", por definición, significa que hay algunos tales usos do muestran problemas.

Así que puede hacer lo que a veces funcionará y luego romper otras veces, o puede hacer lo que siempre funcionará.

Esta no es una opción difícil. Aún más porque hacerlo de la manera correcta significa literalmente mover una línea de código en un par de líneas.

1

Mi pregunta es: ¿cuál es la mejor manera de usar gluLookAt() en proyectos de la vida real? ¿Realmente es un gran no no usarlo en la matriz GL_PROJECTION?

Utilice siempre la matriz modelview para posicionar el punto de vista. Esto es incluso en la matriz 'nombre modelo (es decir, colocación de la geometría) y vista (colocación del punto de vista).

La matriz de proyección es una especie de lente de la "cámara" OpenGL. No mueve la lente de su cámara, manteniendo el cuerpo de la cámara en su lugar para establecer la vista, ¿verdad? Mover la lente tiene sus aplicaciones, como implementar efectos de inclinación/desplazamiento.

Cuestiones relacionadas