Politecnico di Milano - Facoltà del design

Appunti di VRML per gli studenti del laboratorio di computer grafica C2
Parte 5: rotazione

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


Rotazione

Per ruotare un oggetto (cioè, in effetti, il suo sistema di assi) si usa, di nuovo, il nodo Transform. Il campo da utilizzare sarà, questa volta, rotation.
Le rotazioni si esprimono con quattro numeri. I primi tre individuano un asse di rotazione; il quarto numero indica l'angolo di rotazione (cioè, di quanti radianti bisogna ruotare). Alcuni esempi:

per ruotare lungo l'asse verticale (es.: la roulette, la prua di una nave) di 90 gradi 0 1 0 1.57
per ruotare lungo l'asse X (es.: l'alzo di un cannone) di 45 gradi 1 0 0 0.28
per ruotare lungo l'asse Z (es.: il volante di un automobile) di 180 gradi 0 0 1 3.14

qui mostriamo rotazioni lungo un solo asse alla volta, ma fornendo valori contemporaneamente a più di un asse si può far ruotare in una direzione qualsiasi.

Normalmente, il centro di rotazione è l'origine degli assi. Si può tuttavia specificarne uno diverso. Per esempio, se si vuole far ruotare il braccio di una lampada, il centro di rotazione (cioè il punto che rimane fisso) sarà l'estremità del braccio, non il suo centro. Per specificare il centro di rotazione si usa il campo center del nodo Transform.

Esempi

Esempio 12: un asterisco

Creiamo tre cilindri e disponiamoli tutti nello stesso punto, facendoli ruotare di 60 gradi verso destra e 60 verso sinistra. I cilindri ruoteranno attorno al loro centro, e otterremo una forma a stella:.

#VRML V2.0 utf8
Group {
children [
# Primo braccio
DEF braccio Shape {
appearance Appearance {
material Material {
diffuseColor 0.4 0.4 1
}
}
geometry Cylinder {
height 1.0
radius 0.1
}
},
# Secondo braccio
Transform {
# ruoto di +60 gradi lungo l'asse Z
rotation 0.0 0.0 1.0 1.047
children USE braccio
},
# Terzo braccio
Transform {
# ruoto di -60 gradi lungo l'asse Z
rotation 0.0 0.0 1.0 -1.047
children USE braccio
}
]
}

Esempio 13: un braccio snodato

Un esempio più complesso. Costruiamo un braccio snodato attaccato a una base (potrebbe essere l'inizio di una lampada da tavolo).
Questo esempio ha due aspetti interessanti: innanzitutto, specifichiamo i centri di rotazione, per fare in modo che i bracci ruotino rispetto alla loro base, e non rispetto al loro centro. Inoltre, il secondo braccio ha un sistema di coordinate che è contenuto all'interno di quello del primo braccio. In questo modo, la sua posizione è dipendente dal primo braccio, e non dalla base. Si vede che nell'esempio il secondo braccio è ruotato di 90 gradi rispetto al primo, mentre il primo è ruotato di 45 gradi rispetto alla base.

#VRML V2.0 utf8
Group{
	children [

		# La base è un semplice cilindro molto basso, verde scuro
		Shape {
			appearance DEF verdescuro Appearance {
				material Material {
					diffuseColor 0.0 0.7 0.0
				}
			}
			geometry Cylinder {
				radius 1
				height 0.2
			}
		},

		# Il braccio va opportunamente trasformato
		Transform {

			# va spostato in alto in modo che sia appoggiato
			# alla base
			translation 0 1 0

			# ruotato di 45 gradi
			rotation 0 0 1 0.785

			# il centro di rotazione dev'essere in corrispondenza
			# della estremità inferiore, dove tocca la base
			center 0 -1 0

			children [

				# il braccio inferiore è un cilindro slanciato
				DEF braccio Shape {
					appearance USE verdescuro
					geometry Cylinder {
						radius 0.1
						height 2
					}
				},

				# il braccio superiore va messo al posto giusto
				Transform {
					# va spostato in alto
					translation 0 2 0

					# ruotato di 90 gradi
					rotation  0 0 1 -1.57

					# il centro di rotazione è alla base del secondo braccio
					center  0 -1 0

					children [
						# il secondo braccio è un cilindro uguale al primo
						USE braccio
					]
				}
			]
		}
	]
}