自定义Quaternion类在OpenGL/GLUT固定管线中旋转方向反向问题
问题根源
问题出在Quaternion::toMatrix的数组存储顺序,和OpenGL固定管线的要求不匹配。
glMultMatrixf要求传入的16个浮点数组是列优先存储:数组前4个元素是矩阵的第一列,接下来4个是第二列,依次类推。- 你现在的实现是按行优先的顺序填的数组:把矩阵每一行的元素按顺序放进数组,相当于把正确的旋转矩阵转置之后传给了OpenGL。
- 旋转矩阵是正交矩阵,转置等于逆矩阵,逆矩阵对应的就是完全反向的旋转,这就是所有轴的旋转方向都反了的原因。
修正方式
直接调整toMatrix里返回数组的元素顺序,适配OpenGL的列优先要求就行,不需要去翻转旋转角度的符号。修改后的函数实现:
std::array<float, 16> Quaternion::toMatrix(const Quaternion& q) { float X = q.X; float Y = q.Y; float Z = q.Z; float W = q.W; return { 1 - 2*(Z*Z + Y*Y), 2*(X*Y + W*Z), 2*(X*Z - W*Y), 0, 2*(X*Y - W*Z), 1 - 2*(X*X + Z*Z), 2*(Y*Z + W*X), 0, 2*(X*Z + W*Y), 2*(Y*Z - W*X), 1 - 2*(X*X + Y*Y), 0, 0, 0, 0, 1 }; }
你之前构造的四元数数值、乘法逻辑都是对的,和旋转工具算的结果一致,没必要改这部分。只要把矩阵的元素顺序调对,旋转方向就会符合右手定则的预期。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

