2012-02-09 81 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或第三个插槽)。