2012-02-21 37 views
7

Tôi đang làm việc trên trình thông dịch L-system và tôi sử dụng quaternion làm biểu diễn quay nội bộ. Tôi cần xuất kết quả sang cảnh JavaScript baJs và tôi thấy cảnh json là cách tốt nhất để làm điều đó.Cách sử dụng xoay quaternion trong cảnh json Three.js

Tôi đã tìm thấy một ví dụ về cảnh trên https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js nhưng không có gì về xoay vòng quaternion.

Vì vậy, tôi đã sử dụng sự giúp đỡ tại http://threejs.org/io/s/quaternion và tìm thấy, rằng THREE.Object3D có tính quaternionuseQuaternion nhưng Nó có vẻ không hiệu quả, sai số được nâng lên bởi cảnh nạp (có lẽ vì thiếu "xoay vòng "thuộc tính, xem EDIT ở cuối):

"obj": { 
    ... 
    "quaternion": [0.38268343236509,0,0,0.923879532511287], 
    "useQuaternion": true 
} 

tôi cũng đã cố gắng để chuyển đổi quaternion đến góc Euler nhưng It wont làm việc đối với tôi, có lẽ vì trật tự khác của việc áp dụng các góc (tôi giả sử để Y, Z, X). Trong ví dụ trên, quaternion đại diện cho phép quay về trục Z (độ dốc) bằng 135 độ được chuyển thành góc Euler [pi, pi, pi/4] nhưng nó được hiển thị không chính xác trong cảnh.

Hình sau hiển thị các khối được xoay nhiều hơn 11 độ so với trục Z khác. Các trục là X (đỏ), Y (xanh lục) và Z (màu xanh lam). Nửa trên được xoay không chính xác do quaternion chuyển đổi không chính xác thành Euclid (tôi đã sử dụng trang này để thực hiện: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/).

ilustration of the problem
EDIT: Sau khi kiểm tra thêm lỗi do trình tải cảnh bị thiếu do thiếu thuộc tính "xoay vòng" trên đối tượng. Sau đầu ra không ném lỗi và cảnh được nạp nhưng nó sai (theo cách giống như hình ảnh được hiển thị) vì xoay vòng quaternion bị bỏ qua.

"obj": { 
    ... 
    "rotation": [3.14159265358979,3.14159265358979,0.785398163397449], 
    "quaternion": [0.38268343236509,0,0,0.923879532511287], 
    "useQuaternion": true 
} 
+0

Có nhiều thông báo lỗi do trình tải cảnh nâng lên hay không, điều gì đó nêu rõ cụ thể những gì nó không thích về việc sử dụng quaternions? –

+0

Ok, lỗi xảy ra do thiếu thuộc tính "xoay vòng". Trình tải cảnh có thể không tải các phép quay quaternion. – NightElfik

Trả lời

4

Tôi nghĩ rằng tôi đã giải quyết được sự cố của mình. Đây không phải là câu trả lời trực tiếp cho câu hỏi của tôi, chỉ là cách tôi giải quyết vấn đề đó.

Sự cố trong trình tải cảnh, không hoạt động với xoay vòng quaternion. Tôi viết lại kịch bản tạo cảnh để tạo cảnh trực tiếp trong JS.

var mesh = new THREE.Mesh(geometry, material); 
... set position & scale ... 
mesh.rotation.x = 3.141; 
mesh.rotation.y = 3.141; 
mesh.rotation.z = 0.785; 
mesh.updateMatrix(); 
scene.add(mesh); 

Sau đó, tôi tìm thấy tài sản diệu eulerOrder trên THREE.Object3D được thiết lập để 'XYZ' trong mặc định mà đã gây ra vấn đề của tôi (hình ảnh đính kèm trong câu hỏi), chuyển đổi qua tec non-Euler của tôi được thiết kế cho 'YZX' vì vậy tôi đã thay đổi điều đó.

mesh.eulerOrder = 'YZX'; 

Thats it. Tôi không có thời gian để thử nghiệm với trình tải cảnh nhưng NẾU có thể đặt thuộc tính eulerOrder với trình tải cảnh hơn là nó sẽ bị sollution cho phần thứ hai của câu hỏi của tôi.

Điều tốt nhất sẽ đặt quaternion trực tiếp trong định nghĩa cảnh nhưng có thể nó sẽ yêu cầu thay đổi trong trình tải cảnh.

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