Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica, Transformaciones y Coordenadas Homogeneas

Y el Secreto de la Cuarta Dimensión

En la entrada anterior vimos lo que son las matrices y su importancia en la Programación Gráfica, así como la manera de escribirlas y multiplicarlas. Esta vez vamos a ver como se hace para meter una o varias transformaciones geométricas en ellas. Pero antes de empezar hay que explicar algo muy importante sobre estas 2 matrices en particular. La verdadera razón de porqué miden 4 por 4 y 4 por 1.

La verdadera razón por la que las matrices miden 4 por 4 es porque en realidad estamos trabajando en 4 dimensiones. Este sistema se denomina Sistema de Coordenadas Homogeneas y es necesario para poder integrar la traslación con la rotación y escala. El fundamento matemático de las coordenadas homogeneas es digno de un argumento de película de ciencia ficcion con todo y viajes por el hiperespacio y la existencia de universos paralelos. El sistema es mucho mas facil de entender cuando se trabaja en el plano (3 dimensiones en coordenadas homogeneas) En tal sistema el mismo punto existe de manera simultanea en una infinidad de planos paralelos de tal manera que todos están alineados por una linea que pasa por el origen. Todos estos planos son perpendiculares a su vez al vector que representa la dimensión extra. De momento lo único que necesitamos saber sobre las coordenadas homogeneas es que nos permiten manejar cualquier tipo de transformación en una matriz de 4 por 4. Además que por la forma como las computadoras trabajan, es mucho mas rápido tener acceso a estructuras de datos cuyo espacio en memoria sea una potencia de dos. Solo para que estén prevenidos, la dimensión extra en una matriz de coordenadas homogeneas es representada por el último renglón. Y aunque no vamos a necesitar cambiar de espacio, la componente hiperespacial (este no es un chiste geek, el término hiperespacio realmente existe en los libros de matemáticas y se usa para referirse al espacio de 4 dimensiones) suele nombrarse simplemente como W y si no quieren meterse en lios mantengan siempre ese valor W igual a 1.

En el primer par de imágenes que acompaña esta entrada se muestran todas las matrices de transformación geométrica que hemos visto hasta ahora mas unas pocas que aunque no son comunes pueden resultar útiles. Otras tantas son de interés mas bien matemático, por lo que aunque no se aplican directamente siguen siendo necesarias en la programación grafica. Ahora veamos la explicación de cada una.

Matriz Identidad

La Matriz Identidad es neutral. Tiene unos en su diagonal y ceros en todos los demás espacios. Cualquier matriz que sea multiplicada por la Identidad permanece sin cambio. Para nosotros, una matriz identidad es como una hoja en blanco o un disco recién formateado y listo para guardar nuestra información. Cuando queramos iniciar una cadena de transformaciones siempre iniciamos con una Matriz Identidad.

Matriz de Traslación

Esta matriz suma a cada una de las componentes vectoriales los valores indicados por Tx, Ty y Tz. Nótese que si no tuviéramos una matriz de 4 por 4 hacer este cálculo con matrices resultaría imposible. Tampoco afecta la componente hiperespacial W.

Matriz de Rotación

Esta es la matriz que implementa los cálculos de rotación vectorial en el plano. La del ejemplo hace la rotación en el plano Z = 0 (tengo que explicar las matemáticas de los planos en el espacio). Si recuerdan lo dicho al principio, cada renglón de las matrices representa una dimensión del espacio. En este caso el renglón correspondiente a Z permanece igual que el de la matriz identidad y si se fijan tanto en sentido vertical solo hay ceros. Esta es la clave para hacer rotaciones en cualquiera de los otros ejes. Tan solo hay que elegir el eje de rotación, tomar el renglón correspondiente en la matriz identidad, poner ceros en sentido vertical y horizontal usando como centro el 1. (como si fuera una cruz) y acomodar los términos trigonométricos en los 4 espacios que queden en los renglones correspondientes a las 3 primeras dimensiones. De momento traten de no meterse con la dimensión W.

Matriz de Escala

La Matriz de Escala tiene en la diagonal principal los factores en los que los vectores se van a escalar en cada uno de sus componentes. Si queremos hacer un escalamiento uniforme en las 3 dimensiones los valores de los 3 primeros renglones deben de ser iguales. Tengan cuidado de no escalar la dimensión W porque pueden terminar con un vector proveniente de un universo paralelo que no les va a servir en los cálculos de nuestro espacio 3D de todos los dias.

Matriz Espejo
(no representada)

La matriz espejo voltea las figuras de la misma manera como un espejo crea un reflejo simétrico de quien se para frente a él. Su uso mas importante es el de ayudar en la transformación de Coordenadas de Vista a Coordenadas de Dispositivo pero puede usarse siempre que necesitemos invertir la dirección de un eje. Para voltear con respecto a un eje basta con tomar la matriz identidad y multiplicar por -1 los unos correspondientes al renglón en cuya dimensión querramos hacer el efecto del espejo. Puede ser en mas de una dimensión. En realidad la matriz espejo es una matriz escala, cuando escalamos una imagen vectorial por un factor de -1 estamos haciendo la misma operación que la matriz espejo

Matriz de Sesgo o Shear
(no representada)

Esta es la mas extraña de las matrices básicas de transformación geométrica. La única aplicación que he encontrado para esta transformación sirve para ajustar Coordenadas de Vista. De todos modos puede que la necesiten para cálculos mas avanzados que veremos en detalle en una entrada futura. Esta matriz puede ser paralela a alguno de los ejes.

Composición de Transformaciones

Como ya se dijo desde la entrada pasada, las matrices pueden contener no solo una sino una larga serie de transformaciones geométricas que a la hora de aplicarse a un vector el efecto es el mismo que si aplicáramos cada una de esas transformaciones en el mismo orden en que las guardamos en la matriz. También sabemos que esta concatenación y aplicación de transformaciones se da por medio de la multiplicación de matrices. Lo que no sabemos es exactamente como se hace esto ni mucho menos como se representa. En estas entradas por convención se ha decidido que los vectores se representan como matrices columna de 4 renglones por 1 columna que se post-multiplican por las matrices de transformación. Aunque hay algunos libros sobre gráficas por computadora que premultiplican usando matrices de 1 por 4. Como en la multiplicación de matrices el orden de los factores si altera el producto se le llama premultiplicar a multiplicar a la izquierda y postmultiplicar a multiplicar hacia a la derecha. En estas notas se usan vectores columna para representar puntos y vectores y las matrices se concatenan multiplicándolas por la izquierda. Espero que la última imagen deje estos conceptos lo bastante claros.

Para terminar esta nota me queda escribir el modo como se representan las matrices en forma simbólica. Ya saben que la matriz se representa por una letra mayúscula y que cada uno de sus elementos se escribe con esa misma letra en minúscula seguida de los subíndices que representan renglón y columna. En escritos como este, así como en muchos otros libros sobre gráficas por computadora se suelen escribir las matrices de transformación seguidas de un grupo de argumentos entre paréntesis y separados por comas como se hace en funciones de lenguajes como C/C++. Por ejemplo una matriz de traslación puede escribirse T(tx,ty,tz) o una de rotación como R(angulo). Cuando se multiplican dos matrices algunos libros solo escriben las letras mayúsculas juntas y otros las separan con un punto. Cuando se concatenan transformaciones se multiplican las matrices por la izquierda (premultiplicación). Digamos que queremos trasladar al origen, rotar, escalar y regresar un punto P de una imagen mas grande. La operación se vería así:
T(Tx,Ty,Tz).S(factor).R(angulo).T(-Tx,-Ty,-Tz).P

Otra cosa que vale la pena mencionar es que cuando se saca la inversa de una cadena de transformaciones estas no solo cambian por sus “gemelas malignas” sino que también se invierte el orden en que se multiplican. Veremos eso mas adelante cuando veamos como se hacen transformaciones espaciales mas avanzadas. De momento en las próximas notas veremos como se manejan los objetos en el espacio y algunas sencillas pero muy valiosas herramientas matemáticas usadas en la programación de videojuegos 3D. Ya no hago mas advertencias sobre números porque estoy seguro de que para este nivel los que se asustan con eso ya dejaron de leer estas lineas. Solo les recuerdo que si tienen dudas recuerden la primera ley del programador de videojuegos que es un programador de videojuegos no le teme a las matemáticas.

octubre 26, 2011 - Posted by | Uncategorized | , ,

3 comentarios »

  1. Mmmm, no he entendido lo de alterar el orden de multiplicaciones de matrices concatenadas…

    Donde tu has dicho:

    “Digamos que queremos trasladar al origen, rotar, escalar y regresar un punto P de una imagen mas grande. La operación se vería así:
    T(Tx,Ty,Tz).S(factor).R(angulo).T(-Tx,-Ty,-Tz).P ”

    No sería esto? .T(-Tx,-Ty,-Tz).R(angulo).S(factor).T(Tx,Ty,Tz).P

    Y si me equivoco, pues a ver si me puedes aclarar el por qué se hace a la inversa xD

    Comentario por JuDelCo | julio 21, 2012 | Responder

    • Dependiendo de si los vectores se escriben como renglones o como columnas el orden de las multiplicaciones se puede invertir. En estas entradas uso vectores columna y las multiplicaciones se hacen de Derecha a Izquierda. Este orden se llama PRE-Multiplicar. Si usaras vectores renglon o traspusieras las matrices de transformacion podrias hacerlo de izquierda a Derecha o POST-Multiplicar. Ambas maneras funcionan mientras no te confundas. Otro motivo por el que las matrices se premultiplican es porque es mas facil de entender a la hora de multiplicar matrices llamando funciones ya sea con OpenGL o con tus propias funciones. Yo lo dejo asi porque asi es como lo manejan casi todos los textos, y digo casi todos porque hay unos pocos donde se postmultiplican

      Comentario por asm86 | julio 21, 2012 | Responder

      • Resumiendo: tiene que ver según la forma en la que dibujes los vectores de 4 casillas. Si los dibujas en vertical (1 columna) entonces multiplicas las matrices de derecha a izquierda (y por ultimo el vector ?). Si los dibujas horizontales (4 columnas) multiplicas las matrices de izq a derecha y ya luego multiplicas el vector por la matriz resultante.

        De acuerdo pues :)

        Comentario por JuDelCo | julio 22, 2012


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: