|
||||||
ROBOTICA
video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori
Il nodo Billboard |
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 :
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 ;)
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.
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
}
#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 }
}
]
}
]
}