2012-02-09 80 views
0

我在一個由四元數旋轉的WebGL上下文中獲得了一個對象。現在我想根據當前的鼠標位置繞x軸旋轉它。我怎樣才能做到這一點?我正在使用glMatrix庫。沿着軸旋轉四元數

+0

爲什麼要使用quaterion?矩陣要簡單得多,特別是在這種情況下(也可能更少的CPU)。 – Skizz 2012-02-09 23:20:38

+0

你怎麼看?圍繞X軸的四元數旋轉需要8次乘法,2次加法和2次減法。對4×4矩陣的相同操作是16次乘法和8次加法。四元數學運算總是會更快,而從矩陣運算出來的唯一原因是如果你將被強制轉換爲矩陣(即:傳入着色器) – Toji 2012-02-10 06:27:30

回答

2

glMatrix沒有(當前)包含很多四元數變換的方式。抱歉。然而,添加可能不是一個壞主意。

你可以在網上找到一些這些東西的參考。例如:this page對於基本的四元數學有一些很好的例子。在此期間,如果所有你想找的是圍繞十一旋轉認爲這將這樣的伎倆:(注意:未經測試的代碼前面這是網頁我聯繫上的算法只是一個快速優化!)

/** 
* Rotates a quaternion by the given angle around the X axis 
* 
* @param {quat4} quat quat4 to rotate 
* @param {number} angle Angle (in radians) to rotate 
* @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat 
* 
* @returns {quat4} dest if specified, quat otherwise 
*/ 
quat4.rotateX = function (quat, angle, dest) { 
    if (!dest) { dest = quat; } 

    // NOTE: I really have no idea what this is for, the guy on the linked page seemed to think it was necessary, though. 
    angle *= 0.5; 

    var qax = quat[0], qay = quat[1], qaz = quat[2], qaw = quat[3], 
     qbx = Math.sin(angle), qbw = Math.cos(angle); 

    dest[0] = qax * qbw + qaw * qbx; 
    dest[1] = qay * qbw + qaz * qbx; 
    dest[2] = qaz * qbw - qay * qbx; 
    dest[3] = qaw * qbw - qax * qbx; 
}; 

與此同時,請隨時向gl-matrix github page添加問題以請求您認爲有幫助的任何操作。

+0

謝謝爲這個答案和鏈接! glMatrix的quat4具有乘法功能,可以使這更容易,就像我現在添加的答案一樣。 – Grumdrig 2012-09-02 04:47:14

+0

哦,並且將角度除以2是必要的,因爲圍繞軸的旋轉的四元數是以cos和sin爲旋轉角度的一半的角度來計算的,正如您在所鏈接頁面的開頭附近提到的那樣。 – Grumdrig 2012-09-02 04:50:17

0

這應該做的伎倆:

quat4.rotateX = function (quat, angle, dest) { 
    if (!dest) dest = quat; 
    quat4.multiply(quat, [Math.sin(angle/2), 0, 0, Math.cos(angle/2)]); 
} 

,你可以用用,比如,

quat4.rotateX(myQuaternian, Math.PI/4); 

(約Y旋轉和Z軸可以通過移動來做到這一點sin項至第2或第三個插槽)。