Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica y el Espacio 3D

–Puntos y Vectores en un mundo tridimensional–

Esta entrada es la continuación de la nota donde trato de explicar conceptos básicos de las gráficas por computadora usando solo lapiz, papel y calculadora. Ya hemos visto lo que es un sistema de coordenadas y somos capaces de definir puntos en el espacio. Conocemos los cálculos para convertir puntos entre el sistema de coordenadas de dispositivo, en este caso una hoja de libreta. Antes de entrar con las transformaciones geométricas voy a ponerme a hablar de este espacio en el que existe todo nuestro mundo en 3D.

En la foto se muestran los vectores que forman el espacio tridimensional. Podemos ubicar cualquier punto en el espacio de manera única usando 3 números. Cada uno de estos números nos indican cuantos pasos debemos de dar en la dirección que nos indican las flechas x,y,z. El punto en donde se cruzan las tres flechas se llama Origen y para llegar a él no hay que dar ningún paso en ninguna dirección, por lo que le corresponde el punto (0, 0, 0). Si ustedes construyen una figura como esta pueden ubicar cualquier cosa con una tercia de números. Estas flechitas pueden definir universos enteros pero de momento vamos a quedarnos con nuestra libreta de cuadrícula, lápices y calculadora. Y para ello vamos a reducir esa figura de plastilina a la representación en papel que se ve en la segunda imagen. Ahora veamos lo que es un vector.

Explicar un vector no es nada facil sin recurrir al lenguaje de “sea/tal que/entonces” que viene en todos esos libros de cálculo que tanto aburren a los estudiantes de artes digitales. Para fines prácticos, un vector es una secuencia de números en la memoria de la computadora y en el espacio 3D un vector es una flecha que parte del Origen y que llega a un punto en el espacio. A nivel computadora no hay diferencia entre un punto y un vector y para los cálculos geométricos un punto es representado por el vector que llega hasta él desde el origen. De hecho los componentes de un vector que llega hasta el punto coinciden con las coordenadas del mismo. Piensen en un perro que muerde el punto pero que a la vez está encadenado en el origen. Aunque hay mas cosas interesantes sobre los vectores que iré contándoles cuando sea necesario.

Por cierto, en la nota anterior hice un comentario sobre como figuras como la de la primera foto eran capaces de definir universos enteros. Esto es llamado espacio vectorial y combinaciones lineales. Para que todos me entiendan lo voy a explicar con abejitas y flores. Resulta que los vectores son capaces de tener hijos. En la segunda foto se muestra un vector (la flecha roja) que es una combinación lineal del vector ‘x’ y el vector ‘y’ (las flechas negras). El vector X mide una unidad y sus componentes son 1,0,0 y el vector Y aunque también mide una unidad sus componentes son 0, 1, 0. Las componentes del vector V son 0.75, 0.5, 0. Esas componentes significan que tenemos que multiplicar el vector X por 0.75, el vector Y por 0.5 y el vector Z por 0. Lo que deben de recordar es que aún estos vectores pueden seguir reproduciéndose infinidad de veces. Recuerden esto cuando quieran hacer cámaras múltiples para ver la acción de diferentes puntos de vista.

Los Vectores pueden crear no solo otros vectores, también espacios completos

Algunas otras cosas que deben de recordar sobre los puntos y vectores es que los puntos carecen de dimensiones. Son infinitamente pequeños y carecen de longitud, altura o profundidad. Los vectores son flechas que comienzan en el origen y que terminan o se clavan en un punto del espacio. Un punto se define como el vector que llega hasta él desde el origen. Los espacios pueden ser definidos por un conjunto de estas flechas o vectores. Estos vectores pueden reproducirse y crear nuevos y lo mas importante. Un vector puede ser siempre definido en términos de otros vectores. Por cierto, los vectores aunque tienen magnitud (puede medirse su longitud) carecen de grosor. Son como lineas infinitamente delgadas.

Lo que muchos ya se estarán preguntando es que tiene que ver todo esto con los videojuegos 3D. La respuesta es que estos puntos y vectores se utilizan para definir todos los objetos del juego. Los puntos en el espacio, (o las cabezas de los vectores) en modelado 3D se llaman vértices. Si se unen dos vértices con una linea recta obtenemos una arista. Y si unimos 3 vértices por medio de lineas obtenémos un triángulo plano o cara. Con estos triángulos planos es como se forman todos los objetos 3D de los videojuegos. A mayor cantidad de triángulos mas suaves van a lucir las superficies. Aunque aplicando ciertos algoritmos de iluminación y detalle de superficie puede hacerse pasar una cara plana como si tuviera la textura irregular de una roca o incluso lucir como si tuviera relieve. Estas construcciones pueden ser manipuladas mediante operaciones de transformación geométrica como la traslación que mueve las cosas de un lado a otro, la rotación que hace que giren en torno a un punto determinado y la escala, que las hace cambiar de tamaño. A estas transformaciones a veces se les llama de cuerpo rígido porque alteran una figura sin cambiar la posición en que los vértices se encuentran unos respecto a otros. Y esas transformaciones no solo se usan para mover a los personajes en el campo de batalla sino que también se usan para la vista individual de cada jugador en una partida multiplayer.

Antes de terminar quiero dejar claro una cosa, no existe un solo espacio sino muchos. Cada espacio cuenta con su propio sistema de coordenadas y es importante saber como convertir puntos de un sistema a otro de la manera mas rápida que sea posible. Los sistemas de coordenadas mas importantes son 3 a saber: El sistema de Coordenadas Mundiales que es donde el mundo del juego se desarrolla. El sistema de Coordenadas de Modelado que se usa para construir los personajes del juego (cada objeto tiene su propio sistema de coordenadas) y por último las Coordenadas de Vista. De momento vamos a trabajar de modo tal que estos 3 sistemas de coordenadas coincidan. Mas adelante veremos como separarlos y trabajar con cada uno de manera individual.

Saben, me siento como un estúpido hablando de estas cosas en internet. Solo lo hago porque se que en algún lugar hay alguien que sabe que para hacer videojuegos no basta con estar titulado de lo que sea o tener contactos con gente importante. O que por mucho dinero que le puedan sacar al gobierno nunca van a poder conseguir que esas consolas se programen solas. Se bien que ahí afuera hay alguien queriendo hacer su propio game engine o por lo menos poder usar uno con pleno conocimiento de lo que están haciendo. Y aunque esta información fue pensada en un inicio para los programadores se que los grafistas mas principiantes les vendrá bien saber lo que son los vectores y como estos son independientes de los pixeles.

Por cierto, hace muy poco me volvieron a preguntar que porqué no he fundado mi propia empresa de videojuegos. No es la primera vez que me lo preguntan. Solo digamos que he aprendido de errores ajenos y prefiero no exhibirme mas de lo necesario. Solo puedo decir que cuando eso suceda, primero van a jugar el juego, luego van a querer investigar quien lo hizo y solo entonces sabrán si he logrado fundar una empresa de juegos o no. Puede que algunos disfruten del juego sin que ni siquiera les importe quién lo hizo. Pero prefiero mil veces, si es que un dia hago un buen videojuego (yo solo o con un equipo respaldándome) este vaya por delante mio y no que un juego que sea un fracaso comercial me lleve por delante a mi. Es por eso que no me gusta exhibirme sin un producto de calidad en mis manos. Pero hasta que ese día llegue, seguiré siendo una sombra mas en el internet. Una sombra que comparte con ustedes sus modestos (o debería decir molestos) conocimientos de Programación en Lenguaje Ensamblador.

Anuncios

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

10 comentarios »

  1. Esto ya me esta gustando mas,

    Comentario por StrongCod3r | octubre 3, 2011 | Responder

    • Y esto no es nada todavia, preparate para lo que viene

      Comentario por asm86 | octubre 3, 2011 | Responder

  2. Bastante educativo, y eso que ni programador ni grafista, ni especialista en juegos, solo por el simple gusto de querer hacer uno, no para vender, no para ganar sino por el simple gusto de saber como hacerlo.

    Comentario por visionaxe | octubre 5, 2012 | Responder

  3. que megachimba, esto es muuuuuuy cierto conozco gente que hace videojuegos con unity y creen que es una maravilla(y si lo es, estoy estudiando su uso), pero NO comprenden nada de fisicas, colosiones, traslaciones y ese largo etc de fisica dinamica, matrices etctyteteteetcetc…

    lo leere todo muchisimas gracias, mi objetivo es crear un engine 2d para el objeto canvas de html5, resulta que no comprendo ninguno de los que ya existen lease : cocos 2d, lime.js, etc

    mi nombre es gilberto fandiño barbosa de colombia. de nuevo muchas gracias. ojala lo hubiera encontrado antes

    Comentario por gilberto | febrero 28, 2013 | Responder

  4. hola solo quiero saber si podrías explicarme un poco mas a profundidad sobre como programar los vectores dentro de un área determinada, y de que forma se podría implementar en un dispositivo

    Comentario por nichter | octubre 25, 2013 | Responder

    • ¿programar vectores en un área determinada? Si te refieres a guardar un vector (o array que es lo mismo) en un área de la memoria lo haces como cualquier otra variable. En ASM es:

      vector:
      dd 0 ;componente x
      dd 0 ;componente y
      dd 0 ;componente z

      también puedes usar la directiva TIMES de NASM para dejarlos sin inicializar. En lenguajes mas ‘normales’ lo mejor es usar estructuras o arrays de estructuras.

      Lo de implementar en un dispositivo no lo entiendo. Este c\odigo funciona en una PC con Windows y se compila con FASM, MASM, TASM y NASM. Tal vez si me dieras mas detalles

      Comentario por asm86 | octubre 25, 2013 | Responder

  5. En el ejemplo que se da sobre el teorema de pitagoras aun falta por hacer varias operaciones debido a que los vectores que usamos son otronormados su valor absoluto es igual a uno por lo que si multiplicamos el vector z por cinco (tomando lo como ejemplo) no dará cinco por lo que el resultado de el valor absoluto de 5v no es la raiz de 5x a la dos + 5y a la dos+ 5z a la dos si no es la raiz de 75 haciendo los cálculos correspondientes

    Comentario por Juan Alberto Garcia Rendon | junio 16, 2015 | Responder

    • Tantos años y no me había fijado en ese detalle. Pero veamos. El vector V es igual a 0.75x, 0.5y, 0z donde
      x es 1,0,0
      y es 0,1,0
      z es 0,0,1

      no estaba haciendo ningún cálculo de pitágoras o de medir distancia. Tan solo estaba mostrando como un vector puede expresarse en función de otros vectores. Aunque tal vez si hiciera ese cálculo me lleve una sorpresa. Estoy leyendo muy lentamente el comentario y mis cálculos para ver que significan. De momento contesto para que veas que si lo leí.

      Comentario por asm86 | junio 18, 2015 | Responder

  6. Esto son de esos post que por mas que pasen años siguen siendo validos y provechoso, me trajo Unity 3d, porque quiero hacer que un pj, camine sobre las paredes y doble las esquinas y siga caminando desde el otro lado del muro. Ya me enrrolle bastante en Trigonometria, se agradece.

    Comentario por Javier | agosto 23, 2015 | Responder

    • Para que un personaje camine por una superficie plana sin importar si es una pared o un techo necesitas el vector normal de ese plano. A partir de ese vector puedes orientar al personaje de modo que el vector que indica arriba para el personaje coincida con el vector de la superficie que esta parado. En Unity puedes editar las propiedades físicas de la pared y el personaje para que estos interactuen. Aunque tal vez tengas que desactivar la gravedad para ese objeto cuando se fije a una pared. Lo mas dificil es ‘transformar’ los movimientos de los personajes cuando están en una vista diferente a la de siempre. Puedes hacerlo rotacional o direccional.
      Rotacional es que el personaje se mueva respecto a su propio sistema de coordenadas y direccional que se mueva respecto a las coordenadas del observador. Si el personaje es jugable transforma las entradas del control antes de usarlas para mover al personaje.

      Comentario por asm86 | agosto 23, 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: