2012-02-21 427 views
7

我正在研究L系統解釋器,並使用四元數作爲旋轉的內部表示。我需要將結果導出到ThreeJs JavaScript場景,我發現json場景是最好的方法。如何在Three.js json場景中使用四元數旋轉

我在https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js上發現了一個場景的例子,但是沒有關於四元數旋轉的東西。

所以我用幫助在http://threejs.org/io/s/quaternion和發現,THREE.Object3D具有性能四元useQuaternion,但它似乎不工作,錯誤是由現場裝載機提高(失蹤可能是因爲「旋轉「屬性,請參閱編輯末):

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

我也試圖轉換四元數歐拉角,但它不會爲我工作,可能是因爲應用角度的其他命令,(我假設秩序Y, Z,X)。在上面的例子中,四元數表示圍繞Z軸(音高)的135度旋轉,將其轉換爲歐拉角[pi,pi,pi/4],但在場景中顯示不正確。

下面的圖片顯示每個塊比Z軸多旋轉11度。軸是X(紅色),Y(綠色)和Z(藍色)。由於轉換四元數不正確導致Euclid上半部分旋轉不正確(我使用此頁面實現:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/)。

ilustration of the problem
編輯:進一步檢查後由現場裝載機引發的錯誤是因爲對對象失蹤「旋轉」屬性。以下輸出不會拋出錯誤和場景被加載,但它是錯誤的(以與所示圖像相同的方式),因爲四元數旋轉被忽略。

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

有沒有更多的由場景加載器引發的錯誤信息,具體說明什麼它不喜歡使用四元數? – 2012-02-29 22:13:57

+0

好的,錯誤是由於缺少「旋轉」屬性造成的。場景加載器可能根本不加載四元數旋轉。 – NightElfik 2012-03-06 10:47:04

回答

4

我想我解決了我的問題。這不是我的問題的直接答案,只是我如何解決這個問題。

問題出現在場景加載程序中,它不適用於四元數旋轉。我重寫了場景生成腳本以直接在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); 

後來我發現魔法屬性eulerOrderTHREE.Object3D這是在默認情況下這是導致我的問題(問題附圖片)設置爲「XYZ」,我的四元數,歐拉轉換的目的是爲'YZX',所以我改變了。

mesh.eulerOrder = 'YZX'; 

那就是它。我沒有時間嘗試使用場景加載器,但是如果可以使用場景加載器設置eulerOrder屬性,而不是將其融入我的問題的第二部分。

最好的辦法是直接在場景定義中設置四元數,但它可能需要在場景加載器本身中進行更改。