C++ 从四元数到OpenGL旋转

C++ 从四元数到OpenGL旋转,c++,opengl,linear-algebra,quaternions,C++,Opengl,Linear Algebra,Quaternions,我有一个对象,我想通过关键点旋转。物体应该偏航、俯仰和滚动。在尝试了很多之后,我发现glRotate有其局限性,不可能用该函数实现类似的功能 我做了一些研究,发现了基于四元数的旋转。也可以通过旋转矩阵进行旋转,但几乎每个人都将四元数描述为有史以来最好的四元数 我已经读过关于四元数的书,并且对它们有相当好的理解,但是如何在我的OpenGL程序中实现它们仍然是一个谜。有人知道一个小例子吗?不是如何实现四元数类,而是如何使用它。我不知道如何把东西放在一起。你可以很容易地做到 给定单位四元数a+bi+c

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

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

我已经读过关于四元数的书,并且对它们有相当好的理解,但是如何在我的OpenGL程序中实现它们仍然是一个谜。有人知道一个小例子吗?不是如何实现四元数类,而是如何使用它。我不知道如何把东西放在一起。

你可以很容易地做到

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


添加取自恒等式4x4矩阵的最后一行和列,
glMultMatrix
,您就完成了:)

最重要的是实现从四元数构建旋转矩阵的方法。然后,就像处理法线旋转矩阵一样,将其与modelview矩阵相乘

这是一个简单的示例,用于通过鼠标移动来旋转立方体。如您所见,我需要实现三种方法:
toMatrix
quaternionFromAxis
multiplyWith
。假设您理解四元数,这应该清楚它们的作用

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);
}

最好不要一次问一个以上的问题。我已经从你的链接回到这里。相机四元数的初始值应该是多少?