|
||||||
ROBOTICA
video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori
Il comando ROUTE |
Cominciamo con il risolvere
uno dei due problemi postici nel paragrafo precedente. Come cioè collegare il
campo esportato da un nodo al campo di un nodo che vuole leggere tale valore.
Supponiamo di voler realizzare
una semplice animazione. Vogliamo realizzare un cubo che continua a spostarsi
tra due posizioni ; appena raggiunge un estremo rimbalza e si dirige verso
l’altro estremo.
Se osserviamo con attenzione
come è rappresentato il cubo nel mondo vrml, si nota che la primitiva Box
(usata per realizzare il cubo) non conosce assolutamente nulla circa la sua
posizione. Per realizzare l’animazione quello che dobbiamo fare è modifcare
progressivamente la posizione del cubo. Per farlo dovremo però considerare
un livello gerarchico superiore a quello della primitiva Box, in quanto la
posizione non dipende da essa.
Ricordiamoci che per
posizionare in una posizione desiderata un certo oggetto dobbiamo far ricorso
al nodo Transform, così come indicato di seguito (e visto spesso in precedenza)
:
Quindi, il nodo Transform
è responsabile del posizionamento di tutti i nodi contenuti nel suo campo
children ; in questo caso del solo cubo.
Osserviamo ora la specifica
del nodo Transform
Come si può vedere sono
molto i campi che non abbiamo considerato. Se verranno incontrati in futuro
vedrò di puntualizzarli a dovere. In ogni caso affronterò questi argomenti
negli approfondimenti che verranno messi in linea.
Dopo quanto spiegato
nel precedente paragrafo siamo in grado di osservare un particolare molto
interessante. Il campo translation (responsabile della posizione dei nodi
nel campo children) risulta avere un tipo di interfaccia exposedField. E questo
risulta determinante : vuol dire infatti che possiamo cambiare il contenuto
di questo campo, inserendo dei valori che gli forniremo in qualche modo. Quindi,
se riuscissimo ad avere una sequenza di posizioni che, una dopo l’altra,definiscono
la mia animazione, basterebbe trovare il modo di fornire progressivamente
nel tempo tali posizioni al campo translation del nodo Transform.
Vedremo nel prossimo
paragrafo come generare queste posizioni. Supponiamo al momento di avere un
nodo che abbia un campo eventOut o exposedField che esporta via via questi
valori. Dato per scontato questo, il problema è quello di far comunicare i
due nodi. A tal fine interviene il comando ROUTE. In pratica ROUTE dice di
guidare l’evento prodotto da un certo campo in modo tale che vada a finire
ad un campo desiderato.
La sintassi sarà del
tipo : ROUTE campo di partenza TO campo di destinazione.
Per riuscire ad identificare
in maniera corretta i campi che ci interessano dobbiamo usare il comando DEF.
DEF nome Transform {
... }
Per identificare un certo
campo del nodo Transform basta allora far precedere al nome del campo il nome
del nodo, separandoli con un punto (nomenodo.nomecampo).
In particolare, nel caso
volessimo modifcare la componente translation di un certo nodo Transform che
abbiamo chiamato ‘cubo’, useremo un comando del tipo :
ROUTE campo di partenza
TO cubo.set_translation
Abbiamo visto quindi
come collegare due campi appartenenti a due nodi. Ci rimane da capire come
far generare al nodo di partenza le varie posizioni intermedie che caratterizzano
l’animazione. Questo sarà l’argomento della prossima sezione. Ovviamente nel
processo di generazione dovremo considerare il trascorrere del tempo.
Da ultimo, si noti che
il comando DEF impiegato in questo caso ha un utilizzo molto più ampio che
non solo in caso di comandi ROUTE. Per problemi di tempo e di spazio ancora
non lo avevamo visto ; un impiego molto utile di questo comando lo si ha nel
caso di riuso di nodi già scritti. Tramite il nome si riesce infatti a richiamare
l’intero nodo senza doverlo riscrivere. Vedrò di spiegare meglio questa possibilità
messa a disposizione di Vrml più in là nel tutorial.
Transform {
translation 5 0 0
children [
Shape {
appearance Appearance {
material Material { emissiveColor 1 0 0 }
}
geometry Box { size 1 1 1 }
}
]
}
Transform {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField SFVec3f center 0 0 0
exposedField MFNode children [ ]
exposedField SFRotation rotation 0 0 1 0
exposedField SFVec3f scale 1 1 1
exposedField SFRotation scaleOrientation 0 0 1 0
exposedField SFVec3f translation 0 0 0
field SFVec3f bboxCenter 0 0 0
field SFVec3f bboxSize -1 -1 -1
Si noti bene infatti che in un file avremo spesso molti nodi Transform. Come
facciamo allora ad identificare in maniera univoca il campo di un certo Transform?
semplice ; diamo un nome ai nodi che ci interessano. Per dare questo nome
usiamo appunto DEF. L’utilizzo è semplicissimo. Non si fa altro che far precedere
alla definizione del nodo Transform il comano DEF seguito dal nome. L’esempio
seguente ne mostra la sintassi.