我目前正在处理一个必须通过拖动鼠标来旋转的 3D 场景。为此,我使用了 ArcBall 实现。
使用的框架立即将生成的四元数转换为旋转矩阵。任何后续旋转也将转换为矩阵。这些矩阵依次相乘。
我想通过简单地乘以旋转四元数来优化它。现在场景似乎无法控制地旋转,而原始版本工作正常(ish)。
我的四元数乘法代码:
public static Quat4f mul(Quat4f q1, Quat4f q2) {
float x = q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x;
float y = -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y;
float z = q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z;
float w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w;
return new Quat4f(x,y,z,w);
}
乘法是这样完成的(结果被归一化以获得良好的度量):
currentRotation = Quat4f.mul(newRotation, currentRotation);
最后,旋转应用为:
glMultMatrixf(currentRotation.toMatrix());
有谁知道我做错了什么?