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