Politecnico di Milano - Facoltà del design

Appunti di VRML per gli studenti del laboratorio di computer grafica C2
Parte 6: cambiamento di scala

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


Cambiamento di scala

Cambiare la scala a un sistema di assi significa, in pratica, rimpicciolire o ingrandire ciò che contengono (a seconda se il rapporto di scala è minore o maggiore di 1). Anche per questo scopo si usa il nodo Transform. Il campo da usare sarà scale, che accetta tre valori, corrispondenti alla variazione lungo gli assi X Y Z. Se si danno tre valori uguali, si otterrà un normale cambiamento in scala, mentre se si danno valori diversi si otterranno delle deformazioni (cioè, si deforma in una direzione più che in un altra).

Normalmente, il centro di scala è l'origine degli assi (cioè, gli oggetti si "gonfiano" o si "restringono" rispetto al loro centro). Si può però anche specificare un punto diverso, cosa utile per mantenere fissa una determinata parte dell'oggetto. Per esempio, se si vuole fare un modello di un albero che cresce, il punto fisso sarà la base del tronco, in modo che l'albero si estenderà solo verso l'alto, e non anche verso il basso. Per fare questo si usa il campo center, che accetta una terna di valori X Y Z (è lo stesso campo center che si usa per specificare il centro di rotazione).

Si può anche usare questa trasformazione per applicare un cambiamento di scala rispetto a un sistema di coordinate diverso rispetto ai tre assi standard. L'effetto pratico sarà una deformazione "diagonale". A tale scopo si usa il campo scaleOrientation, che in quanto rotazione richiede quattro numeri (un asse e un angolo). Questa rotazione si applica solo durante l'operazione di cambiamento di scala, e viene annullata subito dopo. In pratica, alla fine di questa operazione gli assi saranno immutati, ma l'oggetto sarà stato deformato nella direzione specificata.

Esempi

Esempio 14: cambiamento di scala lungo un asse

Creiamo una sfera e raddoppiamo le sue dimensioni lungo l'asse verticale (per gli altri due assi specifichiamo un rapporto di scala di 1, che vuol dire nessun cambiamento).

#VRML V2.0 utf8
Transform {
scale 1.0 2.0 1.0
children [
Shape {
appearance Appearance {
material Material { diffuseColor 0.8 0 0.8 }
}
geometry Sphere { }
}
]
}

Esempio 15: traslazione e cambiamento di scala

Creiamo una sfera, e poi facciamone un duplicato grande il doppio, spostandolo un po' verso destra

#VRML V2.0 utf8
Group {
children [
DEF palla Shape {
appearance Appearance {
material Material {
diffuseColor 0.0 0.2 0.8
}
}
geometry Sphere { }
},
Transform {
scale 2 2 2
translation 4 0 0
children [
USE palla
]
}
]
}

Esempio 16: cambiamento di scala specificando il centro

Il secondo cono è alto il doppio del primo, ma specifichiamo il centro di trasformazione in corrispondenza della base. In questo modo, il cono si estenderà soltanto verso l'alto, mantenendo la base nella stessa posizione del primo cono.

#VRML V2.0 utf8
Group {
children [
DEF cono Shape {
appearance Appearance {
material Material {
diffuseColor 0 0.8 0
}
}
geometry Cone {
bottomRadius 1
height 2
}
},
Transform {
translation 2 0 0
scale 1 2 1
center 0 -1 0
children [
USE cono
]
}
]
}