Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica: Coordenadas de Referencia Visual

–Como Implementar una Cámara en 3D–

Una de las primeras cosas que se pregunta un programador de videojuegos al dia siguiente de haber logrado implementar la proyección en perspectiva es como se hace para moverse por su mundo virtual, o como implementar eso que los grafistas llaman “la cámara”. Cuando escuchamos el término cámara lo primero que nos imaginamos es un cubo pesado con una trompa que apunta en dirección a lo que queremos fotografiar, y algunos mas veteranos puede que incluso se imaginen que tal cubo cuente con dos rodillos superiores cual orejas de ratón y una manivela rotatoria en un costado. Definitivamente nadie se imaginaría que la figura extraña que se muestra en la primera imagen tenga algo que ver con el refinado mundo de la fotografía. En esta entrada vamos a ver como podemos hacer fotografías de nuestros modelos 3D desde cualquier ángulo dentro de nuestro mundo virtual.

Primero dejemos en claro que es eso de Coordenadas de Referencia Visual. Conocidas también simplemente como Coordenadas de Vista, se trata de un sistema que convierte la información de los objetos en Coordenadas Mundiales en datos de posición relativos a un jugador que se mueve por ese mundo. Cuando decimos que algo se encuentra al frente, arriba o tras nosotros estamos usando coordenadas de referencia visual en la vida cotidiana. Pues bien, para poder movernos por nuestros mundos virtuales necesitamos mover una cámara y tomar una sucesión de fotos lo bastante rápida para generar una animación. Y para eso es que necesitamos una cámara, pero como nosotros somos programadores lo que vamos a implementar es un sistema de Coordenadas de Referencia Visual.

Ahora si vamos a describir que demonios es esa cosa que recuerda a un viejo satélite, aunque intentaré explicarlo como una cámara hasta donde me sea posible. El cuadro de papel es el Plano de Visión donde se va a desplegar la imagen, ese es nuestra porción de rollo de película.Los signos de mas y de menos que pueden verse en las esquinas de ese cuadro son los límites de la Ventana de Proyección. y los necesitamos para definir el ancho y la altura de la imagen que vamos a proyectar. El punto rojo donde todos los bastones de madera se unen es el Punto de Referencia Visual y es el objetivo de la cámara o la mira que nos indica hacia donde queremos tomar la foto. La enorme flecha que sale del plano de proyección se llama Normal del Plano de Visión o VPN y define la linea infinita que pasa por el centro del objeto a fotografiar y el ojo del observador. La bola de color verde que traspasa la flecha mas grande cual aceituna es el Punto de Referencia de Proyección o simplemente OJO

y es justo donde quedarían los ojos de un observador que mira por la cámara. Las flechas marcadas como U, V y N son los vectores que definen el Sistema de Coordenadas de Referencia Visual. Como puede verse, el vector N es paralelo a la Normal del Plano de Visión, pero a diferencia de este, N solo mide una unidad, pues U, V y N forman una base ortonormal del mismo modo que lo hacen los vectores mundiales X, Y, Z.

El sistema de coordenadas de referencia visual que acabo de describirles en realidad está simplificado para ser mas sencillo de entender a los principiantes. Pues como se explicará mas adelante en esta misma entrada, este sistema puede modificarse para obtener no solo las proyecciones paralela y perspectiva. Sino incluso las tomas que se usan en dibujo de ingeniería y planos industriales, que si bien no sirven para hacer videojuegos son perfectas si lo que quieren es hacer su propio editor de modelado 3D. Eso se explicará al final, por ahora veamos como se convierten las Coordenadas Mundiales a Coordenadas de Referencia Visual y recuerden que este ejemplo está simplificado para los principiantes.

Como definir un sistema de Coordenadas de Referencia Visual

Lo primero que necesitamos hacer es construir el sistema de coordenadas de referencia visual. Tenemos 2 opciones y ninguna es buena. La primera consiste en fabricarla de la nada y otra definirla como un objeto mas del mundo. En mi experiencia personal lo mejor es definir una cámara como un objeto mas en el mundo virtual y aplicarle las mismas reglas físicas que al resto de los objetos del juego y orientarlo de la misma manera como se posicionan y orientan todos los modelos en el sistema de coordenadas mundiales. Crearla de la nada a veces lleva a formas indeterminadas que crean vistas poco realistas o incluso puede aparecer una cámara dentro de otro objeto y mostrarlo incompleto. Este problema era muy común en tiempos del Nintendo 64. Sea como sea necesitamos 3 puntos, o mas bien 2 puntos y un vector. Veamos primero como se crea una cámara de la nada.

Definimos la Posición de la Cámara.-El punto en el espacio donde queremos posicionar la cámara será el Punto de Referencia de Proyección o simplemente el OJO.

Definimos el vector de vista hacia arriba VUP El Vector de vista hacia arriba VUP es una de las cosas mas difíciles de explicar a la hora de definir una cámara. En la imagen se muestra el vector VUP de manera separada al sistema de coordenadas de referencia visual. Si lo ven de cerca verán que el vector VUP se apoya en un cuadro plano en el piso de nuestro mundo. Este vector indica la verticalidad de la cámara. Si movemos este vector podemos hacer que la cámara se ladee o quede de cabeza. Pero lo mas peligroso es cuando VUP y y la normal al plano VPN son paralelos. Cuando esto sucede se crea una indefinición y no podremos crear el sistema de coordenadas mundiales.

Determinamos la dirección de la Cámara.-El segundo punto es hacia donde la cámara está mirando. Es decir el Punto de Referecia Visual. No es necesario ni aconsejable fijar el punto de referencia visual directamente en el objeto a “fotografiar” a menos que queramos que el plano de proyección y el objeto compartan el mismo espacio. Basta con que quede entre el punto de referencia de proyección y el objetivo. Puede usarse la ecuación paramétrica de la linea para obtener una distancia intermedia arbitraria.

Calculamos la Normal al Plano de Visión.-Se trata de la flecha mas grande y es perpendicular al plano de visión. Para calcularla basta tomar las coordenadas del Punto de Referencia de Proyección y restarle las respectivas del Punto de Referencia Visual. El resultado serán las componentes del vector normal al plano de proyección. Y como sabemos que para definir matemáticamente un plano solo necesitamos un punto y su normal, ya tenemos definido nuestro plano de proyección.

Obtenemos la Base Ortonormal UVN.-Primero dividimos la normal al plano de visión por su propia longitud y guardamos el resultado como el Vector N. Luego tomamos el vector de vista hacia arriba VUP (definido en coordenadas mundiales) y hacemos un producto cruz VUP X N para obtener un vector que luego dividiremos entre su propia longitud para obtener el vector U. Finalmente hacemos un producto cruz final N x U y obtenemos directamente el vector V. Si este proceso se les hace conocido, es porque es el mismo que usamos para posicionar y orientar objetos en el espacio de manera arbitraria. Proceso que ya se discutió en una entrada anterior.

En caso de que queramos predefinir una cámara como un objeto mas solo basta con predefinir estos datos y acomodarlos en el espacio como cualquier otro objeto. Otro método para obtener lo mejor de ambas técnicas y que es especialmente util en los First Person Shooters es definir 3 puntos en el propio modelo 3D. De modo que si tenemos por ejemplo el típico Space Marine el punto de referencia de proyección quede en los ojos, el punto de referencia visual un poco frente a los ojos como si se tratara de uno de esos displays montados en los cascos (o en la mira del rifle si se trata de un francotirador) y definir el vector de vista hacia arriba como una antena que sobresalga del casco directamente hacia arriba. De este modo no nos arriesgaremos nunca a que VUP y Y creen una indeterminación sin importar en que posición quede nuestro personaje, y no tendremos las pérdidas de precisión que implica mover por el espacio cámaras completas.

Como Transformar a Coordenadas de Vista

Pues bien, ya entendimos como se define un sistema de coordenadas de referencia visual y como este funciona como lo haría una cámara fotográfica. Ahora veamos como tomar la foto. Y aunque lo detallaré en la nota que sigue por falta de espacio les recuerdo que estas operaciones se hacen con matrices. Por lo que es posible concentrar todas las transformaciones de vista, proyección (y mas adelante recorte) en una sola matriz. Ahora veamos los pasos para tomar la foto.

Trasladamos el Punto de Referencia Visual al origen. Esto es solo una sencilla traslación que posiciona el sistema tal que el Punto de referencia visual (la mira) quede en el centro del sistema de coordenada mundiales.

Se hacen coincidir los vectores UVN con XYZ.-Tanto UVN como XYZ son vectores ortonormales. Para hacer esto solo hay que escribir los vectores UVN como las columnas de una matriz. Recuerden que para los sistemas ortonormales la inversa es también la traspuesta.

Se traslada el Punto de referencia de Proyección al origen.-Esta traslación hace que el observador quede en el centro del sistema.

Se escala al volumen de vista canónico.En este ejemplo no se detalla por tratarse de una explicación para principiantes, pero este paso convierte la pirámide de visión en un volumen particularmente sencillo de procesar mas adelante. Aquí es donde entran en juego los límites mínimos y máximos de la ventana o puerto de vista que queremos capturar. Como nota al margen, así es como se logran efectos realistas de ZOOM en los juegos 3D. Solo es cuestión de estrechar el volumen de vista y asunto arreglado.De momento el cálculo de transformacion a coordenadas de vista termina aquí. Ahora solo falta la proyección.

Aplicar la Proyección en Perspectiva. Esto es tan simple como aplicar las ecuaciones de la entrada anterior. Para convertir coordenadas de vista a coordenadas proyectadas solo hay que dividir entre Z y multiplicar por la distancia del observador al plano de proyección. En este caso esa distancia es el negativo de la coordenada Z del Punto de referencia Visual.

Hasta aquí ya se vio el caso específico cuando se maneja proyección en perspectiva. En las siguiente entrada veremos como las Coordenadas de Referencia Visual pueden generalizarse para manejar también la proyección en paralelo de manera que pueda hacerse una sola rutina que maneje cualquier tipo de proyección con tan solo pasarle los parámetros adecuados. Y otro poco mas adelante veremos el concepto de volumen de vista. Que como se discutió en la entrada anterior es una pirámide que recorta el mundo que podemos ver y lo transforma de modo que resulta mucho mas eficiente de procesar. El tema de las proyecciones de vista es complejo. No esperen dominarlo en pocos dias. Si tienen dudas repasen las entradas anteriores sobre programación gráfica. Y siempre que se sientan vencidos recuerden la primera ley del programador de videojuegos: Un Programador de Videojuegos no le Teme a las Matemáticas.

Anuncios

diciembre 24, 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: