È tutt'altro che raro, specialmente in giochi o in modelli architettonici, che l'utente possa camminare o volare all'interno del mondo tridimensionale.
Per questo esempio useremo la stessa scena sfruttata nell'esempio per i filtri (ma senza filtro blur); la scena è stata però modificata leggermente in maniera da mostrare meglio il pavimento del mondo.
Per muoverci, anche questa volta, associamo una funzione all'evento onRenderEVENT
world.addEventListener( World3D.onRenderEVENT,this, cameraMove );
La funzione cameraMove
ha invece il seguente codice:
Listato 77. Imposta le azioni in base ai tasti premuti
function cameraMove(){
if (Key.isDown (Key.UP)) { cam.moveForward(20); }
if (Key.isDown (Key.DOWN)) { cam.moveForward(-20); }
if (Key.isDown (Key.LEFT)) { cam.rotateY(-3); }
if (Key.isDown (Key.RIGHT)) { cam.rotateY(3); }
// Altezza da terra
if (Key.isDown (Key.PGUP)) { cam.moveUpwards(-3); }
if (Key.isDown (Key.PGDN)) { cam.moveUpwards(3); }
}
Il codice è simile all'esempio precedente, in questo caso le frecce sono usate per muovere la telecamera o per ruotarla lungo il suo asse y. Utilizzando i tasti PageUp (pagina su) e PageDown (pagina giù) sarà possibile cambiare l'altezza da terra della telecamera.
Ecco il risultato:
Movimento delle telecamera all'interno del mondo
In alcuni casi è più comodo e veloce navigare usando il mouse. Possiamo includere questa possibilità controllando se il mouse sia o menu premuto e di conseguenza abilitando o meno il movimento, così:
Listato 78. Include gli eventi del mouse
onMouseDown = function(){
// Quando il mouse è premuto attiva il movimento via mouse
moving = true;
}
onMouseUp = function(){
// Se il mouse non è premuto, il movimento avviene via tastiera
moving = false;
}
Aggiungiamo anche questo codice alla funzione cameraMove
:
Listato 79. Calcola la distanza
if( moving ){
var rot = ( _xmouse - midX )/100;
var forward = ( midY - _ymouse )/5;
cam.moveForward( forward );
cam.rotateY( rot );
}
La distanza tra l'origine e la posizione X del mouse viene divisa e utilizzata per la rotazione sull'asse Y, mentre la distanza tra l'origine e la posizione Y del mouse viene divisa in maniera minore ed è usata per i movimenti avanti e indietro.
Il fattore di divisione può essere variato per rendere i movimenti e le rotazioni più o meno rapidi: non c'è una regola generale sui valori ottimali, bisogna provare per trovare la soluzione migliore per le proprie esigenze.
"© Petit Publications 2006" - diritti riservati