Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica y los Polígonos en 3D

–Triángulos y Planos en el Espacio–

En los juegos 3D es muy común escuchar que tal o cual modelo está compuesto por no se cuantos miles y miles de polígonos. Cuando escuchamos sobre las capacidades de algún coprocesador gráfico normalmente se nos dice que puede procesar una determinada cantidad de polígonos por segundo y hace algunas entradas vimos aquí que las figuras en los juegos 3D se componen de vértices, aristas y polígonos. Hoy vamos a ver todo lo que un programador de videojuegos debe de saber sobre los polígonos planos en el espacio.

Lo primero que tenemos que dejar claro es que los famosos “polígonos” que forman nuestros amados modelos 3D en realidad son todos triángulos. Los triángulos tienen una serie de propiedades matemáticas que los hacen especialmente eficientes en el campo de la programación gráfica. Por ejemplo, los 3 puntos que definen los vértices de un triángulo siempre se encontrarán en un mismo plano en el espacio (a menos que estén todos dispuestos en linea recta). Cualquier figura que se nos ocurra puede ser subdividida en triángulos, los triángulos pueden ser procesados de un solo paso en sistemas de procesamiento vectorial, siempre son convexos, pueden ser recortados con muy pocas operaciones y muchas otras cosas mas que ya verán cuando tengan que programar estas cosas en una PC. En la primera imagen vemos un triángulo formado por 3 vértices (en plastilina blanca) y 3 aristas (en madera). Como pueden ver, pueden poner ese triángulo en la posición que ustedes quieran y siempre quedará plano.

Como ya saben las caras poligonales se definen como una lista de índices a los 3 vértices que lo conforman. Pero un plano a nivel matemático es mucho mas que eso, lo bueno es que podemos obtener toda la información del plano en el espacio en el que se encuentra este polígono con tan solo los 3 vértices que forman el polígono. Para eso lo primero que tenemos que hacer es convertir esos 3 vértices en dos vectores a los que les podamos aplicar un producto vectorial. Si recuerdan en la nota sobre como modelar objetos en 3D, se dijo que los vértices del polígono se escribian en sentido contrario al de las manecillas del reloj cuando uno los veía de frente. Entonces tenemos los 3 puntos que forman el polígono como P0, P1 y P2. Para obtener los dos vectores U y V hacemos una resta vectorial de modo que U = P1 – P0 y V = P2 – P1. La diferencia entre las coordenadas entre 2 vértices es igual a las componentes del vector que los une. O lo que es lo mismo, se hace una minitraslación. En fin, ya con los vectores U y V podemos hacer un producto vectorial y obtener un vector normal al plano al que llamaremos aquí vector N. Por cierto, el vector N puede llegar a tener una magnitud de cero o un valor muy cercano a este en caso de que los 3 puntos proporcionados estén en linea recta. En cuyo caso no podríamos representar un plano, pues el seno del ángulo entre los 2 vectores U y V sería cero.

En la segunda imagen se ve junto con el triángulo que define nuestro polígono otra pequeña flecha vertical de punta roja. Ese es nuestro vector normal N. Ese vector atraviesa el plano por completo como si fuera un clavo. No importa que punto del plano elijamos, como se trata de una superficie plana este vector va a ser siempre el mismo. Piensen en una de esas camas de clavos en las que descansan los magos de la India. Ahora bien, a menos que el plano que contiene al polígono pase por el origen todavía nos falta un último paso para obtener toda la información del plano. Las coordenadas de cualquiera de los 3 vértices. Aunque nos habría servido igual cualquier otro punto de los infinitos que caben dentro del plano. Ahora veamos la ecuación del plano a nivel matemático.

Ecuación del Plano
Ax + By + Cz + D = 0

Para obtener la ecuación del plano que contiene el polígono definido por los 3 vértices necesitamos calcular los valores de A, B, C y D. Los 3 primeros corresponden a las componentes x,y,z del vector normal N. Para calcular D necesitamos las coordenadas de cualquiera de los 3 puntos que componen el triángulo. Digamos que elegimos P0. Sus coordenadas serían P0_X, P0_Y y P0_Z. Entonces hacemos lo siguiente:

A * (x – P0_x) + B * (y – P0_Y) + C * (z – P0_Z) = 0

Luego de sumar y multiplicar se obtiene el valor de D. Aunque bien hubiéramos calculado D directamente con la expresión -1*(A*P0_X + B*P0_Y + C*P0_Z). Ahora bien, seguro se preguntarán para que demonios queremos esta aburrida expresión. Pues esta aburrida expresión puede servirnos para mas cosas que solo dibujar un simple polígono. Lo mas directo es sustituir los valores de x,y,z por cualquier punto en el espacio. Si el resultado de la expresión es cero o muy cercano a cero (la precisión en una computadora es finita) entonces el punto está dentro del plano. Si el resultado es positivo el punto se encuentra por encima del plano y si es negativo entonces es un lugar por debajo de este. Esta información es muy util para saber de que lado del plano nos encontramos y se usa para detectar colisiones y recortar figuras. La normal del plano nos da información hacia donde apunta la cara del plano. Podemos por ejemplo saber que dos planos son perpendiculares entre si cuando hacemos un producto escalar entre sus normales y el resultado es igual a cero. Si quisiéramos crear por ejemplo una figura alargada (lo que en arte digital llaman extrusión o ‘lofting’ basta tan solo con cambiar el valor de D y redibujar la figura. El vector normal al plano se usa para cálculos de textura e iluminación sobre el polígono, aunque existe una técnica conocida como Normal Mapping en la que se asigna un vector arbitrario a cada punto del polígono para dar la apariencia de que este no es plano. Pero el uso mas interesante de la ecuación de los planos en el espacio es sin duda la proyección geométrica. Pues lo que vemos en pantalla cuando jugamos un videojuego 3D es la proyección sobre un plano de una parte de ese mundo vectorial, como si viéramos por una ventana. Esa ventana es un plano en el espacio y necesitamos lo visto hasta ahora para poder hacerlo.

Algunas otras cosas que deben de tener en cuenta con esto de los planos es que a nivel matemático los planos tienen una extensión infinita y su grosor es infinitamente pequeño. Cuando un plano es perpendicular a uno de los ejes coordenados los valores de A, B o C excepto el del eje que lo traspasa son iguales a cero. Por ejemplo, si hacen esta operación con cualquier polígono en el plano z = 0 que se puede desplegar en la hoja de libreta A y B y D siempre les va a dar cero. Es posible calcular el punto en el que el plano corta los ejes coordenados si dividen los valores de A, B o C entre -D. Por cierto, un mismo plano en el espacio puede ser definido por lo que parecen un sinfin de ecuaciones diferentes. Pero esto siempre va a poder descubrirse si existe un factor por el cual A, B, C y D puedan multiplicarse. Se recomienda en ciertos casos dividir el vector N entre su longitud para evitar errores de pérdida de precisión a la hora de hacer los cálculos.

Por cierto, no está de mas una pequeña advertencia, hay una correspondencia entre los planos en el espacio 3D y las lineas rectas en el mundo 2D. Se considera que el 2D es el plano XY donde Z es igual a cero. La ecuación de este plano es precisamente Z = 0. Una recta en ese plano es en realidad un plano perpendicular a Z = 0 que se alza sobre la hoja como lo haría un muro. Esto es importante que lo tengan en cuenta porque esto tiene muy poco que ver con lo que consideramos una linea recta en el espacio. En la siguiente entrada vamos a hablar sobre las rectas y otras curvas sencillas en el espacio, por ahora esperemos a que salga la nueva nota mientras rezamos a nuestros respectivos dioses que la reciente hola de inactividad en las redes mexicanas de desarrollo de videojuegos se deban a que están planeando algo grande o por lo menos que estén trabajando en algún nuevo juego que pueda pagar sus nóminas atrasadas.

Advertisement

noviembre 2, 2011 - Publicado por | Uncategorized | , ,

4 comentarios »

  1. Desde luego te lo estás currando mucho. Es una lástima que actualmente no tenga mucho tiempo para poder ponerlo en práctica pero lo tengo pendiente seguro

    Comentario por JuDelCo | noviembre 3, 2011 | Responder

    • no hay prisa, si no ocurre nada raro esta nota va a seguir aqui por mucho pero mucho tiempo, ademas las matematicas para el 3D nunca se hacen obsoletas

      Comentario por asm86 | noviembre 3, 2011 | Responder

  2. que gran post tienes cumpa, quisiera que dentro de los temas que estas tratando en Computacion Grafica, hables de un temita llamado “Cuaterniones”, y dentro de ello rotacion en 3D usandolos….como solo hasta ahi he ahondado, creo que pedirte que tambien hables de escalamiento usando cuaterniones, seria abusar de tu buena voluntad, bueno me despido mandandote un fuerte abrazo y buenos deseos!!!

    Comentario por JuanD | noviembre 15, 2011 | Responder

    • Voy a tomarlo en cuenta, los cuaterniones aceleran los calculos en algunas computadoras pero no en otras. De momento no puedo escribir mucho asi que mejor que esperen sentados

      Comentario por asm86 | noviembre 16, 2011 | Responder


Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.