"Billboarding" y Colisiones.

"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 } }
   }
  }
 ]
}

0 comentarios:

Publicar un comentario