2010-12-05 14 views
11

Mi pregunta simplemente es: ¿cuál es el formato correcto para la matriz de Proyección y ModelView?¿Corregir el formato de matriz OpenGL?

Me han dicho que las siguientes matrices de ejemplo están transpuestas y no están construidas como deberían ser las matrices OpenGL.

ModelView Matrix 
{(1, 0, 0, 0) 
(0, 0.7071068, 0.7071068, 0) 
(0, -0.7071068, 0.7071068, 0) 
(0, -141.4214, -141.4214, 1)} 

Projection Matrix 
{(1.931371, 0, 0, 0) 
(0, 2.414213, 0, 0) 
(0, 0, -1.0002, -1) 
(0, 0, -2.0002, 0)} 

Respuesta

23

Editar: esta respuesta se encuentra en grave necesidad de una actualización. A saber, no hay consideración acerca de los sombreadores.

Como @gman señala en los comentarios, ya sea para usar row-major o column-major depende de cómo hagas tus cálculos. Puedes elegir uno u otro (o incluso ambos en diferentes momentos si no crees que sea confuso), siempre y cuando coincidan con tus sistemas de coordenadas y el orden de las operaciones.

Dejo esta respuesta como wiki de la comunidad en caso de que alguien tenga el tiempo y desee actualizarlo.


OpenGL especifica matrices como una matriz unidimensional enumerados en orden de columnas-mayor, es decir, con elementos ordenados como esto:

m0 m4 m8 m12 
m1 m5 m9 m13 
m2 m6 m10 m14 
m3 m7 m11 m15 

Así que si inicializar una matriz de esta manera, en C o prácticamente en cualquier otro idioma, la matriz resultante parecerá que necesita transposición, porque el código C lee de izquierda a derecha primero y luego de arriba a abajo (en otras palabras, como si estuviera en orden de fila mayor):

int mat[16] = { 
    0, 1, 2, 3, 
    4, 5, 6, 7, 
    8, 9, 10, 11, 
    12, 13, 14, 15, 
} 

Por cierto, OpenGL tiene glLoadTransposeMatrix y glMultTransposeMatrix, que puede usar en lugar de glLoadMatrix y glMultMatrix, por lo que esto no debería ser un problema.

+0

Entonces, ¿cómo puedo saber si las matrices de mi pregunta están en orden principal de columna o fila? –

+0

La matriz de vista de modelo tiene elementos distintos de cero en la última fila, mientras que la última columna dice (0, 0, 0, 1). Esto significa que está en orden principal. (Según http://www.songho.ca/opengl/gl_transform.html#modelview) – Zecc

+0

Mientras tanto, contrasta la matriz de proyección con la de este enlace - http://www.songho.ca/opengl/gl_projectionmatrix.html - Parece que está en orden de columna mayor. Sin embargo, tenga en cuenta que no he pensado mucho en esto. – Zecc

5

Puede utilizar la notación que desee, siempre que sea coherente con el orden de las operaciones de la matriz. Citando https://www.opengl.org/archives/resources/faq/technical/transformations.htm:

9,005 son matrices de OpenGL columna o fila-principal-principal?

Por motivos de programación, las matrices OpenGL son matrices de 16 valores con vectores de base establecidos contiguamente en la memoria. Los componentes de traducción ocupan los elementos 13º, 14º y 15º de la matriz de 16 elementos, donde los índices están numerados del 1 al 16, como se describe en , sección 2.11.2 de la especificación OpenGL 2.1.

Column-major versus row-major es puramente una convención de notación. Obsérvese que que la multiplicación posterior con matrices de columna mayor genera el mismo resultado que multiplica previamente las matrices de fila mayor. La especificación OpenGL y el Manual de referencia OpenGL usan la notación de columna principal . Puedes usar cualquier notación, siempre y cuando esté claramente indicado.

i.e.en un shader puede cargar matrices de transformación como matrices de flotador clasificadas por columnas en un uniforme y pre-multiplican un vértice para transformarla:

gl_Position = Proj * View * Model * vPosition; 

o cargar las mismas matrices como matrices de flotador ordenados por filas y post-multiplicar para lograr el mismo efecto:

gl_Position = vPosition * Model * View * Proj; 

Por la transposición de una matriz a transformar eficazmente que sea almacenado en la no opuesto ción, por lo que OpenGL tiene opciones para transponer matrices a medida que se ingresan.

+0

Esto mira hacia atrás. El primer orden de multiplicaciones se usa para matrices de columnas principales, el segundo para matrices de filas principales. –

+0

Sí, lo siento solucionado. – tmw

Cuestiones relacionadas