Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica: Introducción a la Vista 3D

–Plano de Proyección y Proyectores–

Pues bien, hemos recorrido un largo camino desde el inicio de esta serie de entradas sobre programación gráfica. Hemos aprendido desde cero y con el lenguaje menos técnico que me ha sido posible conceptos matemáticos que ni siquiera se ven en las clases de ingeniería de nivel superior (o al menos eso es lo que demuestran la mayoria de los game developers latinoamericanos que conozco) y otros mas que vamos a ver en el futuro. Conocemos como armar mundos completos con vértices, aristas y polígonos y tenemos una buena idea de como se crean las estructuras de datos necesarias para almacenar esta información en memoria. Y lo mas impresionante de todo es que hasta ahora no hemos tenido necesidad de mas equipo que una libreta de cuadrícula, lapiz con borrador y una calculadora escolar. Con lo aprendido hasta ahora ya somos capaces de crear mundos bastante elaborados aunque no tenemos manera de representarlos en una superficie plana como una pantalla o una hoja de papel. A partir de aquí las entradas van a tratar sobre como obtener una vista en 3D.

El concepto mas importante de la proyección en 3D son sin lugar a dudas los proyectores. Un proyector es una linea que va desde un vértice en el espacio hasta donde se encuentra el observador. En su viaje, este rayo proyector traspasa una superficie plana que se encuentra en un punto intermedio entre el observador y el objeto en el espacio. En la primera imagen tenemos una representación de esto. Imaginen que el rectángulo de cartón blanco es nuestro plano de proyección y los palos de madera que lo traspasan son los rayos proyectores. Si se acercan lo bastante a la foto pueden ver que hay una linea dibujada en el cuadro de cartón blanco que une los puntos en que los rayos proyectores lo perforan. Esta linea es la proyección de la arista en el plano. Todo el problema de la vista en 3D se resume en esta imagen. El cuadro blanco es el plano de proyección donde se van a dibujar las imágenes que existen en el espacio y luego de usa serie de transformaciones la imagen proyectada se va a mostrar en pantalla. Piensen por un momento que caminan por la calle con una pantalla de cristal que flota frente a ustedes a donde quiera que van o miran. Todo lo que pueden ver pasa por esa ventana de cristal antes de llegar a sus ojos y lo que no ven es simplemente ignorado. Cuando creamos una vista en 3D para mostrar en pantalla seguimos 3 pasos, en el primero descartamos todo aquello que no podemos ver, en el segundo proyectamos lo que si podemos ver en ese cuadro de cristal y en el tercero tomamos ese cuadro de cristal y lo mandamos a la pantalla de la computadora. Por supuesto para hacer esto necesitamos saber como manejar ese cuadro de manera programable. Pero antes de ver como hacer esto tenemos que ver que hay dos tipos muy diferentes de proyección.

Tipos de Proyección: Paralela y Perspectiva

Dependiendo de lo que tengamos que hacer con nuestro mundo 3D podemos optar por la proyección paralela o en perspectiva. La proyección en perspectiva es la mas realista de las dos y es la que da esa sensación de profundidad en la que los objetos parecen aumentar de tamaño a medida que se acercan. Por el contrario la proyección paralela no da sensación de profundidad y los objetos se ven del mismo tamaño sin importar a que distancia estén. Y aunque no es realista este tipo de proyección es muy util para editores gráficos 3D pues permite trabajar con medidas exactas de los objetos y así es mas facil hacerles cambios. Ahora veamos mas detalles de cada una. Lo mas importante es que lo único que hace la diferencia entre una proyección y otra son un par de parámetros de transformación que se le pasan a la matriz de proyección. No hay que hacer ningún otro cambio en la cámara o el mundo para pasar de un tipo de proyección al otro.

Proyección Paralela: Se le llama Proyección Paralela porque todos los rayos proyectores que dan desde los vértices hasta el plano de proyección son paralelos entre si. El volumen de vista que abarca una proyección paralela tiene la forma de una caja donde su lado frontal coincide con el plano de proyección y que puede extenderse hasta el infinito si así lo queremos, aunque en la práctica siempre ponemos una distancia máxima a la que podemos ver. En los inicios de los juegos tipo First Person Shooter a principios de la década de 1990 se usaba la proyección paralela para simular miras de muy largo alcance. Aunque esto ya no se hace porque tales vistas eran muy difíciles de controlar. El concepto mas importante a recordar en las proyecciones paralelas es que se considera que el observador se encuentra a una distancia infinita del plano de proyección.

Proyección en Perspectiva: Esta es la mas interesante para un programador de videojuegos por tratarse de la proyección de vista mas realista. La principal diferencia con la anterior es que en la proyección en perspectiva los rayos proyectores no son paralelos, sino que se unen todos en un punto donde se supone se encuentran los ojos del observador. En la proyección en perspectiva el volumen de vista tiene forma de pirámide con la punta truncada por el plano de proyección. En la segunda imagen se ve un ejemplo de una arista definida por dos vértices cuyos rayos proyectores traspasan el plano de visión. El punto donde se unen los dos proyectores es el centro de proyección donde se supone se encuentra el observador. Piensen por un momento lo que pasaría con los rayos proyectores y el volumen de vista a medida que el observador camina hacia atrás para alejarse de la ventana. Llegaría un momento en que estaría tan lejos que los rayos proyectores se harían cada vez mas paralelos y la base de la pirámide se estrecharía hasta convertirse en la misma caja de la proyección paralela.

Un concepto que no he aclarado aún es el del volumen de vista. El volumen de vista es un sólido que abarca la parte del mundo que los jugadores pueden ver. Estos volúmenes de vista se limitan por razones técnicas y si alguno de ustedes es lo bastante viejo para recordar los primeros videojuegos 3D del primer Playstation o el Nintendo 64 recordarán que algunas figuras parecían aparecer de la nada conforme uno avanzaba hacia adelante. Este fenómeno se conocía como Pop-Up y se debía a que el volumen de vista era demasiado corto en comparación con el mundo que estaba siendo generado. Una imagen solo podía ser generada cuando entraba en este volumen de vista. En ese tiempo se usaron muchos trucos para disimular este efecto como por ejemplo el uso de niebla u oscuridad y algunos mas avanzados mostraban siluetas de muy bajo nivel de detalle cuando detectaban que un objeto se encontraba fuera de los límites de visión de este volumen de vista.

Otro fallo de esos tiempos era el ver como los modelos 3D se abrían cual cascarones de huevos cuando nos acercábamos demasiado a ellos. Esto es porque el plano de proyección es también otro límite del volumen de vista. En ese tiempo hubo otro tipo de fallas por esto mismo.

Ya para terminar y comenzar de lleno con este asunto de la vista 3D voy a describirles lo que vamos a hacer a lo largo de las próximas entradas. Primero vamos a averiguar como demonios funcionan las matemáticas que gobiernan las proyecciones. Luego veremos como proyectar una imagen en un plano de proyección en el espacio y luego como modificar este para poder crear una imagen representable. Luego veremos como se definen las cámaras en el espacio y haremos vistas del mismo objeto de diferentes ángulos y al final veremos como recortar el mundo para quedarnos solamente con lo que contenga el volumen de vista. Aquí en confianza, puedo decirles que un buen libro sobre gráficas por computadora se distingue por la manera como maneja el tema del recorte del volumen de vista. Muchos viejos libros ni siquiera tocan el tema y muchos otros manejan técnicas que cuando no son terriblemente ineficientes acaban por desgraciarse toda la información de los objetos que queremos recortar. Afortunadamente hay métodos que aunque muy viejos son muy efectivos especialmente para alguien que programa en ensamblador. Y recuerden, no necesitan de grandes fortunas ni de haber estudiado en ninguna universidad de prestigio para programar juegos 3D.

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

4 comentarios »

  1. Muy bueno asm86, podrías poner una hoja con un indice de estos tutoriales tuyos.

    Saludos.
    .:SC:.

    Comentario por StrongCod3r | noviembre 24, 2011 | Responder

    • Voy a considerarlo, y puede que si junto las suficientes notas haga una recopilacion en PDF para descargar, por ahora mejor veo como hacer un indice para estas entradas

      Comentario por asm86 | noviembre 25, 2011 | Responder

  2. Muy buena pagina, agregada a mis favoritos

    Comentario por Daniel | noviembre 28, 2011 | Responder

  3. Microphone check one
    Microphone check two

    asm86 al mando

    soy nuevo en esto pero tengo demasiado interés homz, buenos temas y mejores explicaciones

    Comentario por Antonio_ | febrero 7, 2012 | 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: