Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica y el Cambio de Sistemas de Coordenadas

–Transformaciones Inversas y Modelado–

Sin exagerar, uno de los conocimientos mas importantes que debe de tener cualquiera que se interese por programar juegos 3D es saber transformar imágenes vectoriales de un espacio tridimensional a otro. Algunas de las muchas aplicaciones que tiene esto son el manejo de cámaras múltiples, la construcción de objetos compuestos de muchas partes móviles (conocido como modelado jerárquico), y otras tantas que no terminaría de mencionarles. Lo mas importante para nosotros es que por fin vamos a poder manejar diferentes espacios además del viejo sistema de coordenadas mundiales. En la primera imagen vemos 3 sistemas diferentes de coordenadas y un punto. Ese punto rojo aunque es uno solo tiene diferentes coordenadas dependiendo de que sistema de coordenadas tomemos como base. Primero veamos como manejaríamos esta situación en términos tradicionales.

Con lo que sabemos hasta ahora, cada vez que quisiéramos transformar las coordenadas de uno de estos subsistemas tendríamos que trasladar el origen de modo que coincidiera con el origen del sistema de Coordenadas Mundiales, luego lo rotaríamos y escalaríamos de manera que coincidieran ambos. Todas esas operaciones las concatenaríamos en una sola matriz y luego de una buena cantidad de cálculos impredecibles que si son listos involucrarán raices cuadradas, divisiones y funciones trigonométricas (y si no son listos también funciones trigonométricas inversas). No me hace falta poner un ejemplo de esto porque lo mas seguro es que ya hayan tratado de hacer esto y si no hay muchos ejemplos en libros y tutoriales de internet. Así que voy a pasar al modo directo de transformar sistemas, pero antes veamos un poco de esas ahora ya no tan temibles matemáticas.

Matrices y Transformaciones Inversas

Como hemos visto hasta ahora, existen transformaciones geométricas que podemos aplicar a nuestros objetos 3D como la traslación, rotación y escala. Sabemos también que podemos generar una secuencia de transformaciones tan extensa como queramos y la podemos almacenar en una sola matriz. Que existen matrices que no hacen nada llamadas matrices de identidad y que esas matrices las usamos para transformar puntos y vectores en el espacio. Lo que hasta ahora no hemos visto es que por cada matriz capaz de aplicar una transformación, existe una gemela maligna capaz de revertirla. Dichas matrices son conocidas como Matrices Inversas y se representan por una letra mayúscula que tiene un exponente -1. Así la inversa de la matriz M es (en notación ascii) M ^(-1). Se sabe que una matriz es la inversa de la otra porque al multiplicarlas en cualquier orden dan como resultado una matriz identidad que solo tiene unos en su diagonal y ceros en el resto de sus partes. No es muy dificil imaginarse cuales son las matrices inversas para la escala y traslación. Pues la de escala Tx, Ty y Tz se sustituyen por -Tx, -Ty y -Tz. Mientras que en la de escala se cambian los factores Sx, Sy y Sz por sus recíprocos 1/Sx, 1/Sy y 1/Sz. La que es verdaderamente dificil de entender es la inversa de la rotación. Por suerte las matrices ortonormales cuentan con una propiedad sin la cual la programación gráfica habría resultado casi imposible: En las matrices ortonormales la inversa es la traspuesta.

Primero veamos que demonios es una matriz traspuesta. Para trasponer una matriz lo que hacemos es separarla por renglones y luego reacomodarlos en columnas verticales tal y como se muestra en la segunda imagen. Esta operación tan engañosamente sencilla esconde el secreto de la inversa de la rotación. Si recuerdan, una matriz ortogonal es la que representa un conjunto de vectores que tienen una longitud de una unidad (por eso lo de “normales”) y hay un ángulo recto de 90 grados entre cualquier par de ellos (de ahí lo del “orto”). En las matrices que hemos manejado hasta ahora cada renglón representa un vector dimensional pero tras aplicarles la trasposición estos vectores pasan a ser las columnas. Podemos obtener mucha información del sistema coordenado que representa una matriz por medio de su determinate. Pero por ahora lo que nos interesa es ver como obtener las rotaciones inversas. Si escriben la matriz básica de rotación que usa el eje Z como eje y la multiplican por su traspuesta el resultado va a ser una matriz identidad. Sin importar si usan el eje Z o cualquier otro solo van a obtener 3 tipos de resultados:
La identidad trigonométrica fundamental
Sen(angulo) ^ 2 + Cos(angulo) ^ 2 = 1
sen(angulo) * cos(angulo) – sen(angulo) * cos(angulo) = 0
0

En resumen, no importa el ángulo en que giremos, si el sistema está compuesto por una base de vectores ortonormales bastará con trasponer la matriz para obtener su inversa. Si los sistemas ortogonales no tuvieran esta propiedad tendríamos que obtener la inversa por el método de Gauss-Jordan. Que consiste en sumar y multiplicar renglones que viene en cualquier libro de álgebra lineal escolar. Proceso que no solo es tardado e impredecible sino que tiene unas pérdidas de precisión demasiado grandes para ser manejados con valores flotantes de precisión sencilla o incluso de precisión doble. Sin mencionar que frecuentemente dan errores de división entre cero.

Pues bien, si queremos hacer una transformación como un cambio de sistema de coordenadas lo primero que tenemos que hacer es definir un sistema de coordenadas que aunque diferente comparte el mismo sistema de Coordenadas Mundiales. En la tercera imagen vemos la nave de los ejemplos anteriores en el plano Z = 0. En la siguiente la hemos rotado y trasladado de modo que quede horizontal sobre el plano XZ (lo que desde donde estamos sería el suelo. Y la nariz queda apuntando en dirección al eje Z. Su centro ahora corresponde con el origen. En la siguiente imagen (la que tiene el triángulo azul apuntando hacia abajo) se muestra la nave en la posición antes descrita que de paso coincide con sus coordenadas de modelado. Veamos ahora como se separan estos dos sistemas.

Coordenadas de Modelado

Los mundos 3D no se diseñan de una sola pieza sino que son una composición de muchas piezas en diferentes posiciones. Piensen en un tablero de ajedrez en el que las fichas no solo tienen formas diferentes sino que pueden cambiar de posición a lo largo del juego. Para poder generar cualquier tipo de escena es necesario contar con un conjunto de modelos básicos que se acomodan en su lugar por medio de una serie de transformaciones geométricas concatenadas en una matriz. Siguiendo con el ejemplo del ajedrez, tenemos un modelo para cada tipo diferente de pieza y mediante esas transformaciones acomodamos una instancia de cada una de ellas en el lugar del tablero que le corresponde. Cuando usamos el Sistema de Coordenadas de Modelado, cada modelo de pieza se mantiene en su propio espacio coordenado ajeno al sistema de coordenadas mundiales del mismo modo que un juguete se guarda en su estuche. Por regla general, los modelos se definen en su propio sistema coordenado de modo que su centro de rotación coincida con el origen y su frente quede en dirección al eje Z de su sistema. Tal y como se ve en la imagen de vista superior de nuestra triangular nave. Por cierto, el que una figura exista en el sistema de coordenadas de modelado no significa que tenga que existir en el sistema de coordenadas mundiales. Como por ejemplo un jefe de final de nivel que no va a aparecer hasta que hayamos vencido al resto de los villanos.

Cuando queremos presentar una figura dentro de nuestro mundo 3D lo primero que hacemos es hacer coincidir las coordenadas de modelado con las mundiales, lo que haría que nuestra figura apareciera en el origen de este último. Luego mediante transformaciones de traslación, rotación o escala acomodamos la imagen donde realmente la queremos. Es importante que recuerden que una cosa es el modelo y otra la instancia. En el ejemplo del ajedrez podemos tener muchos peones en el tablero pero solo necesitaremos un modelo original para crearlos a todos. O poniendo un ejemplo mas acorde a los videojuegos, podemos tener un ejército de miles de robots de dos o tres modelos diferentes, solo necesitamos esos dos o tres modelos diferentes para crear con ellos a todo nuestro ejército. Es por eso que deben de entender bien el concepto de Coordenadas de Modelado y saber la diferencia entre este sistema y el de Coordenadas Mundiales.

Esta nota resultó mucho mas extensa de lo que pensé que sería. Voy a tener que continuarla en la entrada siguiente donde veremos ejemplos de posicionamiento arbitrario de modelos en nuestro mundo 3D. De momento solo puedo adelantarles que existe un método que puede transformar entre coordenadas mundiales y de modelado con tan solo una traspuesta de una matriz y que para hacer esto es necesario conocer el producto vectorial. Poco después de esto vamos a hacer una muy ligera pero significativa modificación a nuestra nave para hacerla verdaderamente 3D y cuando terminemos con todo ello (no mas de 2 o 3 entradas) ahora si entaremos de lleno a lo que es la proyección de imágenes en 3D.

Anuncios

noviembre 12, 2011 - Posted by | Uncategorized | , ,

Aún no hay comentarios.

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: