2013-05-01 47 views
11

Tôi gặp sự cố. Trong Three.js, tôi muốn xoay một quả cầu (Trái Đất) xung quanh trục nghiêng 23,5 degs. Tôi tìm thấy sphere.rotation.x, sphere.rotation.y và sphere.rotation.z, nhưng khi tôi kết hợp chúng với tỷ lệ chính xác, vòng quay của quả cầu khá lạ - nó không có trục quay vĩnh viễn. Tôi nghĩ rằng tôi cần một chức năng như sphere.rotation.vector (1,0, -1). Có ai biết làm thế nào chức năng này được gọi và làm thế nào cú pháp chính xác là?Three.js - Xoay một quả cầu xung quanh một trục nhất định

Rất cám ơn bạn đã trả lời!

Trả lời

17

Bạn cần sử dụng quaternions cho việc này. This video giải thích quaternions là gì và cách chúng được sử dụng trong đồ họa 3D.

Bạn có thể xây dựng một quaternion như thế này:

quaternion = new THREE.Quaternion().setFromAxisAngle(axisOfRotation, angleOfRotation); 

Sau đó, bạn áp dụng nó để đối tượng của bạn bằng cách:

object.rotation.setEulerFromQuaternion(quaternion); 

Bạn cũng có thể đạt được điều này bằng cách sử dụng hệ thống phân cấp đối tượng. Ví dụ: bạn có thể tạo một phiên bản Object3D() và nghiêng nó 23,5 độ, sau đó tạo một hình cầu (Earth) và thêm nó vào đối tượng nghiêng. Quả cầu sẽ xoay quanh trục Y nghiêng. Quaternions tuy nhiên, là công cụ tốt nhất để giải quyết điều này.

+0

cảm ơn rất nhiều! nó hoạt động tốt :) – karlosss

+5

Vì bajs r59 'setEulerFromQuaternion()' đã bị loại bỏ (xem: https://github.com/mrdoob/three.js/wiki/Migration#r58--r59). Dòng thứ hai bây giờ là: 'object.rotation = new THREE.Euler(). SetFromQuaternion (quaternion);' – kontur

19

Bạn không cần phải hiểu cách Euler góc hoặc quaternions làm việc để làm những gì bạn muốn. Bạn có thể sử dụng

Object3D.rotateOnAxis(axis, angle); 

Hãy chắc chắn rằng axis là một vector đơn vị (có chiều dài 1), và angle là trong radian.

Object3D.rotateOnAxis(axis, angle) quay trên trục trong không gian đối tượng.

three.js r.67

+0

Cảm ơn sự giúp đỡ của bạn, nhưng tôi là người mới bắt đầu trong ba.js và tôi không thể sử dụng Object3D ... Tôi tin rằng nó hoạt động tốt, nhưng tôi đã sử dụng quaternions. – karlosss

+0

@karlosss Object3D là một lớp cơ sở mà nhiều đối tượng trong Three.js đi xuống. Nếu đối tượng của bạn có thuộc tính xoay, thì đó có thể là một lớp con của Object3D. Trục – Joel

+0

có chiều dài 3. –

0
var quaternion = new THREE.Quaternion(); 
var object = scene.getObjectByName('xxx'); 
function render(){ 
    quaternion.setFromAxisAngle(new THREE.Vector3(0, 1, 0).normalize(), 0.005); 
    object.position.applyQuaternion(quaternion); 
} 

three.js phiên bản là 86, xem full example on codepen.

+1

Bạn đã tạo ra một số 'Quaternion',' Vector3' và 'Euler' bao nhiêu lần trong một giây? Thay vào đó tạo một thể hiện của quaternion bên ngoài vòng lặp render. Trong vòng lặp render, làm điều này: 'planet.position.applyQuaternion (quaternion);' Ngoài ra, hãy gọi scene.getObjectByName() một lần bên ngoài vòng lặp. – WestLangley

+0

Đề xuất hay. Thật đơn giản để thể hiện cách xoay quanh bất kỳ trục nào bằng cách sử dụng mã ở trên. Tôi tối ưu hóa nó trong [ví dụ đầy đủ] (https://codepen.io/luics/pen/GEbOYO) ngay bây giờ. – luics

+0

Thôi nào. Bạn đã không làm theo đề nghị của tôi. Đặt 'quaternion' một lần bên ngoài vòng lặp render. Xóa 'euler'. Thay vào đó, hãy gọi 'applyQuaternion()'. – WestLangley

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