"Billboarding" y Colisiones.

Tutorial de VRML97

"Billboarding"

Esta técnica se utiliza mucho en gráficos 3D a tiempo real para representar objetos que tendrían una geometria muy compleja si fueran modelados en polígonos. Lo que se hace es texturar un solo polígono con la textura del objeto en cuestión y se le da la propiedad de "billboard" o "valla publicitaria", con la cual se consigue que el polígono siempre esté encarado hacia el observador. Con esto se consigue que nunca se descubra el "truco" porque el usuario nunca verá el polígono de perfil. En VRML97 esto se consigue mediante el node Billboard. Veamos un ejemplo:

Ejemplo1: Definición de un arbol mediante un billboard.


Billboard {
	axisOfRotation 0 1 0
	children Shape {
		geometry IndexedFaceSet {
			coord Coordinate {
				point [ 2 3 0, -2 3 0, -2 -3 0, 2 -3 0 ]
			}
			coordIndex [ 0 1 2 3 ]
			solid FALSE
			texCoord TextureCoordinate {
				point [ 1 1, 0 1, 0 0, 1 0 ]
			}
		}
		appearance Appearance {
			texture ImageTexture {
				url "redwood.gif"
			}
		}

	}
}

Lo que definimos es un polígono con las proporciones de nuestra textura de arbol (para que no se deforme), le aplicamos la textura del arbol con transparencia en las zonas que no son arbol, y lo definimos como hijo del node Billboard. El otro dato que debemos definir es el eje de rotación respecto al cual ha de pivotar nuestro polígono.

Como el eje que hemos definido es el Y, entonces sólo nos seguirá si nos movemos en un plano perpedicular a este eje. Si nos movemos hacia arriba o abajo, podemos perder el efecto deseado.

Colisiones

La deteccióa de colisiones puede ser muy importante en algunos casos y el VRML97 permite una detección parcial. Parcial en el sentido que tan solo da mecanismos para detectar colisiones entre el observador (punto de vista virtual) y los objetos, pero no entre objetos.

El mecanismo para activar y desactivar la detección de colisiones funciona a partir de un nodo de agrupación: el node Collision. Este se utiliza de manera que agrupa una lista de objetos los cuales no se desea que el observador pueda atravesar. Veamos un ejemplo:

Ejemplo2: Definición de un grupo de colisión.


Collision {
	collide FALSE
	children [
		Transform {
			translation -3 0 0
			children Shape {
				geometry Box { size 2 2 2 }
				appearance Appearance { material Material { diffuseColor 1 0 0 } }
			}
		}
	]
}

Collision {
	collide TRUE
	children [
		Shape {
			geometry Sphere { radius 1 }
			appearance Appearance { material Material { diffuseColor 0 1 0 } }
		}
		Transform {
			translation 3 0 0
			children Shape {
				geometry Cone { height 1 bottomRadius 1 }
				appearance Appearance { material Material { diffuseColor 0 0.5 1 } }
			}
		}
	]
}

En este ejemplo, el observador puede atravesar el cubo pero en cambio no puede atravesar ni la esfera ni el cono. Como se puede apreciar, ponemos el cubo dentro del grupo de colisión con la propiedad de colisión FALSE. Esto lo hacemos porqué la especificación del VRML97 dice que los browsers, por defecto, habrán de detectar colisiones con todos aquellos objetos en que no se haya definido el comportamiento explícitamente.


Ejercicios propuestos:

Bosque
Diseñar un Bosque con arboles hechos de billboard.
Comentarios
  • Utilizar el prototipage de objetos.
Solución propuesta: bosc.wrl.




< Anterior | Menú ^ | Siguient >