2013-02-11 17 views
16

Jestem pewien, że to pytanie zostało zduplikowane wiele razy, jednak nie mogę znaleźć odpowiedzi na mój konkretny problem!Three.js: Uzyskaj kierunek, w którym jest kamera

Tworzę grę przy użyciu html5 i THREE.js, i mam kamerę, która obraca się z kolejnością Eulera w "YXZ".

To jest tak, że kamera obraca się w górę, w dół, w lewo i w prawo jak w głowę. Jak w widoku pierwszej osoby.

W tej kolejce Eulera właściwość z w camera.rotation nie jest używana (zawsze 0). x służy do określenia wysokości lub szerokości geograficznej w radianach, a y jest używane do określenia długości geograficznej.

Mam wiele celów poruszających się wokół użytkownika w sferyczny sposób, z kamerą stale w środku tej kuli. Powiedzmy, że kula ma promień 1000.

Moim celem jest obliczenie kąta między miejscem PATRZĄCym a miejscem docelowym.

NapisaĹ,em ten kod, który oblicza się kąt między wektorami 2:

var A = new THREE.Vector3(1,0,0); 
var B = new THREE.Vector3(0,1,0); 

var theta = Math.acos(A.dot(B)/A.length()/B.length()); 

// theta = PI/2; 

mam wektor celu (celów [0] .position).

Chodzi o to, że nie mogę wymyślić sposobu, by uzyskać wektor miejsca, w którym patrzy kamera.

Przyjrzałem się metodom Vector3.applyProjection i zastosowałem metody symulacyjne, a także odtwarzałem, ale nadal nie można uzyskać dobrych wyników.

Uważam, że zamówienie Eulera musi najpierw zostać zmienione z powrotem na "XYZ" zanim zostaną wykonane jakiekolwiek prognozy? Próbowałem i nie jestem pewien, jak to zrobić, dokumentacja jest dość trudna do zrozumienia.

Powiedz, że jeśli kamera patrzy bezpośrednio w prawo, muszę uzyskać wektor, który jest oddalony o RADIUS od środka w kierunku bieżącego obrotu.

Więc skończę z 2 wektorami, na których mogę wykonywać obliczenia!

Dziękuję za wszystko!

Odpowiedz

29

Aparat patrzy w dół na wewnętrzną ujemną oś Z. Więc utworzyć wektor skierowany w dół negatywnego kierunku Z:

var vector = new THREE.Vector3(0, 0, -1); 

Teraz stosują tę samą rotację do wektora, który jest stosowany do kamery:

vector.applyQuaternion(camera.quaternion); 

można uzyskać kąt w radianach do cel tak:

angle = vector.angleTo(target.position); 

EDIT: można teraz uzyskać kierunek, w którym kamera patrzy tak:

var vector = new THREE.Vector3(); // create once and reuse it! 
... 
camera.getWorldDirection(vector); 

Uwaga: Przy przejściu w vector w których można zapisać wynik, metoda nie będzie musiał wystąpienie nowego THREE.Vector3 każdym razem, gdy wywoływana jest metoda.

Aktualizacja do Three.js r.79

+0

Jak mogę się dowiedzieć, w którym kierunku skierowana jest kamera lub w kierunku północ/południe? lub po prostu: ile stopni kamera jest obracana? Nie rozumiem, co to jest target.position, to kamera –

+2

ma teraz funkcję getWorldDirection(), aby znaleźć sposób, w jaki jest skierowana w przestrzeń światową. – Neil

8

spędziłem dużo czasu próbuje dowiedzieć się kapitan oczywisty na pytanie.

Jak to w końcu pracował dla mnie:

vector = camera.getWorldDirection(); 
    theta = Math.atan2(vector.x,vector.z); 

theta jest w radianach. Tak nakierowuję postać mojej gry na twarz w taki sam sposób jak kamera. Metoda getWorldDirection() to całkiem nowa opcja w aparacie.

+0

Czy można uzyskać orientację za pomocą wideo? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq

0

Nie mogę komentować, ale odpowiedź fluffybunnego działa idealnie. getWorldDirection(), a następnie zmiana tego wektora na radiany jest drogą do zrobienia.

+0

Czy można uzyskać orientację za pomocą wideo? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq