Formato interno de las matrices en OpenGL
Desde los inicios de OpenGL existe una confusión bastante importante sobre cómo administra internamente las matrices. Unos piensan que las almacena en formato fila y otros piensan que lo hace en formato columna. Pues lo cierto es que ni una cosa ni la otra!
OpenGL almacena las matrices en un array unidimensional de 16 elementos y es el programador quien decide cómo prefiere interpretarlas.
Quedará más claro con un ejemplo:
1 2 | GLfloat m[16]; glGetFloatv(GL_MODELVIEW_MATRIX, m); |
Con el código anterior leemos la matriz actual MODELVIEW y la almacenamos en el array m.
¿Y cómo están estructurados los elementos de la matriz? Pues muy sencillo, secuencialmente:
Ahora el programador puede decidir interpretarlo como una matriz de tipo columna:
O como una matriz de tipo fila:
Matemáticamente es indiferente cómo prefieras interpretarlas, pero recuerda que si utilizas el formato columna debes realizar post-multiplicaciones, y si usas el formato fila pre-multiplicaciones.
Supongamos que tienes una matriz que representa una rotación y la matriz
que realiza una traslación, y quieres combinarlas en una matriz
, de forma que la matriz de trasformación resultante realice primero la rotación y luego la traslación. Si usas el formato fila tendrás que hacer una pre-multiplicación:
(Esto se lee: la matriz R pre-multiplica a la matriz T).
Pero si usas el formato columna el orden se invierte ya que es una post-multiplicación: (Y esto se lee: la matriz R post-multiplica a la matriz T).
Otro ejemplo; quieres transformar el vector por la matriz
para obtener el vector transformado
.
Si la matriz es de tipo fila pre-multiplicas:
En cambio, si es de tipo columna post-multiplicas:
En algebra matricial siempre se multiplican filas por columnas, por lo tanto si la matriz es de tipo fila
y
deben ser interpretados como un vectores fila, y si
es de tipo columna entonces
y
deberán ser interpretados como vectores columna.
Un último ejemplo; transforma el vector por las matrices
(en éste orden).
La pre-multiplicación sigue el orden natural de las transformaciones por lo que resulta más intuitiva:
La post-multiplicación sería el proceso inverso:
Para terminar un truco para no liarte; cuando utilices matrices y vectores columna (post-multiplicación) debes interpretar las transformaciones como series de funciones: