2013-07-08 25 views
5

padelle camera.rotate.y a sinistra oa destra in modo prevedibile.Three.js fotocamera inclinare verso l'alto o verso il basso e mantenere il livello dell'orizzonte

camera.rotate.x guarda in alto o in basso in modo prevedibile quando camera.rotate.y è a 180 gradi.

ma quando cambio il valore di camera.rotate.y in qualche nuovo valore, e poi cambio il valore di camera.rotate.x, l'orizzonte ruota.

Ho cercato un algoritmo per regolare la rotazione dell'orizzonte dopo che camera.rotate.x è stata modificata, ma non l'ho trovata.

risposta

10

In three.js, l'orientamento di un oggetto può essere specificato dal relativo vettore di rotazione di Eulero object.rotation. Le tre componenti del vettore di rotazione rappresentano la rotazione in radianti rispettivamente attorno all'asse x interno dell'oggetto, all'asse ye all'asse z.

L'ordine in cui vengono eseguite le rotazioni è specificato da object.rotation.order. L'ordine predefinito è "XYZ": la rotazione intorno all'asse x avviene prima, quindi l'asse y, quindi l'asse z.

Le rotazioni vengono eseguite rispetto al sistema di coordinate interno- non al sistema di coordinate del mondo. Questo è importante. Quindi, ad esempio, dopo la rotazione x, gli assi y e z dell'oggetto in genere non saranno più allineati con gli assi del mondo. Le rotazioni specificate in questo modo non sono uniche.

Così, per esempio, se nel codice si specifica,

camera.rotation.y = y_radians; // Y first 
camera.rotation.x = x_radians; // X second 
camera.rotation.z = 0; 

le rotazioni vengono applicate nell'oggetto del rotation.order, non nell'ordine in cui li specificato.

Nel tuo caso, potresti trovare più intuitivo impostare rotation.order su "YXZ", che equivale a "titolo, intonazione e rotazione".

Per ulteriori informazioni sugli angoli di Eulero, vedere Wikipedia article. Three.js segue la convenzione di Tait-Bryan, come spiegato nell'articolo.

three.js r.61

+0

Il tuo commento ha funzionato. All'inizializzazione dell'oggetto fotocamera, ho aggiunto la seguente riga di codice, 'camera.eulerOrder =" YXZ ";' –

+1

Ora è 'camera.rotation.order = 'YXZ';' – WestLangley

+0

Non intendi "imbardata, passo e rotolare "? :) – fuzz

Problemi correlati