2013-02-11 3 views
16

이 질문은 여러 번 반복되었지만 특정 문제에 대한 답변을 찾을 수 없습니다.Three.js : 카메라가보고있는 방향을 잡으십시오.

나는 html5와 THREE.js를 사용하여 게임을 만들고 있는데, 나는 'YXZ'의 오일러 순서로 회전하는 카메라를 가지고 있습니다.

이렇게하면 카메라가 머리처럼 위, 아래, 왼쪽, 오른쪽으로 회전합니다. 1 인칭 관점에서와 마찬가지로.

이 오일러 순서에서는 camera.rotation의 z 속성이 사용되지 않습니다 (항상 0). x는 피치 또는 위도를 라디안으로 지정하는 데 사용되며 y는 경도를 나타냅니다.

필자는 구형 방식으로 사용자 주위를 움직이는 많은 대상을 가지고 있으며 카메라는이 구의 중심에 항상 위치합니다. 구체의 반지름이 1000이라고 가정 해 보겠습니다.

내 목표는 카메라가 보이는 위치와 대상이 이루는 각도를 계산하는 것입니다. I가 목표 (타겟 [0] .position)의 벡터가

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; 

:

는 I 2 개 벡터 사이의 각도를 계산하는 코드를 썼다.

카메라가보고있는 위치의 벡터를 얻는 방법을 알아 내지 못합니다.

저는 Vector3.applyProjection 및 applyEuler 메서드를 살펴 보았지만 주위를 둘러 보았지만 여전히 좋은 결과를 얻을 수 없었습니다.

투영하기 전에 오일러 순서를 먼저 'XYZ'로 다시 변경해야한다고 생각합니까? 시도해 보았지만이 작업을 수행하는 방법을 잘 모르겠습니다. 문서를 이해하기가 어렵습니다.

카메라가 바로 옳게 보이면 현재 회전 방향에서 중심으로부터 RADIUS 거리만큼 떨어져있는 벡터를 가져와야한다고 말하십시오.

그래서 나는 계산을 할 수있는 2 개의 벡터로 끝낼 것입니다!

고맙습니다!

답변

29

카메라가 내부 음수 z 축을 내려다보고 있습니다. 지금

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

카메라에 적용되는 벡터에 같은 회전을 적용 : 그래서 부정적인 z 축을 가리키는 벡터를 만드는 당신은 라디안에서 각도를 얻을 수 있습니다

vector.applyQuaternion(camera.quaternion); 

그래서 같은 목표 :

angle = vector.angleTo(target.position); 

편집 : 이제 카메라가과 같이보고되는 방향을 얻을 수 :

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

참고 : 결과를 저장하기에 vector 전달함으로써, 방법은 메소드가 호출 될 때 새로운 THREE.Vector3마다 인스턴스화 할 필요가 없습니다.

내가의 명백한 질문 선장을 알아 내려고 긴 시간을 보냈다 r.79

+0

카메라가 어느 방향으로 향하고 있는지, 북쪽/남쪽 방향 등을 어떻게 알 수 있습니까? 또는 더 간단하게 : 카메라를 얼마나 많이 회전 시켰습니까? 나는 어떤 target.position가 –

+2

인지 알지 못한다. 카메라는 이제 세계 공간에서 어떤 방향으로 향하고 있는지를 찾기 위해 getWorldDirection()을 가지고있다. – Neil

8

three.js를 업데이트되었습니다.

이것은 결국 나를 위해 일한 방법은 다음과 같습니다

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

세타 라디안이다. 이것은 내 게임의 캐릭터가 카메라가 직면하는 것과 같은 방향을 향하게하는 방법입니다. getWorldDirection()은 카메라의 새로운 옵션입니다.

+0

비디오로 방향을 잡는 것이 가능 할까? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq

0

나는 말할 수 없지만 fluffybunny의 대답은 완벽하게 작동합니다. getWorldDirection() 그런 다음 해당 벡터를 라디안으로 변경하는 것이 좋습니다.

+0

동영상으로 방향을 잡을 수 있습니까? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq

관련 문제