沿轴旋转四元数

时间:2012-02-09 23:12:43

标签: javascript webgl

我在一个由四元数旋转的WebGL上下文中有一个对象。现在我想根据当前鼠标位置围绕x轴旋转它。我怎样才能做到这一点?我正在使用glMatrix库。

2 个答案:

答案 0 :(得分:2)

glMatrix(目前)不包含四元数变换的方式。抱歉。但是,添加可能不是一个坏主意。

你可以在网上找一些这些东西的参考资料。例如:this page有一些基本四元数数学的好例子。与此同时,如果您所有寻找的是围绕XI 想想的轮换,这将有所帮助:(注意!未经测试的代码!这只是我链接的页面上算法的快速优化)< / p>

/**
 * 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添加问题,以请求您认为有用的任何操作。

答案 1 :(得分: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或第3个插槽来完成。)