Politecnico di Milano - Facoltà del design

Appunti di VRML per gli studenti del laboratorio di computer grafica C2
Parte 4: trasformazioni; traslazione

© Prof. Giovanni Gigante - Revisione 1 (28 maggio 2003)


Introduzione alle trasformazioni

Nei capitoli precedenti abbiamo visto come costruire forme primitive (cubi, sfere, testo, ecc.) usando il nodo Shape. Come abbiamo visto anche negli esempi, queste forme vengono collocate in corrispondenza del punto (0 0 0), cioè all'origine degli assi del sistema di coordinate del mondo VRML.

E' però possibile definire degli altri sistemi di coordinate, sfalsati, di misura diversa,i o anche ruotati rispetto al sistema generale. L'effetto pratico sarà di creare forme in altre posizioni, di ruotarle, di cambiare la loro scala.
Per esempio, se voglio costruire un cubo in un altra posizione, dovrò definire un nuovo sistema di coordinate sfalsato rispetto a quello generale, e poi costruire il cubo all'interno di questo. Quindi, in VRML non si applicano trasformazioni alle forme, ma piuttosto si applicano trasformazioni ai sistemi di coordinate cartesiane all'interno delle quali si collocano le forme.

I sistemi di coordinate possono essere (e spesso sono) costruiti uno dentro l'altro, a formare una gerarchia.

Questo sistema sembra una complicazione inutile, ma in effetti è molto comodo. Per esempio, immaginiamo di costruire il modello di un'automobile. L'automobile avrà due fari uguali, la cui posizione è definita rispetto al sistema di coordinate dell'automobile (diciamo, due metri avanti e un metro di lato rispetto al centro dell'auto). L'automobile, a sua volta, sarà collocata all'interno di un sistema di coordinate più generale (dove si trova rispetto alla strada). Avere dei sistemi uno dentro l'altro mi permette, per esempio, di spostare l'automobile sulla strada senza dovermi preoccupare dei fari: la posizione dei fari è definita rispetto al sistema di coordinate interno all'automobile, e quindi spostando l'automobile essi verranno spostati assieme a lei (in effetti, "non si accorgeranno neppure" di essere stati spostati, perché il sistema-automobile è immutato al suo interno).

Per applicare una trasformazione a un sistema di coordinate, si usa il nodo Transform. Ciò che esso contiene è ciò a cui si applica la trasformazione. Con questo nodo si possono traslare le forme, cambiarle di scala, deformarle e ruotarle. Si può fare solo una di queste azioni, o anche tutte insieme (es.: se si specifica solo una traslazione, non avverrà altro; oppure si può ordinare una traslazione e una rotazione, ecc.).
Un nodo Transform può essere contenuto, o contenere, altri nodi Transform.

nodo Transform (vedi sotto per ulteriori spiegazioni)
children

I nodi a cui viene applicata la trasformazione; possono essere nodi Group (gruppi) , nodi Shape (forme), o altri nodi Transform ancora.

[ ] (nessuno)
translation Traslazione, espressa come terna X Y Z 0.0 0.0 0.0 (nessuna traslazione)
rotation Rotazione, espressa come asse+angolo: X Y Z A 0.0 0.0 1.0 0.0 (asse Z, e nessuna rotazione)
scale Rapporto di scala lungo i tre assi X Y Z 1.0 1.0 1.0 (nessun cambiamento di scala)
scaleOrientation Rotazione degli assi lungo i quali effettuare il cambiamento di scala. Asse+angolo: X Y Z A 0.0 0.0 1.0 0.0 (asse Z, e nessuna rotazione)
center Centro di rotazione: X Y Z 0.0 0.0 0.0

Traslazione

Per traslare il sistema di riferimento, usare il campo translation del nodo Transform. Questo richiede tre valori, che corrispondono alla traslazione relativamente agli assi X Y e Z rispettivamente.
Dal punto di vista dell'osservatore, spostare lungo l'asse Y significa verso l'alto; lungo l'asse X, verso destra; lungo l'asse Z, verso l'osservatore. (Con valori negativi, si trasla nella direzione opposta).

Esempi

Esempio 9: un cubo giallo e un cono blu (nella posizione di base)

Queste due forme vengono costruite senza applicarvi alcuna trasformazione; vediamo che appaiono tutte e due centrate all'origine degli assi, e quindi si sovrappongono.
Per rendere la cosa più visibile, abbiamo anche reso parzialmente trasparente il cubo:

#VRML V2.0 utf8
Group {
children [
Shape {
# il cubo
appearance Appearance {
material Material {
# giallo e semitrasparente
diffuseColor 1.0 1.0 0.0 transparency 0.5
}
}
geometry Box {
size 2.0 2.0 2.0
}
},
Shape {
# il cono
appearance Appearance {
material Material {
diffuseColor 0.0 0.0 1.0
}
}
geometry Cone {
height 5.0
bottomRadius 1.0
}
}
]
}

Esempio 10: un cono giallo traslato sopra un cubo blu

Se vogliamo ora posizionare il cono sopra il cubo, occorre sollevarlo di 3.5 unità (il cono è alto 5, il cubo 2, e si trovano attualmente centrati tra loro). Per fare questo, occorre applicare una traslazione di 3.5 unità lungo l'asse Y. Circondiamo dunque il nodo Shape del cono con un nodo Transform, nel quale specifichiamo la traslazione:

#VRML V2.0 utf8
Group {
children [
Shape {
# il cubo
appearance Appearance {
material Material {
# giallo
diffuseColor 1.0 1.0 0.0
}
}
geometry Box {
size 2.0 2.0 2.0
}
}, Transform { translation 0.0 3.5 0.0 children [
Shape {
# il cono
appearance Appearance {
material Material {
diffuseColor 0.0 0.0 1.0
}
}
geometry Cone {
height 5.0
bottomRadius 1.0
} } ] }
]
}

Esempio 11: un arco rosso

Ecco un esempio leggermente più complesso. Costruiamo un arco così fatto: due cilindri come colonne, uno spostato a destra e uno a sinistra; un parallelepipedo (box) come architrave, spostato sopra alle due colonne.
Usiamo DEF e USE sia per "riciclare" la forma della colonna che il colore rosso.

#VRML V2.0 utf8
Group {
children [
# colonna di sinistra
Transform {
translation -2.0 3.0 0.0
children [
DEF colonna Shape {
appearance DEF colorerosso Appearance {
material Material {
diffuseColor 1.0 0.0 0.0
}
}
geometry Cylinder {
radius 0.3
height 6.0
}
}
]
},
# colonna di destra
Transform {
translation 2.0 3.0 0.0
children USE colonna
},
# architrave
Transform {
translation 0.0 6.05 0.0
children Shape {
appearance USE colorerosso
geometry Box {
size 4.6 0.4 0.6
}
}
}
]
}