"Billboarding" i Col.lisions.

Tutorial de VRML2.0

"Billboarding"

Aquesta tècnica s'utilitza molt en gràfics 3D a temps real per tal de representar objectes que tenen una geometria molt complexa com per a ser modelats en polígons. El que es fa, és texturar un polígon amb la textura de l'objecte en qüestió i llavors se li dóna la propietat de "billboard" o "tanca publicitaria", amb la qual s'aconsegueix que el polígon sempre estigui encarat cap a l'observador. Amb això s'aconsegueix que mai no es descubreixi el "truc" per que l'usuari mai no pot veure el polígon de canto. En VRML2.0 això s'aconsegueix amb el node Billboard. Vejam un exemple:

Exemple1: Definició d'un arbre mitjançant 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"
			}
		}

	}
}

El que definim és un polígon amb les proporcions que té la nostra textura d'arbre (per que no se'ns deformi), li apliquem la textura d'arbre amb transparència i el definim com a fill del node Billboard. L'altra dada que cal definir és l'eix de rotació respecte el qual ha de pivotar el nostre polígon.

Com que l'eix que hem definit és l'eix Y, llavors, només ens seguirà si ens movem en un pla perpendicular a aquest eix. Si ens movem amunt o avall, llavors podem perdre l'efecte desitjat.

Col.lisions

La detecció de col.lisions pot ser molt important en alguns casos i el VRML2.0 permet una detecció parcial. Parcial en el sentit que tan sols dóna mecanismes per a detectar col.lisions entre l'observador i els objectes, però en canvi no permet la detecció entre objectes.

El mecanisme per activar i desactivar la detecció de col.lisions funciona a partir d'un node d'agrupament: el node Collision. Aquest s'utilitza de manera que agrupa una llista d'objectes els quals no es vol que l'observador atravessi. Vejam un exemple:

Exemple2: Definició d'un grup de col.lisió.

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 aquest exemple, l'observador pot travessar el cub, però en canvi no pot travessar l'esfera i el con. Com es pot veure, posem el cub dins d'un grup de col.lisio amb la propietat de col.lisio a FALSE. Això ho fem per que l'especificació de VRML2.0 diu que els browsers, per defecte, hauran de detectar col.lisions amb tots aquells objectes en que no s'hagi definit el comportament explícitament.

NOTA: En el moment d'escriure el tutorial (01/97) el Cosmo Player no detecte col.lisions a partir del node Collision. Tan sols detecte col.lisions dient-li a través del menú i no es pot controlar des del codi.

Exercicis proposats:

Bosc
Dissenyeu un Bosc amb arbres fets de billboard.
Comentaris
  • Utilitzeu el prototipatge d'objectes.
Solució proposada: bosc.wrl.




< Anterior | Menú ^ | Següent >