我在一个由四元数旋转的WebGL上下文中有一个对象。现在我想根据当前鼠标位置围绕x轴旋转它。我怎样才能做到这一点?我正在使用glMatrix库。
答案 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个插槽来完成。)