La telecamera può essere animata come qualsiasi altro oggetto. Tuttavia, vista la sua fondamentale importanza, possiede alcune proprietà e funzioni dedicate al movimento.
Orbita intorno ad un oggetto
Ad esempio se desideriamo girare intorno ad un oggetto possiamo usare la funzione orbit:
orbit( pitch:Number, yaw:Number, useDegrees:Boolean = true, target:DisplayObject3D = null):void
oppure scrivere la funzione di rotazione tramite la trigonometria:
camera.x = distanza * Math.cos(t) * Math.sin(p); camera.y = distanza * Math.cos(p); camera.z = distanza * Math.sin(t) * Math.sin(p);
dove t
sono i gradi dell'ascissa, p
dell'ordinata e distanza
il raggio della sfera. In questo modo eliminiamo ad esempio il fastidioso errore dell'orbit di ribaltare la scena ogni volta che compie un giro completo della circonferenza.
Soggettiva
Oltre a ruotare la camera intorno ad un oggetto così da poterlo esaminare, ci capiterà di volerci muovere in soggettiva per esplorare l'ambiente virtuale.
Prima di tutto scopriamo che ogni volta che importiamo una scena esterna questa avrà un sistema di riferimento proprio. Questo fatto potrebbe crearci non pochi problemi, ma possiamo risolverli trasformando il sistema di riferimento della nostra camera tramite
transformView(transform:Matrix3D = null):void
Una volta ottenuto un sistema di riferimento unico, DisplayObject3D
ci mette a disposizione 6 metodi per muoverci comodamente al suo interno:
moveBackward(distance:Number)
moveDown(distance:Number)
moveForward(distance:Number)
moveLeft(distance:Number)
moveRight(distance:Number)
moveUp(distance:Number)
Infine per ruotare rispetto all'asse verticale esiste un apposito metodo
public function yaw(angle:Number):void
Ora abbiamo tutti gli strumenti per poterci muovere all'interno della nostra scena. Ci basterà assegnare le nostre funzioni agli eventi della tastiera così da poter muovere liberamente la nostra camera. Nell'esempio sottostante abbiamo assegnato alle frecce la possibilità di muoverci paralleli al piano come nei giochi 3D in soggettiva.
var tasto =""; stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); function keyDownHandler(event:KeyboardEvent):void { if (event.keyCode==37) tasto= "sinistra"; if (event.keyCode==39) tasto= "destra"; if (event.keyCode==38) tasto= "avanti"; if (event.keyCode==40) tasto= "indietro"; } function onEnterFrame(e:Event):void { if (tasto=="avanti") { camera.moveForward(50); } if (tasto=="indietro") { camera.moveBackward(50); } if (tasto=="sinistra") { camera.yaw(-5); } if (tasto=="destra") { camera.yaw(5); } tasto = ""; renderer.renderScene(scena, camera, viewport); }