Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica: Proyección Paralela

–La visión mas util no es siempre la mas realista–

Hace ya tiempo en la nota llamada “introducción a la vista 3D” les había comentado que además de la ya bien conocida proyección en perspectiva existe un tipo de visión poco realista pero muy importante para manipulación interactiva de modelos llamada Proyección Paralela. En los libros serios sobre gráficas por computadora hablan de la proyección paralela mucho antes que de la proyección en perspectiva por el simple hecho de que es un paso natural a la vista vectorial bidimensional con la que comienzan todos los textos. Yo en cambio decidí comenzar con la perspectiva no solo para no aburrirlos sino porque a menos de que ustedes tengan entrenamiento en dibujo de ingeniería la vista generada por la proyección paralela les iba a resultar poco estética y sin el menor sentido. Pero veamos de una vez como funciona y como aunque pueda resultar extraña es bastante mas sencilla que la perspectiva.

En la primera imagen vemos un volumen de vista para proyección paralela. Las lineas roja, verde y azul son el plano frontal F, el plano de proyección y el plano posterior B respectivamente. La linea punteada que pasa por el centro es el vector normal al plano de visión VPN y el centro de la ventana es el punto de referencia visual VRP. Pero hasta aquí llegan las similitudes con la perspectiva.

La primera y mas visible de las diferencias es que en la proyección paralela no tenemos una pirámide sino un rectángulo. La segunda aunque un poco menos visible es que ya no hay un ojo que indique donde se concentan las imágenes. Si bien el ojo todavía existe ya no puede ser considerado como tal. El punto equivalente al ojo en la proyección paralela simplemente se le llama Punto de Referencia de Proyección PRP y se encuentra en el centro del plano frontal F del volumen de vista. Por cierto, a esta proyección se le llama paralela no solo porque los planos opuestos que definen el volumen son paralelos, sino porque los proyectores que son las lineas que van de los vértices al observador son todos paralelos entre si. Pues aquí los proyectores no se concentran en un punto sino que como clavos caen sobre el plano de proyección y lo atraviesan.

Antes de pasar a las mateméticas, que son trollezcamente sencillas comparados con lo que hemos visto hasta ahora, hablemos mas de la proyección paralela. Personalmente me recuerda a la obra de pintores cubistas como Picasso. Pues aunque no se trata de imágenes visualmente realistas si revelan mucha información de los objetos. Por ejemplo las piezas no cambian de tamaño con la distancia, podemos comparar mucho mejor las medidas de los objetos y los cursores con los que movemos las piezas son mas sencillos de controlar. Comprobar si los modelos están alineados es mas sencillo y se eliminan los efectos de las ilusiones ópticas que pueden generar algunos efectos de luz. De hecho, la proyección paralela se parece mas a como el cerebro procesa y almacena las imágenes de los objetos que como las percibimos usando solo los ojos.

Ahora si, vamos con las matemáticas de las proyecciones paralelas. Para obtener los puntos en el palano de proyección a partir de sus coordenadas (x,y,z) lo único que tenemos que hacer es tomar directamente la X y la Y e ignorar Z. Es decir que X_Proyectada = X, Y_Proyectada = Y y Z se ignora. Para crear un volumen de vista paralelo basta con definir los valores máximos y mínimos del puerto de vista en el plano de proyección y los valores que ubican a los planos frontal y posterior.

Como dije al principio, las proyecciones paralelas se relacionan directamente con el dibujo en ingenieria. El dibujo de ingeniería, a diferencia del dibujo artístico no está pensado para ser estético, ni siquiera para parecerse al mundo que conocemos a nivel visual. En el dibujo técnico lo que importa son las medidas cuantificables en números y no las proporciones. Incluso si tomáramos todos los tipos de lápices que existen y los ordenáramos del mas blando al mas rígido. Los lápices usados por los artistas y los ingenieros quedan en los extremos opuestos de esas escalas, quedando el lapiz escolar justo en la mitad.

Siguiendo con el tema del dibujo de ingeniería. Mucho antes de que se inventaran los gráficos en tiempo real los dibujantes de máquinas creaban vistas múltiples de una misma pieza. Vistas frontal, lateral y superior. Dividían una hoja en 4 partes y junto con estas vistas planas incluian una vista en perspectiva para mostrar la pieza de manera entendible. De ese modo. El dibujo en perspectiva les daba una idea a los constructores de lo que iban a armar y las otras vistas los datos para poder armarlas.

Por cierto, en dibujo de ingeniería existen otras vistas generadas en la antiguedad que intentaban simular una proyección en tres dimensiones. Estas vistas solo las voy a mencionar por nombre esta vez, se trataban de la vista isométrica, axonométrica y caballera. Para que me entiendan los mas gamers, la vista isométrica se usó en algunos juegos antiguos de aventuras en la que los cuartos parecían ser vistos desde una de sus esquinas superiores como en el juego Diablo de Blizzard. La axonométrica es la que se usó en los primeros juegos de estrategia en tiempo real exitosos y permitía ver los objetos de frente y un costado como en el primer Starcraft y la caballera o de gabinete es la vista que se maneja en los juegos del género beat’em up como el Final Fight. Estas vistas aunque parecen tener profundidad en realidad son proyecciones paralelas y la manera de lograrlas es haciendo que el centro de la ventana no corresponda directamente con el punto de referencia de proyección. Cuando se hace esto el volumen de vista se tuerce como una pila de libros desbalanceada. Y luego por medio de una matriz de Shear o Sesgo que endereza la pila pero mantiene paralelos los planos de proyección, frontal y posterior del volumen de vista. Cuando se aplica esa transformación, todos los objetos contenidos en el volumen de vista se tuercen y quedan en la forma de la vista que queremos. Mas adelante les voy a hablar de este sesgo de vista que por cierto también se aplica a nuestra ya conocida proyección en perspectiva.

Ejemplo de Proyección Paralela

Ahora veamos un ejemplo de proyección paralela. En la imagen vemos una escena escena con 3 cubos marcados con las letras A, B y C. El punto de referencia de proyección se encuentra en (0,0,10) El valor del plano posterior B es igual a 2 y el frontal F a 10. El punto de referencia visual VRP que corresponde con el centro del plano de proyección es (0,0,7). La posición de los cubos se muestra en las vistas lateral y superior. Los valores xmin, ymin, xmax,ymax son -2, -2, 2, 2. Y multiplicamos la vista final por un factor de 2 para poder representarla en la hoja a tamaño legible. Para entender mejor los datos de este volumen de vista paralelo voy a usar una hoja de triturado numérico:

;VOLUMEN DE VISTA PARALELO

VRPz	= 7		;coordenada z del punto de referencia visual
B 		=  2	; Plano posterior o Backplane
F		= 10	; Plano frontal
XMIN	= -2	;X minima de la ventana
YMIN	= -2	;Y minima de la ventana
XMAX	=  2	;X máxima de la ventana
YMAX	=  2	;Y máxima de la ventana

ESCALA  =  2	;factor de escala para ampliar la vista final

;VERTICES DEL CUBO A	
 A_1 	= 0, 0, 9
 A_2	= 1, 0, 9
 A_3	= 1,-1, 9
 A_4	= 0,-1, 9
 A_5 	= 0, 0, 8
 A_6	= 1, 0, 8
 A_7	= 1,-1, 8
 A_8	= 0,-1, 8

;no pongo los vértices de los cubos B y C porque esos pueden leerlos directo del dibujo

Como recordarán de la introducción a la vista 3D. Las lineas proyectoras pasan en linea recta hacia el plano de proyección sin llegar a tocarse nunca entre ellas (de ahí lo de paralelas). Y es aquí que vemos que la proyección paralela es sumamente sencilla. Basta con tomar directamente las coordenadas X,Y e ignorar la Z. Así que vamos a triturar los vértices del cubo tomando solo sus coordenadas x,y y luego multiplicamos por el factor de ampliación para obtener las coordenadas finales. Va otra hoja de triturado numérico.

;PROYECCION PARALELA DEL CUBO A

;primero proyectamos al plano tomando x,y e ignorando z. Usamos P para no perder los valores originales del cubo A al proyectar.

 P_1 	= 0, 0
 p_2	= 1, 0
 p_3	= 1,-1
 p_4	= 0,-1
 p_5 	= 0, 0
 p_6	= 1, 0
 p_7	= 1,-1
 p_8	= 0,-1

 ;ahora escalamos por el factor ESCALA para obtener los puntos en la hoja. Recuerden que los pasos se cuentan desde el origen en el centro.

 p_1 	= 0, 0
 p_2	= 2, 0
 p_3	= 2,-2
 p_4	= 0,-2
 p_5 	= 0, 0
 p_6	= 2, 0
 p_7	= 2,-2
 p_8	= 0,-2

Ahora tenemos los 8 vértices del cubo A proyectados y escalados para poder dibujarse e una cuadrícula de 8 por 8 como la que vemos en la última foto. De momento vamos a dejarlo en el modo puramente matemático, pero ya verán al final de esta serie que incluso es posible obtener directamente las coordenadas de pixel en pantalla por medio de una transformación para al final en lugar de escribir vértice a vértice se copie toda la imagen con una sola transferencia de memoria. Así que por ahora cuenten desde el centro de nuestra “pantalla” de 8 por 8 cuadros en papel. De momento solo les he mostrado el cubo A, pero con las fotos que les he dado pueden calcular los vértices de los cubos B y C y transformarlos con las mismas operaciones ustedes mismos.

En la imagen pueden verse dos cosas. La primera es que aunque los cubos están a diferente distancia del plano de proyección todos tienen las mismas medidas como si estuvieran todos a la misma distancia. Solo podemos ver sus caras frontales. Esta vista lo que nos dice es que los cubos tienen las mismas medidas. Incluso podemos confirmarlo con solo ver la cuadrícula. Si la profundidad es demasiado importante inculso podemos mostrar los cubos en direrentes colores para indicar la profundidad a la que se encuentran sin perder la información sobre sus medidas. Que es lo mismo que los ingenieros conocen como ‘curvas de nivel’.

Antes de cerrar esta entrada, hablemos un poco sobre la proyección paralela. Para empezar, la proyección paralela es un caso particular de la proyección en perspectiva. Pues se trata del caso particular en que el ojo del observador se haya a una distancia infinita del objeto que queremos proyectar. Pues conforme el observador se aleja los rayos proyectores se vuelven mas y mas paralelos entre si. Esto puede expresarse de manera algebráica. Pero eso lo veremos mas adelante cuando unifiquemos los dos tipos de proyección en una misma matriz de vista. Por ahora pónganse a programar y recuerden que aunque no necesiten la proyección paralela para el gameplay de su juego si les va a ser muy util si algún dia quieren hacer su propio editor de gráficos 3D.

Anuncios

marzo 14, 2012 - 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: