Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Programación Gráfica: Volumen de Vista y Zoom

–Como funcionan las miras de los First Person Shooters–

Esta es la continación de la entrada anterior sobre el volumen de vista. Como ya vimos, se trata de un volumen en forma de pirámide cuya punta termina en el ojo del observador y que contiene la porción del mundo que abarca el campo visual del jugador. Lo que vamos a ver hoy es como funciona este volumen de vista y como si sabemos controlar sus parámetros podemos crear efectos como el de una mira telescópica de un rifle de francotirador, cámaras capaces de obtener primeros planos de objetos móviles o con un poco de práctica obtener tomas grupales mas cinematográficas de manera automática.

En la primera imagen vemos una corte lateral del típico volumen de vista. Las diagonales inclinadas son definidas por las dimensiones de la pantalla y las lineas verticales de colores los planos frontal y posterior. El mas importante, aunque no forma propiamente parte del volumen, es el representado por la linea verde que es el plano de proyección. Cuando vamos a generar una vista 3D lo que hacemos es cortar la porción del mundo que queda dentro de la pirámide y luego proyectar aquello que quede dentro sobre el plano de proyección con las ecuaciones de proyección en perspectiva que discutimos hace ya tiempo. La linea punteada indica la dirección en la que el jugador está viendo. Esta linea de vista pasa exactamente por el centro de todos los planos.

Lo primero que necesitamos entender para comprender el volumen de vista es que los 3 planos de colores son siempre paralelos entre si. De ese modo la distancia entre ellos puede reducirse a una simple cantidad escalar en lugar de una compleja estructura de datos vectoriales. Lo segundo es que los valores que definen el volumen de vista están dados en coordenadas de referecia visual. La tercer cosa es que el corazón del volumen de vista se sitúa justo en el centro del plano de proyección, que correspondería con el centro de la pantalla y por donde pasa la linea de vista. Una cuarta cosa que confunde mucho a los principiantes es que el volumen de vista se abre en dirección opuesta a la que indica el vector que define el plano de proyección. Esto hace que el número que indica el alcance del campo visual sea cada vez menor conforme la distancia de vista aumenta. Esto es completamente contraintuitivo pero es necesario para que los cálculos funcionen.

Si somos conscientes de estas cuatro cosas podremos definir un volumen de vista de cualquier proporción y longitud con tan solo 6 valores. Ahora veamos con detenimiento cada una de las partes que componen un volumen de vista 3D.


Como definir un Volumen de Vista

En la segunda imagen se ve el volumen de vista con mayor detalle. El corazón del volumen de vista está a la mitad de la linea vertical verde marcada como VRP (view reference pointo o punto de referencia visual) que como recordarán indica el punto central del plano de proyección. Este punto es muy importante porque todos los demás números se relacionan con este.

El ojo, o punto de referencia de proyección PRP queda en la punta de la pirámide. Si a este punto le restamos las coordenadas del punto de referencia visual obtenemos las componentes del vector normal al plano de proyección VPN. Este vector es común no solo para el plano de proyección sino también para los planos frontal y posterior. Mas adelante verán que el punto donde se situá el ojo al final corresponde con el origen de un transformado y muy óptimo sistema de coordenadas de referencia visual.

Xmin,Ymin,Xmax,Ymax.-Son 4 valores que indican las dimensiones de la pantalla. Mientras mas grandes sean estos valores mayor será el tamaño de la imagen que se va a generar en pantalla y por consiguiente el volumen de vista será mas amplio. Xmin y Ymin son las coordenadas de la esquina inferior izquierda de la pantalla y Xmax, Ymax las de la superior derecha. Pueden ser simétricas repecto a la pantalla. Estos valores no solo definen la amplitud del volumen de vista sino que nos permiten mostrar la imagen en diferentes tipos de monitores o tamaños de ventanas en un ambiente gráfico. Y por supuesto se considera que estos puntos son coplanares al plano de proyección.

Plano Posterior.- Mostrado en azul es el plano que limita la distancia máxima hasta donde se puede ver con claridad. Y aquí es donde comienza la confusión. Pues este número debe de ser menor que el valor que define el plano fronta.

Plano Frontal.- Mostrado en rojo. Es el plano que queda frente al ojo del jugador y que es el que evita que los objetos entren en su ojo (lo que generaría una división entre cero) El número que define el plano frontal debe de ser MAYOR que el del plano de posterior.

Plano de ProyecciónMostrado en Verde, aunque este no es precisamente parte del volumen de vista es importante asegurarnos que se encuentre en un punto entre los planos frontal y posterior, y para que esto suceda la componente Z (N en coordenadas de vista) del punto de referencia visual que indica el centro de la pantalla sea mayor que el valor del plano posterior pero menor.

Como la relación entre los números que definen los planos de proyección, frontal y posterior son completamente contraintuitivos (palabra que significa que algo en realidad es opuesto a como uno podría imaginarse que es) voy a explicarlo con otro dibujo. En la siguiente imagen tenemos un volumen de vista a lo largo de un eje horizontal. Este eje horizontal es la normal a los planos frontal (rojo), de vista (verde) y posterior (azul). El ojo o punto de referencia de proyección se encuentra en 16, el valor de F que define el plano frontal es 13, la componente z del punto de referencia visual VRP y que coincide con el centro de la pantalla es 10, el valor de B que define el plano posterior es 4. En la parte de abajo pueden verse lineas de colores mas gruesas que indican los valores de B, VRPz y F en términos absolutos. Por el lado izquierdo se tienen los valores máximos y mínimos de la vertical de la pantalla Ymin y Ymax. Es importante recordar siempre que en el sistema de coordenadas de referencia visual la normal al plano de proyección que se despliega en pantalla sale del monitor en dirección al usuario. Así que el volumen de vista se extiende en dirección opuesta a esa normal que en términos físicos sería hacia dentro del monitor.

Les aconsejo que jueguen con estos valores para obtener diferentes volúmenes de vista. El del ejemplo es un caso de un volumen de vista simétrico en el que la linea de vista coincide con el vector normal a los 3 planos. Pero este no es siempre el caso. Como cuando uno camina por la calle y mira de reojo hacia un lado sin girar la cabeza. Para lograr este efecto se dan valores máximos y mínimos de la ventana que no sean simétricos. Digamos que queremos hacer una pantalla de 4 unidades de alto por 4 de ancho, los valores simétricos serían -2,-2, 2, 2. Quedando el centro de la pantalla en 0. Pero también podríamos hacer que los límites fueran 0,0,4,4. Esto sin cambiar la posición del ojo o punto de referencia de proyección. Para poder procesar este tipo de vista se usa una extraña operación llamado Sesgo de Vista que reacomoda los planos y los realinea con la linea de vista ideal. Reacomodando con ello parte del mundo. Este tema se discutirá mas adelante porque también se aplica a la proyección paralela.


Como Simular una Mira Telescópica

Ahora veamos como controlando los 6 valores del volumen de vista podemos simular una mira telescópica en un juego de disparos en primera persona. En algunos juegos antiguos se simulaba la visión telescópica simplemente creando otra cámara que se acercaba al objetivo. Esto causaba algunos errores muy tontos en algunos juegos como por ejemplo que el personaje pudiera verse su propia nuca si se acercaba al objetivo lo suficiente. Por no mencionar que el temblor de las manos que hace tan emocionantes los tiros a largo alcance tenía que ser simulado. En fin, unos pocos juegos si implementaban la mira telescópica del modo que vamos a ver ahora mismo.

En las últimas imagenes se ven los dos casos. En ambos se tiene la misma situación en la que el jugador tiene frente a si a su oponente a una distancia fija. En la vista sin ampilificar tenemos F = -1, VRPz = -4 y B = -8 mientras que en la amplificada tenemos F = -1 VRPz = -3 y B = -7. La razón del signo negativo es porque el punto cero coincide con el ojo del tirador y la normal a los planos crece hacia la izquierda. Y la razón por la que estos 3 valores no son iguales como pretendía que fuera en un inicio es por simple descuido mio. En el recuadro inferior de cada toma tenemos la proyección que genera ese volumen. Los valores de Xmin, Ymin,Xmax y Ymax son -1, -1, 1, -1. que generan una imagen de 2 por 2 unidades que a su vez ha sido escalada por un factor de 2 para ampliarla y hacerla mas visible en un cuadro de 4 por 4. En la imagen que percibe el jugador puede ver a su oponente de las rodillas hacia arriba y aunque puede atinarle no puede hacer un tiro de mucha precisión. Veamos los datos de esta vista como los ve la computadora:

;VISTA SIN AMPLIFICAR
;el origen est\a en la cabeza del tirador 
;el volumen crece en sentido contrario a la normal de los planos
;la normal de los planos va hacia la izquierda

F: 		-1 	; plano frontal F en rojo
VRPz: 	-4	;plano de proyecci\on en verde. Coordenada z del VRP
B: 		-8		;plano posterior B en azul

;coordenadas inferior izquierda y superior derecha de la apertura de la ventana.
xmin: -1	
ymin: -1
xmax:  1
ymax:  1

Ahora veamos que sucede en la escena amplificada de la imagen.

Del lado derecho tenemos exactamente la misma situación con los dos personajes parados en el mismo sitio. Los valores de F, VRPz y B siguen siendo los mismos. Pero ahora los valores de Xmin, Ymin, Xmax y Ymax son -0.5, -0.5, 0.5 y 0.5. Con lo que el volumen de vista se estrecha tal y como pasa como si nos asomáramos por una mira telescópica. Como ahora tenemos un plano de uno por uno mostrado en una pantalla de 4 por 4 unidades el resultado es un acercamiento en el que podemos ver con mayor detalle la cabeza y parte del pecho del personaje oponente. Si el cambio no se hace en un solo paso sino en incrementos o decrementos pequeños pueden lograrse efectos drámáticos de acercamiento y por supuesto replicar los movimientos de modo mas realista.

;VISTA AMPLIFICADA
;el origen est\a en la cabeza del tirador 
;el volumen crece en sentido contrario a la normal de los planos
;la normal de los planos va hacia la izquierda

F: 		-1 	; plano frontal F en rojo
VRPz: 	-3	;plano de proyecci\on en verde. Coordenada z del VRP
B: 		-7		;plano posterior B en azul

;coordenadas inferior izquierda y superior derecha de la apertura de la ventana.
xmin: -0.5	
ymin: -0.5
xmax:  0.5
ymax:  0.5

Otros efectos que pueden lograrse es el de encuadre. En el que se definen puntos en el propio objetivo que correspondan directamente con los límites de la ventana o asociar directamente el punto de referencia visual a un objetivo para obtener primeros planos. Puede crearse la ilusión de que algo pasa a mucha velocidad por delante del jugador (como un avión supersónico en un juego de simulador de vuelo) con tan solo deslizar los valores mínimos y máximos de la pantalla en un sentido u otro. Y por supuesto ajustar la vista a diferentes tamaños de ventanas y monitores, que es la función mas importante de esos valores.

Para los que no entendieron la explicación del párrafo, seguido de cada una de las imágenes se muestran los datos del volumen de vista en el formato de triturado numérico.

Ya para terminar por hoy quiero comentarles sobre las ventajas y desventajas de la proyección en perspectiva. La principal ventaja es que es realista en el sentido que imita como los humanos ven su mundo. Es buena para un juego o una animación. Pero no en situaciones en las que necesitamos manipular objetos de manera interactiva como lo haríamos en un editor 3D. En la siguiente entrada vamos a discutir sobre otro tipo de proyección que aunque no es realista vence todas estas limitantes. De momento sigan programando y recuerden que en este curso de introducción a la programación gráfica no necesitan de grandes conocimientos o computadoras muy avanzadas. Así que no se dejen asustar cuando alguien venga a decirles que eso de hacer 3D es algo inalcanzable.

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: