2012-07-03 37 views
7

Điều tôi cố gắng đạt được là có hai chế độ điều khiển, một chế độ điều khiển "bay" miễn phí, và điều khiển đối tượng làm trung tâm (trackball) và nhấn nút liên tục chuyển đổi giữa chúng.Điều khiển bajs (từ TrackBall sang FlyControls và ngược lại)

Ban đầu tôi đã thử với TrackBallControls và FlyControls. Vấn đề với cả hai, đó là TrackballControls dựa trên góc Euler, trong khi FlyControls dựa trên Quartenions. Tôi cố gắng chuyển đổi các vector camera.rotation đến một quaternion bằng cách thực hiện,

quaternion.setFromEuler(target); //where target, a Vector3 that contains degrees 

Và thiết lập vị trí bằng tay (kể từ khi họ sử dụng các đối tượng vị trí tương đương), và trong khi nó dường như được làm việc, xoay camera một chút - và điều khiển chuyển đổi, bắt đầu tạo ra kết quả sai lầm khủng khiếp. Ngoài ra, lấy góc Euler từ quaternion (setEulerFromQuaternion) dẫn đến dữ liệu sai. Vì vậy, trong khi tôi đã có thể chuyển đổi giữa chúng, tôi đã không bao giờ có thể đồng bộ tọa độ xoay của chúng, do đó, "trên chuyển đổi" trong khi vị trí máy ảnh là chính xác vòng xoay là sai.

PS. Tôi đã có một số kết quả với các FirstPersonControls (góc euler cũng) nhưng lat màn hình, phương pháp dài nó đang sử dụng là rất dễ bị lỗi và không hoàn toàn khi có trục quay Z.

Trả lời

13

Còn thứ gì đó như thế này?

function onClick() { 

    var prevCamera = camera; 

    camera = new THREE.PerspectiveCamera(...); 
    camera.position.copy(prevCamera.position); 
    camera.rotation.copy(prevCamera.rotation); 

    var MODE = { TRACKBALL: 0, FLY: 1 }; 

    switch(mode) { 

     case MODE.FLY: 

      controls = new THREE.TrackballControls(camera); 

      mode = MODE.TRACKBALL; 

      break; 

     case MODE.TRACKBALL: 

      controls = new THREE.FlyControls(camera); 

      mode = MODE.FLY; 

      break; 

    } 

} 
+1

Aaand, nó hoạt động! Tôi đã dành rất nhiều thời gian chiến đấu với vòng quay và quaternions và giải pháp thực sự đơn giản, tuyệt vời này! Cảm ơn ông Doob! – Pantelis

+1

có lẽ tôi đã không theo dõi câu hỏi đủ gần, nhưng tại sao lại là một chiếc máy ảnh mới cần thiết? Chúng ta có thể không sử dụng cùng một máy ảnh chỉ cần thay đổi nó xem/vị trí/luân chuyển với các điều khiển khác nhau? –

0

Tạo máy ảnh mới là cách dễ nhất để hủy liên kết tất cả các sự kiện bàn phím/chuột được thiết lập với các điều khiển trước. Nếu bạn không làm điều này, bạn sẽ có orbitcontrols sự kiện cháy với chế độ bay trên.

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