【问题标题】:Composing quaternions组成四元数
【发布时间】:2014-07-25 05:54:03
【问题描述】:

我目前正在处理一个 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());

有谁知道我做错了什么?

【问题讨论】:

    标签: opengl rotation quaternions arcball


    【解决方案1】:

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

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

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

    【讨论】:

    • 很抱歉,您的回复很糟糕。无论如何,我的客户最终不再需要 3D 场景,所以我停止了它的工作。然而我仍然很感兴趣。在应用转换之前,我实际上是在调用glLoadIdentity()。我会在本周晚些时候尝试您的建议,并通知您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多