ROBOTICA

video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori

links

 

Papers
meccanica
sistemi
documents

Capitolo 27° Il nodo Billboard Capitolo 29°

A riprova di quanto dicevo precedentemente, la prima parte degli ‘approfondimenti’ riguarda appunto un semplicissimo nodo, che per motivi di spazio ancora non era stato incluso nella prima parte.

Il nodo Billboard e’ un grouping node (allo stesso modo in cui lo sono Transfrom o Collision). All’interno del suo campo children possono essere dunque specificati diversi nodi (e quindi diverse forme geometriche).

Questo nodo serve per fare in modo che i nodi contenuti nel campo children modifichino il loro sistema di riferimento in funzione della posizione dell’utente. Una applicazione molto frequente e’ quella della simulazione di alberi.

Simulare un albero definendone le parti tramite nodi Shapes potrebbe ben presto portare ad esaurimento, anche se utilizziamo opportuni strumenti di modellizzazione. Un modo molto semplice per simulare un albero potrebbe essere quello di definire un quadrilatero e poi mappare su di esso una texure rappresentante l’albero in questione. Per rendere il tutto piu’ realistico si dovrebbe cercare di avere una texture trasparente, in modo che il background resti inalterato (textures trasparenti possono essere facilmente create con il GIF construction set).

Se non utilizzassimo il nodo Billboard l’effetto che si otterrebbe sarebbe poco realistico ; se un utente si muove e ruota attorno al quadrilatero con la texture, quando sara’ a destra o a sinistra della stessa non vedra’ altro che il semplice lato ; peggio ancora quando osservo il back del quadrilatero, che non verra’ visualizzato se il browser effettua back face culling.

E’ appunto qui che interviene il nodo Billboard. Esso consente all’oggetto di ruotare attorno ad un asse di rotazione in funzione della posizione dell’osservatore. Nel caso del nostro albero, non si dovra’ fare altro che specificare un asse di rotazione pari all’asse y. In tal caso, quando l’utente si muovera’ attorno al quadrilatero, questo ruotera’ in maniera opportuna, in modo che il visitatore avra’ sempre di fronte a se la texture rappresentante l’albero. < P> A questo punto dovrebbe essere estremamente chiara la specifica del nodo che riporto qui sotto :

Billboard {
  eventIn       MFNode     addChildren 
  eventIn       MFNode     removeChildren  
  exposedField  SFVec3f    axisOfRotation  0 1 0
  exposedField  MFNode     children        []
  field         SFVec3f    bboxCenter      0 0 0
  field         SFVec3f    bboxSize        -1 -1 -1
}

Ormai chiari dovrebbero essere i campi axisOfRotation e children.

BboxCenter e bboxSize servono per definire la bounding box che contiene gli oggetti contenuti nel campo children (per bounding box si intende appunto un parallelepipedo che congloba gli oggetti considerati).

Il valore di default di bboxSize serve ad indicare al browser di procedere a calcolare la dimensione della bounding box automaticamente.

Gli ultimi due campi vengono per il momento tralasciati. Essi sono degli eventIn e possono servire per modificare a run-time i nodi all’interno del campo children (aggiungendo o togliendo nodi).

Qui di seguito riporto un semplice esempio di utilizzo del nodo Billboard. Devo ammettere che la parte piu’ complicata di questo esercizio e’ stata quella di trovare una texture opportuna. Alla fine mi sono ridotto a grabbare una immagine dal Web e ho provveduto ad annullare le componenti di colore diverse dal verde (!) in modo poi da avere un colore da rendere trasparente. Il risultato finale mi ha comunque soddisfatto ;)

#VRML V2.0 utf8
# esempio di utilizzo del nodo Billboard
# luce direzionale
DirectionalLight {
	direction 0 -1 -1 
}
#tolgo le headlight
NavigationInfo {
	headlight FALSE
}
# background (terra di colore verde e cielo azzurro)
Background {
	skyAngle [1 1.57 3.14]
	skyColor [0 0 1, 0 0 1, .6 .6 1, 0 0 1]
	groundAngle [ 0 1.57]
	groundColor [0 1 0, 0 .8 0 ,  0 .6 0]
}
# posizione di partenza dell’osservatore
Viewpoint {
	position 0 4 20
}
#definisco un semplice piano
Shape {
  appearance Appearance {
    material Material {  diffuseColor 0 .8 0 }
  }
  geometry Box { size 100 .5 100 }
}
Transform {
 translation 0 5 0
 children [
  Billboard {
   axisOfRotation 0 1 0 
   children [
     Shape {
	appearance Appearance {
	  material Material { diffuseColor .7 .7 1 }
	  texture ImageTexture { 
	   url “../textures/generali/plant2.gif” 
	  }
	}
	geometry Box { size 8 10 .01 }
      }
    ]  
  }
 ]
}

Albero

In questo caso anziche’ usare un piano ho usato una box sottilissima... sarebbe comunque meglio usare un piano; in ogni modo qui non si hanno problemi di efficienza.

Per qualsiasi informazione aggiuntiva vi rimando alle specifiche. Con le conoscenze che dovreste avere a questo punto le specifiche dovrebbero essere piu’ che accessibili.