|
||||||
ROBOTICA
video
immagini
papers
progettati
costruiti
toolbox
vrml
simulatori
Traslazioni e rotazioni nello spazio : il nodo Transform |
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.
Come funzionino i nodi
Cylinder e Cone mi pare sia palese. A questo punto serve
dunque una precisazione su come individuare e posizionare elementi nello spazio
in vrml.
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. Il sorgente corretto
risulta il seguente :
Vediamo di analizzare
in dettaglio il nodo Transform. 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. 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.
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.
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 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.
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.
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.
#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
}
}
]
}
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.
Vedremo tra breve come innestare nodi Transform per poter migliorare la situazione
e semplificarci la vita in fase di creazione delle animazioni.
#VRML V2.0 utf8
Transform {
rotation 0 0 1 3.14
children [
Shape {
appearance Appearance {
material Material { emissiveColor 0 1 0 }
}
geometry Cone { }
}
]
}
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.