ROBOTICA

video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori

links

 

Papers
meccanica
sistemi
documents

Capitolo 20° Il comando ROUTE Capitolo 22°

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) :

Transform {
  translation 5 0 0
  children [
    Shape {
      appearance Appearance { 
        material Material { emissiveColor 1 0 0 }
      }
      geometry Box { size 1 1 1 }
    }
  ]
}

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

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 

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.
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.

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.