Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica: Como posicionar objetos 3D

–Uso de Coordenadas de Modelado y Mundiales–

En la entrada anterior sobre cambios de sistemas de coordenadas se discutió como estos se usan para un sinfin de cosas en la programación de juegos 3D. También se mostró que era posible construir una matriz de rotación a partir de un sistema de coordenadas arbitrario formado por 3 vectores ortonormales en el espacio y lo mas importante, que es posible obtener las inversas de las transformaciones geométricas a partir del cálculo de su matriz inversa. En esta entrada vamos a ver como posicionar una figura de sus coordenadas de modelado a un sistema arbitrario en coordenadas mundiales y viceversa. Y a ver una vez mas el como se invierten las transformaciones.

En la primera imagen vemos la situación: Tenemos nuestra nave triangular en su propio sistema de coordenadas de modelado y queremos posicionarla en el espacio de modo que apunte y dispare a un objetivo dados como parámetros las posiciones de la nave y el blanco. El resto de los números se explicarán conforme vayamos haciendo la entrada. Lo que vamos a hacer es usar los puntos dados al principio para construir un sistema de coordenadas.

Como ya hemos visto, cuando hacemos un producto escalar entre un vector cualquiera y los vectores que integran una base ortonormal el resultado es ese vector expresado en términos de los vectores que forman la base. De hecho cuando hacemos una multiplicación matricial entre una matriz de transformación 4×4 y un vector columna 4×1 y los renglones de la matriz 4×4 son esos vectores ortonormales el efecto es ese. La matriz de 4×1 que obtenemos como resultado es el mismo vector V expresados en términos de los vectores renglón de la matriz de 4×4. Si esos puntos los volvemos a graficar en el mismo sistema de coordenadas mundiales el objeto será trasladado al centro del espacio de coordenadas mundiales y se alineará con los vectores que lo forman (ejecutando también una traslación). Este proceso lo hacemos cuando queremos por ejemplo obtener una vista centrada de un objeto o poner el mundo en relación con un punto de vista.

También sabemos de la nota anterior que es posible invertir una matriz de transformación geométrica para hacer que esta haga exactamente lo contrario a lo que hacía antes. Entonces, pregúntense que pasaría si invirtiéramos esa matriz de vectores renglón. El efecto sería colocar cualquier imagen centrada en el sistema de coordenadas mundiales en cualquier posición y orientación en el espacio. Para hacer las cosas todavía mejores, una matriz que representa una base ortonormal puede invertirse con tan solo calcular su traspuesta (intercambiar los renglones por columnas). Todo esto nos permite hacer las tranformaciones geométricas en ambos sentidos, revertir una transformación haciendo un UNDO y otras cosas mas, pero primero revisemos bien ese asunto de las transformaciones reversibles y las matrices inversas

Como invertir transformaciones geométricas

Como ya saben, es posible encadenar una secuencia de transformaciones geométricas como la traslación, rotación y escala por medio de la multiplicación de matrices y luego aplicar esa matriz ‘concentrada’ a una serie de vértices para aplicarle a un modelo vectorial todas esas transformaciones en una sola operación. Pues bien, si calculamos la inversa de esa matriz de transformación el resultado será ejecutar todas esas transformaciones en sentido inverso. Esto aunque es posible rara vez se hace en la práctica, pues es mucho mas eficiente volver a leer los datos de los vectores originales en lugar de invertir la matriz y aplicar la a todos los vértices. Lo que si sucede con mucha frecuencia es que queremos anular algunas secuencias determinadas de la cadena de transformaciones. Antes de regresar al tema de como posicionar un modelo 3D de manera arbitraria en el espacio debo aclarar dos puntos sobre las transformaciones geométricas inversas y las matrices.

Lo primero que deben de saber es que existe un método directo para invertir matrices llamado método de Gauss-Jordan del que solo voy a mencionar el nombre porque además de lento, ineficiente y muy pero muy impreciso, en programación gráfica solo se usa cuando verdaderamente no queda mas remedio. Si le aplican el método de Gauss-Jordan a las matrices de traslación, rotación y escala verán que obtienen las “anti-matrices” mencionadas en la entrada anterior. La segunda cosa a tomar en cuenta es que cuando se calcula la inversa de una cadena de matrices de transformacion, el orden de las matrices se invierte, es decir que si tenemos la cadena de matrices A, B y C y le sacamos la inversa, el resultado será C^-1, B^-1, A^-1.

Bien, ya vimos suficiente teoría sobre inversa de matrices y transformaciones geométricas. Ahora vamos a ver como hacer el problema del inicio de la entrada. En la segunda imagen tenemos nuesta nave triangular que hemos usado desde el inicio de esta serie. Así como está se encuentra expresada en coordenadas mundiales. Lo primero que haceremos será ponerla en términos de coordenadas de modelado. Así que elegimos un punto que corresponderá al centro y otros dos que definirán los ejes X,Y de su sistema de coordenadas de modelado. Como estos ejes son paralelos a los del sistema de coordenadas mundiales bastará una traslación al origen para convertir estos puntos expresados en coordenadas mundiales a coordenadas de modelado. Aunque la operación general consta de una traslación al origen, una rotación y un escalamiento. Aunque aquí la rotación y escalamiento serían matrices identidad. Es bueno que se acostumbren a aplicar siempre toda la secuencia de transformaciones para evitar código condicional. Si quieren pueden dibujar en otra hoja cuadriculada la nave en sus propias coordenadas de modelado para que estén bien seguros de lo que están haciendo.

El sistema de coordenadas de modelado no existe en el sistema de coordenadas mundiales. Para entender mejor esto piensen en uno de esos juegos de mesa que constan de un tablero y figuras a escala. El tablero donde se da toda la acción es el sistema de Coordenadas Mundiales y las cajas donde se guardan las miniaturas cuando no participan en el juego son sistemas de coordenadas de modelado. Para cada figura existe un espacio de modelado definido por su propio sistema de coordenadas. Cuando queremos colocar una de estas figuras en el tablero primero la colocamos en el centro y luego la movemos a su posición final. El sistema de coordenadas de modelado y el mundial funcionan como estos juegos de mesa. De hecho si no hiciéramos ninguna transformación para convertir coordenadas de modelado a mundiales (digamos que usamos una matriz identidad) la figura quedaría centrada en el origen del sistema de coordenadas mundiales. Pero ahora lo que queremos es hacer aparecer la nave de tal forma que pueda apuntar y disparar a un objetivo en el espacio. Ahora veamos por fin como.

Para orientar un objeto en el espacio (como por ejemplo una cámara) necesitamos por lo menos 3 puntos: El primero es el punto donde va a aparecer. El segundo es el punto hacia donde está mirando. Y el tercero es un punto que nos indique hacia donde queda arriba. Este último nos asegura que la figura no rote como lo haría un pollo rostizado. A partir de esos 3 puntos necesitamos construir un sistema de 3 vectores ortonormales. Y es ahí donde entran las abreviaturas del primer dibujo. Los 3 vectores que necesitamos son el vector de ataque, el vector horizontal y el vector de vista hacia arriba. Ahora veamos como se calculan. Primero explicado con palabras y luego en notación matemática.

Vector de Ataque: Para calcular el vector de ataque primero tomamos las coordenadas del objetivo y a estas les restamos las del punto en el que queremos posicionar la nave. La diferencia entre esos puntos nos va a dar como resultado las componentes del vector de ataque. Para normalizarlo obtenemos la longitud por medio del teorema de pitágoras y dividimos cada componente por esa longitud. Ahora tenemos un vector de longitud uno que apunta hacia el objetivo. Por la transformación que hicimos a la hora de obtener las coordenadas de modelado de la nave, ahora la nariz de la nave apunta hacia el eje Z del sistema de coordenadas de modelado. Y ese vector Z y el vector de ataque ahora son el mismo.

Vector Arriba (VUP). El vector de vista hacia arriba nos indica por supuesto hacia donde queda arriba y es una referencia muy util para que las cosas no se vayan de lado a la hora de posicionarlas en el espacio. El problema es que si queremos posicionarlas de modo que el vector de ataque fuera paralelo a este vector tendríamos problemas. Para calular el vector VUP tomamos las coordenadas del punto que definimos como arriba y le restamos las coordenadas del punto donde definimos la nave. Por cierto, el vector de vista hacia arriba no forma parte del sistema ortonormal y por lo tanto no es necesario hacer que su longitud sea igual a uno. Solo se usa para obtener el vector horizontal. Incluso el vector VUP puede definirse de manera completamente independiente a los 3 puntos de posicionamiento y así solo tendríamos que usar las coordenadas de posición y objetivo. En los juegos de simulador de vuelo el vector VUP puede ser la normal al plano del terreno, así podríamos mantener el avión paralelo a este creando un sistema de estabilización automática.

Vector Horizontal También conocido como Vector Horizonte, nos permite hacer que el modelo quede horizontal en el espacio, a menos que queramos hacer un “Barrel Roll” que es hacer que el modelo gire como un taladro. Este vector si pertenece al sistema de base ortonormal y coincide con el eje X de las coordenadas de modelado. Para obtener el Vector Horizonte hacemos un producto vectorial entre el vector de ataque y el vector de vista hacia arriba (en ese orden) y luego lo normalizamos igual que como hicimos con el vector de ataque.

Vector Vertical Aunque no se muestra en la imagen, el vector vertical (y que es diferente al vector de vista hacia arriba) es el últimos vector que forma la base ortonormal. Para obtenerlo basta con hacer un producto vectorial entre el Vector Horizonte y el Vector de Ataque. Como ambos vectores tienen una longitud de uno. El resultado será un vector ya normalizado y no tendremos que dividirlo por su longitud como los otros dos. Este vector corresponde al vector Y del sistema de coordenadas de modelado. A este vector también se le conoce como el Vector Mastil.

Una vez que tenemos estos 3 vectores los acomodamos en una matriz de 4 por 4 (aunque en realidad sería en la submatriz de 3×3) de modo que las componentes del Vector Horizonte queden en la primer COLUMNA, las del Vector Mastil en la segunda y las del Vector de Ataque en la tercera. Esta será nuestra matriz de orientación. Ahora para posicionar la nave de modo que pueda apuntar y disparar contra el blanco vamos a concatenar primero una matriz de escala (si es necesario cambiar la nave de tamaño), luego la matriz de orientación que tanto nos costó obtener y finalmente la matriz de traslación que colocará la nave en el punto que queremos. La matriz que obtengamos de estas multiplicaciones la usaremos para transformar todos los puntos de la nave que originalmente estaban en coordenadas de modelado y al final obtendremos la nave ya posicionada y orientada donde queremos dentro del sistema de Coordenadas Mundiales.

Pues bien, hasta aquí ya hemos visto las suficientes matemáticas para estar en posición de entender las gráficas vectoriales. Con lo visto hasta ahora ya están en capacidad de construir sus propios mundos vectoriales definidos por objetos independientes construidos por vértices, aristas y polígonos. Pero todavía no saben como moverse por esos mundos ni mucho menos crear una vista de cámara desde dentro de ellos. En las siguientes entradas veremos como hacer esta clase de vistas y proyecciones 3D. Y mas adelante, pero mucho mas adelante veremos como darle detalle a las superficies de nuestros objetos, pues hasta ahora todos nuestros queridos objetos 3D son poco mas que simples esqueletos vectoriales. Y confirmarán que no necesitan de millones de dólares o doctorados universitarios para poder hacer sus propios juegos 3D desde cero, pues hasta ahora y si han seguido estas entradas al pie de la letra, solo han necesitado lapiz, papel y calculadora. Y conocimientos de matemáticas que cualquier adolescente ve en una secundaria pública. Y si no las han visto, no les será dificil encontrar libros donde puedan aprenderlo sin ayuda de nadie.

Anuncios

noviembre 21, 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: