从四元数到OpenGL旋转

我有一个我想通过按键旋转的对象。 物体应该偏航,俯仰和滚转。 在尝试了很多之后,我发现glRotate有其局限性,并且不可能通过该函数实现类似的功能。

我研究了一下,发现了四元数旋转。 也可以通过旋转矩阵进行旋转,但几乎所有人都将四元数描述为有史以来最好的。

我已经阅读了关于四元数的内容,并且很好地理解了它们,但是如何在我的OpenGL程序中实现它们仍然是一个谜。 有谁知道一个小例子? 不是如何实现四元类,而是如何使用它。 我不知道如何把这些东西放在一起。


最重要的是实现将从四元数建立旋转矩阵的方法。 然后,像正常旋转矩阵一样,只需将它与模型视图矩阵相乘即可​​。

这是用于通过鼠标移动来旋转立方体的简单示例。 正如你所看到的,我需要实现三种方法: toMatrixquaternionFromAxismultiplyWith 。 假设你了解四元数,这应该清楚他们做什么。

void display() {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();

    // Multiply quaternion with current modelview matrix    
    glMultMatrixf(cameraQuaternion.toMatrix());

    // Some other transformations
    glTranslatef(-0.5f, -0.5f, -0.5f);

    // Draw something, i.e. cube
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glDrawArrays(GL_TRIANGLES, 0, 36);

    glPopMatrix();
}

void mouseMoved(float dx, float dy) {
    float axisY[] = { 0, 1, 0 },
          axisX[] = { 1, 0, 0 };

    float sensitivity = 0.005f;
    Quaternion *q1 = Quaternion.quaternionFromAxis(axisY, dx * sensitivity];
    Quaternion *q2 = Quaternion.quaternionFromAxis(axisX, dy * sensitivity];

    // Multiply two quaternions with camera
    cameraQuaternion = (q1.multiplyWith(q2)).multiplyWith(cameraQuaternion);
}

您可以轻松地从单位四元数中构建旋转矩阵。

给定一个单位四元组a + bi + cj + dk,可以构建以下3x3矩阵:

添加从身份4x4矩阵中获取的最后一行和列, glMultMatrix然后完成:)

链接地址: http://www.djcxy.com/p/81769.html

上一篇: From quaternions to OpenGL rotations

下一篇: How to correctly implement a quaternion camera in modern opengl?