1

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

有谁知道我做错了什么?

4

1 回答 1

2

glMultMatrixf (...)将当前矩阵乘以您传递的矩阵。现在事情变得有点有趣了,你有一个四元数,它似乎也是累积的(命名为currentRotation。您正在两个不同的地方累积旋转。

很有可能,您真正想要的是glLoadMatrixf (...). 而不是将当前矩阵乘以旋转矩阵,而是替换矩阵。glLoadIdentity (...)您可以通过在之前调用来获得相同的结果glMultMatrixf (...);底线是您需要在应用此之前丢弃矩阵中的任何旧旋转。

目前尚不清楚您所追求的行为是每次更新时都会重置 GL 的矩阵还是重置四元数,但您确实需要重置两者之一,否则您将无休止地旋转。

于 2014-06-06T05:03:08.917 回答