ROBOTICA

video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori

links

 

Papers
meccanica
sistemi
documents

Capitolo 7° Traslazioni e rotazioni nello spazio : il nodo Transform Capitolo 9°

Nel banale esempio visto nel paragrafo precedente il nostro mondo è composto da una semplice sfera. Ovviamente ci si trova spesso nella necessità di dover inserire più oggetti o di dover costruire un oggetto più complesso creando più sottoparti e poi unendole.
Supponiamo di voler creare un oggetto che sia una rappresentazione molto grossolana di una freccia. In prima approssimazione potremmo usare un cilindro con sopra un cono (non è il massimo della raffinatezza, ma può andare). Consideriamo il seguente possibile listato.


#VRML V2.0 utf8
# freccia 3D : versione 1
Shape {
   appearance Appearance {
       material Material {   emissiveColor .5 .5 0  }
    }
    geometry Cylinder {
	 radius .01
	 height .8              
    }
}
Shape {
  appearance Appearance {
      material Material {  emissiveColor 1 0 0 }
  }
  geometry Cone {
	bottomRadius .03
	height .07
  }
}

Come funzionino i nodi Cylinder e Cone mi pare sia palese.
Come si può vedere, dovendo definire due oggetti abbiamo creato due nodi Shape. Se però visualizziamo la scena creata notiamo che qualcosa non funziona a dovere ; ed è ovvio il motivo. I due oggetti vengono entrambi posizionati nell'origine del sistema di riferimento.

Freccia 1

A questo punto serve dunque una precisazione su come individuare e posizionare elementi nello spazio in vrml.
Gli assi del sistema di riferimento sono individuati nel seguente modo : l'asse z punta verso l'esterno dello schermo ; l'asse x è diretto orizzontalmente lungo lo schermo e punta verso destra ; l'asse y è diretto verticalmente lungo lo schermo ed è diretto verso l'alto. Per cui oggetti a differente y indicano oggetti posti ad altezza diversa ; per spostarsi restando ad una certa quota si modificano le coordinate x e z. Il sistema di riferimento impiegato è indicato in figura.

coordinate x,y,z

Quello che non va nell'esempio iniziale è dunque il fatto che il cono viene posto nell'origine, quando invece dovrebbe essere messo in testa al cilindro. Quando genero il cilindro, esso viene posizionato in modo da porre il suo baricentro nell'origine ; questo implica che il solido si estende da y=-0.4 a y=+0.4. Quello che dovremo fare sarà dunque traslare il cono (che deve fungere da punta per la freccia) di 0.4 in y.
Per effettuare la traslazione occorre inserire un altro nodo : il nodo Transform. Questo nodo svolge diverse funzioni ; per il momento analizzeremo soltanto ciò che riguarda la traslazione.

Il sorgente corretto risulta il seguente :

#VRML V2.0 utf8
# freccia 3D : versione corretta
Shape {
  appearance Appearance {
     material Material {  emissiveColor .5 .5 0  }
} geometry Cylinder { radius .01 height .8 } } Transform { translation 0 .4 0
children [ Shape { appearance Appearance { material Material { emissiveColor 1 0 0 } } geometry Cone { bottomadius .03 height .07 } } ] }

Vediamo di analizzare in dettaglio il nodo Transform.
Il nodo Transform ha un field che si chiama translation. Questo ovviamente indica che bisogna traslare qualcosa di 0.4 unità lungo y. Questo qualcosa da traslare è rappresentato da tutto ciò che è contenuto nel field children. Quindi children è un campo del nodo Transform e indica tutto ciò a cui dovrà essere applicata l'operazione di traslazione. In questo caso il campo children contiene solo un nodo Shape. Si noti come nel caso del field children si raggruppino gli oggetti racchiudendoli tra parentesi quadre.
Il risultato ottenuto sarà ora quello desiderato.

Freccia 2

Possiamo fare ancora un commento sull'esercizio appena completato. Poche pagine fa avevo parlato dell'importanza di strutturare il mondo in una gerarchia di oggetti connessi tra di loro. Quando ho oggetti indipendenti gli uni dagli altri questo non è necessario ; in questo caso sarebbe bene modellizzare diversamente il mondo, in modo da esplicitare la connessione che esiste tra la punta della freccia e l'asta a cui è connessa. Se non ci si preoccupa di introdurre animazioni, allora la cosa potrebbe anche essere inutile. Ma se dovessi animare la freccia, allo stato attuale delle cose dovrei spostare separatamente cilindro e cono per mantenere coerenza.
Vedremo tra breve come innestare nodi Transform per poter migliorare la situazione e semplificarci la vita in fase di creazione delle animazioni.

Vediamo ora un altro campo del nodo Transform che risulta molto utile. Supponiamo di avere un cono e di volerlo ruotare. Il nodo Cone, posto nel campo geometry del nodo Shape, indica soltanto che la primitiva da inserire è un cono. Se non specificato in maniera diversa, si assume un orientamento di default con il cono che ha l'asse parallelo all'asse y. Per ottenere la rotazione del cono si ricorre dunque ad un altro field del nodo Transform, che è appunto il nodo rotation. Il seguente file vrml indica come ruotare un cono.

#VRML V2.0 utf8 
Transform {
  rotation 0 0 1 3.14
  children [
Shape {
appearance Appearance { material Material { emissiveColor 0 1 0 } } geometry Cone { } } ] }

La rotazione viene specificata nel seguente modo. I primi 3 valori indicano l'asse attorno a cui effettuare la rotazione. In questo caso dunque si ruota attorno all'asse z. Il quarto valore indica l'angolo (espresso in radianti) secondo cui ruotare la primitiva. Il verso di rotazione è positivo quando effettuato in senso antiorario. La rotazione specificata viene applicata a tutti i nodi contenuti nel campo children, in questo caso all'unico nodo Shape presente.
Omettendo i parametri di bottomRadius e height per il cono si lasciano attivi i valori di default (2 per l'altezza e 1 per il raggio).
Si noti come risulta immediato effettuare una rotazione rispetto ad un asse qualsiasi.