组成四元数

时间:2014-06-04 14:13:36

标签: opengl rotation quaternions arcball

我目前正在处理必须通过拖动鼠标进行旋转的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());

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

glMultMatrixf (...) 当前 矩阵乘以您传递的矩阵。现在这里的事情变得有趣,你有一个四元数,似乎是累积的(名为currentRotation)。您正在两个不同的地方累积轮换。

实际 想要的是glLoadMatrixf (...)。而不是将当前矩阵乘以旋转矩阵,而替换矩阵。您可以在glLoadIdentity (...)之前调用glMultMatrixf (...)来获得相同的结果;最重要的是你需要在应用之前丢弃矩阵中的任何旧旋转。

目前尚不清楚你所追求的行为是否会使GL的矩阵在每次更新时重置或重置四元数,但你真的需要重置其中一个,否则你将无休止地旋转。