Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica, Modelado y Traslación

–Como definir y mover imágenes vectoriales–

La serie sobre programación gráfica con lapiz, papel y calculadora continua. Esta vez vamos a definir la figura vectorial mas sencilla que podemos representar. Esta nota consta de 3 partes donde primero vamos a acabar de definir el espacio de coordenadas, luego crearemos la figura mas sencilla posible que es posible representar con estas técnicas y luego vamos a moverla por el espacio. Comencemos.

Lo primero que haremos en nuestra libreta de cuadrícula será dibujar un cuadro de 20 por 20 cuadritos y lo partiremos en 4 para formar un espacio de coordenadas x,y,z. Recuerden que en el papel tenemos las coordenadas x,y y que la z sale de la hoja como si se tratara de un poste. Este espacio será nuestro mundo y lo vamos a limitar. Sus límites son de -10 a 10 en los 3 ejes. Aunque durante esta entrada solo vamos a trabajar en el plano de la hoja que corresponde a z = 0. El origen debe de quedar justo en el centro del cuadro. Por cierto, como esta vez estamos trabajando con coordenadas de punto flotante (o decimales en el caso de la calculadora) podemos representar puntos en cualquier parte dentro del cuadro y no solo en las intersecciones de la cuadrícula como en el caso de las coordenadas físicas. Aunque en este caso las intersecciones representan los números enteros.

Ahora viene lo que todos ustedes estaban esperando: Vamos a hacer una nave espacial en 3D. Pero como ustedes son principiantes y están trabajando solo con lapiz y papel vamos a hacer una muy pero muy sencilla. Un inofensivo triángulo. Con mucha pero mucha imaginación pueden imaginarse que se trata de un F-117 o un Destructor Imperial visto desde abajo. Aunque si entre ustedes hay gamers muy veteranos, de seguro verán que nuestra nave es idéntica a la del viejo juego Asteroids. Mas adelante modificaremos muy ligeramente este triángulo para hacerlo verdaderamente 3D pero por ahora lo mejor es dejarlo como está para no complicarnos la vida.

Como definir objetos vectoriales

Como se explicó brevemente en una entrada anterior. Los vectores no tienen nada que ver con los pixeles. En lugar de definir dibujos creados por cuadros de un solo color las gráficas vectoriales se definen por vértices, aristas y polígonos. En el caso de nuestra nave, esta se compone de 3 vértices, 3 aristas y un polígono. Cuando formamos una figura en 3D usamos 3 arrays para este tipo de datos. El primero es el array de vértices. Por cuestiones de eficiencia que verán en un par de entradas mas cada vértice ocupa 4 números flotantes de precisión sencilla de 32 bits o 128 bits en total. Aunque algunos sistemas mas avanzados de animación usan precisión doble de 64 bits o extendida de 80 bits. Cada vértice se identifica por su posición dentro del array. Luego sigue el array de aristas. Una arista es una linea que une dos puntos. Para guardar cada arista necesitamos dos enteros. Cada uno de estos enteros es el índice al array de vértices. En el ejemplo la arista 0 une los vértices 0 y 1, la siguiente el 1 y 2 y la última el 2 y 0. Por último tenemos el array de polígonos. Los polígonos se guardan de la misma forma de las aristas, solo que se usan 3 enteros porque cada polígono, o debería decir cara triangular. En este caso como solo tenemos una cara, esta se define por los vértices 0,1 y 2. Este es un ejemplo en extremo simplificado. En la actualidad tan solo un personaje de videojuego puede estar compuesto por cientos de miles o incluso hasta unos pocos millones de estos triángulos.

Otra cosa importante sobre los polígonos. El orden en la que enlistan los vértices que lo forman es cosa seria. No solo deben acomodarse de modo que al seguir los puntos con una linea se forme un triángulo sino que este triángulo debe dibujarse en sentido contrario al de las manecillas del reloj. Esto es porque los polígonos solo pueden ser vistos por una de sus caras. Además de que facilita ciertas operaciones vectoriales muy importantes tanto para la eliminación de partes ocultas como para los detalles de textura e iluminación. En la segunda imagen tenemos toda la información que necesitamos para construir nuestra nave espacial.

Ahora es buen momento para recordarles que los vértices, aunque pueden posicionarse en cualquier parte de nuestro espacio, en realidad no son libres. Sino que están anclados al origen por el vector que tiene por componentes. Aunque a la hora de hacer las gráficas no lo representemos ese vector siempre está ahí. Recordar esto es muy importante cuando hagamos transformaciones geométricas. Y la mas elemental de ellas es la Traslación.

Traslación

Pues bien, ya tenemos nuestro espacio bien delimitado y hasta una nave espacial suspendida en él. Ahora veremos la mas elemental de las transformaciones geométricas vectoriales: La traslación. Traslación es trasladar algo de un lugar a otro y es sumamente facil. Para mover nuestra nave por el espacio basta con hacer una suma vectorial. Como la explicación matemática es demasiado revuelta para una operación tan facil voy a irme directo al ejemplo. Digamos que queremos que nuestra nave se eleve 10 unidades. Solo tenemos que sumar 10 a la coordenada Y de cada uno de los vértices que componen la nave. Si quisiéramos centrarla de modo que el origen coincida con su centro restaríamos 2 a la coordenada X de todos los vértices y 3 a la coordenada Y. Por cierto, es muy importante que cuando definamos una figura de manera vectorial definamos un centro. Ese centro es importante para muchos cálculos como veremos mas adelante al estudiar la rotación y escala. De momento practiquen moviendo la nave de un lado a otro sin salirse del espacio definido

Realmente hay muy poco que discutir sobre la traslación de objetos en el espacio. Es tan sencillo como sumar componentes vectoriales. Ojo que cuando digo sumar, también puedo estar hablando de sumas con números negativos, lo que tendría el efecto real de una resta, y cuando digo multiplicar puedo estar hablando de números entre cero y uno, lo que en realidad divide. Lo único interesante sobre la traslación es que su fundamento técnico se basa en algo llamado Desplazamiento Vectorial. En la última de las imágenes de esta entrada se puede ver como la nave dibujada junto con los vectores que unen cada uno de sus vértices con el origen. En la parte de abajo la nave se desplazó dos unidades en el eje X y -6 unidades en el eje Y. Por simplicidad en la posición final solo se muestra el vector asociado al vértice V2. Ahora viene lo interesante. Si unimos el punto origen y destino de V2 obtenemos un vector cuyas componentes son 3,-6 y 0. En el dibujo ese vector se muestra en color rojo. En términos físicos. El vector rojo indica la distancia y el vector de la posición final el desplazamiento. Es una simple suma vectorial. Sin embargo también es posible hacer una resta vectorial para calcular ese vector rojo. Digamos que queremos mover una imagen a un punto determinado. Basta una resta vectorial (destino menos origen) y luego sumamos las componentes del vector a todos los vértices. Bueno, creo que ya estoy complicando algo que de por si era muy simple.

Para los que ya tienen algo de práctica haciendo juegos, con la información dada hasta ahora ya deberían ser capaces de hacer una sencilla animación de movimiento de esa nave triangular. Solo tendrían que hacer un ciclo donde en cada iteración trasladaran los vértices un poco. Pero la simple traslación no es muy impresionante. Mas adelante veremos como rotar la nave y hacer que cambie de tamaño. Cuando terminemos las transformaciones geométricas básicas veremos como mecanizar los cálculos usando matrices y luego ya verán que vamos a poder hacer algo en papel que hasta ahora muchos creían que solo era posible usando poderosas computadoras. Ya verán que serán capaces de entender el funcionamiento del 3D antes de lo que se imaginan. Y sin tener que gastar cientos de miles de dólares en alguna de esas escuelas de desarrollo de videojuegos que comienzan a proliferar en Mexico como hongos del Mario Bros. Muchas de las cuales invito a usar mis escritos para apoyar sus clases porque a como conozco a muchos profesionales de “la industria” que dan clases en esos lugares (especialmente los de las materias de programación), no dudo que van a necesitar esta y toda la ayuda que puedan obtener.

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

2 comentarios »

  1. Otro buen articulo asm86.

    Saludos.
    StrongCod3r.

    Comentario por StrongCod3r | octubre 9, 2011 | Responder

  2. Extraordinario! Quiero dominar ensamblador!

    Comentario por Juan Pablo | septiembre 14, 2015 | Responder


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: