2013-02-11 23 views
16

Tôi chắc chắn câu hỏi này đã được sao chép nhiều lần, tuy nhiên tôi không thể tìm thấy bất kỳ câu trả lời nào cho vấn đề cụ thể của tôi!Three.js: Nhận Hướng dẫn trong đó Máy ảnh đang tìm kiếm

Tôi đang tạo trò chơi bằng cách sử dụng html5 và THREE.js và tôi có camera xoay theo thứ tự euler của 'YXZ'.

Điều này là để máy ảnh quay lên, xuống, sang trái và sang phải như đầu. Như trong người đầu tiên xem.

Với thứ tự euler này, thuộc tính z trong camera.rotation không được sử dụng (luôn luôn là 0). x được sử dụng để xác định độ cao hoặc vĩ độ theo radian, và y được sử dụng mô tả kinh độ.

Tôi có một số mục tiêu di chuyển xung quanh người dùng theo cách hình cầu, với máy ảnh liên tục ở trung tâm của hình cầu này. Giả sử quả cầu có bán kính 1000.

Mục đích của tôi là tính toán góc giữa vị trí máy ảnh đang tìm và vị trí mục tiêu.

tôi đã viết mã này cho phép tính góc giữa 2 vectơ:

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; 

Tôi có vector của mục tiêu (chỉ tiêu [0] .position).

Điều này là tôi không thể tìm ra cách để lấy véc-tơ nơi camera đang tìm.

Tôi đã xem các phương pháp Vector3.applyProjection và applyEuler và chơi xung quanh nhưng vẫn không thể nhận được bất kỳ kết quả tốt nào.

Tôi tin rằng thứ tự euler trước tiên phải được đổi thành 'XYZ' trước khi có dự đoán nào được thực hiện? Tôi đã thử, và tôi không chắc chắn làm thế nào để làm điều này, các tài liệu hướng dẫn là khá khó hiểu.

Giả sử máy ảnh nhìn trực tiếp, thì tôi cần lấy một véc tơ cách RADIUS khoảng cách theo hướng xoay vòng hiện tại.

Vì vậy, tôi sẽ kết thúc với 2 vectơ mà tôi có thể thực hiện các tính toán!

Cảm ơn bạn đã nâng cao!

Trả lời

29

Máy ảnh đang xem xét trục z âm nội bộ của nó. Vì vậy, tạo một vector chỉ xuống tiêu cực trục z:

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

Bây giờ, áp dụng luân phiên cùng với vector được áp dụng cho các máy ảnh:

vector.applyQuaternion(camera.quaternion); 

Bạn có thể lấy góc theo radian để các mục tiêu như sau:

angle = vector.angleTo(target.position); 

EDIT: Bây giờ bạn có thể nhận được sự chỉ đạo, trong đó máy ảnh được trông như vậy:

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

Lưu ý: Bằng cách vượt qua trong vector trong đó để lưu trữ kết quả, phương pháp này sẽ không phải tạo một mới THREE.Vector3 mỗi khi phương pháp này được gọi.

Đã cập nhật thành ba.js r.79

+0

làm cách nào để tìm hiểu hướng camera nào đang quay về phía bắc hoặc nam vv? hoặc đơn giản hơn: độ quay của máy ảnh là bao nhiêu? Tôi không hiểu target.position là gì –

+2

camera bây giờ đã có getWorldDirection() để tìm ra cách mà nó đang đối mặt trong không gian thế giới – Neil

8

Tôi đã dành một thời gian dài để tìm ra câu hỏi rõ ràng của thuyền trưởng.

Đây là cách cuối cùng nó đã làm việc cho tôi:

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

theta là trong radian. Đây là cách tôi định hướng nhân vật của trò chơi giống như cách máy ảnh đang đối mặt. GetWorldDirection() là một tùy chọn khá mới trên máy ảnh.

+0

Có thể định hướng bằng video không? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq

0

Tôi không thể nhận xét nhưng câu trả lời của fluffybunny hoạt động hoàn hảo. getWorldDirection() và sau đó thay đổi véc tơ đó thành radian là con đường để đi.

+0

Có thể định hướng bằng video không? https://stackoverflow.com/questions/14813902/three-js-get-the-direction-in-which-the-camera-is-looking – Toniq

Các vấn đề liên quan