2015-04-07 68 views
1

我一直在開發一個基本的遊戲引擎,只是爲了學習這個過程,而且我的旋轉函數遇到了問題。對象在旋轉時縮小javascript

它工作正常,除了對象收縮和似乎顛倒。

這是一個jsfiddle,說明了我的觀點。

我認爲這個問題會出現在代碼中,但我並不積極。

function Rotation(vec, rot){ 
if(Math.acos((vec.x + vec.y + vec.z -1)/2) === 0) { return vec; } 

var qVec = new Quaternion(vec.x, vec.y, vec.z, 0); 
qVec = Quaternions.multiply(qVec, rot); 
qVec = Quaternions.multiply(qVec, rot.conjugate()); 
return new Vector3(qVec.x, qVec.y, qVec.z); 
} 

回答

1

兩件事情:

首先,旋轉四元數不歸,所以它的倒數就是不一樣,它的共軛。旋轉運動通過一四元數的定義爲:

formula

哪裏q是你周圍旋轉矢量,p是你旋轉向量,p'是最終旋轉向量。

所以這是使用定義爲conjugate(q)/magnitude(q)^2的q的的逆定義的。在q被歸一化的情況下,所以它與乘以共軛相同。

另請注意這裏的操作順序。四倍乘法是非交換所以他們的順序很重要。

您可以通過標準化的旋轉四元數,和固定操作順序解決這個問題:

var qVec = new Quaternion(vec.x, vec.y, vec.z, 0); 
qVec = Quaternions.multiply(rot.normalize(), qVec); 
qVec = Quaternions.multiply(qVec, rot.conjugate()); 
return new Vector3(qVec.x, qVec.y, qVec.z); 

其次,要定義你的旋轉季銨鹽正常到要繞平面。在這種情況下,您想繞x-y平面旋轉。 z軸垂直於這個平面,所以我們要沿Z軸定義旋轉向量:

function update(){ 
    for(var i = 0; i < gameObjects.length; i++){ 
     gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100)); 
    } 
} 

有了這些變化,我能得到正確的盒子旋轉。

(在它爲什麼被擴大的條款/下,我不是100%肯定,仍在試圖找出答案。)

+0

真棒!這有助於分配。我認爲目前的縮小可能是因爲我沒有將方塊投影到相機的平面上,當我繪製時基本上忽略了z軸。 – Devcon