从四元数到 OpenGL 旋转

Posted

技术标签:

【中文标题】从四元数到 OpenGL 旋转【英文标题】:From quaternions to OpenGL rotations 【发布时间】:2011-12-17 19:28:30 【问题描述】:

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

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

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

【问题讨论】:

最好不要一次问多个问题。我已经从你的new question 链接回来了。 【参考方案1】:

您可以轻松build rotation matrices out of unit quaternions。

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

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

【讨论】:

【参考方案2】:

最重要的是实现从四元数构建旋转矩阵的方法。然后,就像您对正常旋转矩阵所做的那样,只需将其与模型视图矩阵相乘即可​​。

这是一个简单的例子,用于通过鼠标移动来旋转立方体。如您所见,我需要实现三种方法: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);

【讨论】:

相机四元数的初始值应该是多少?

以上是关于从四元数到 OpenGL 旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何将欧拉角转换为四元数并从四元数中得到相同的欧拉角?

四元数旋转opengl

python 欧拉角,旋转矩阵,四元数之间转换

欧拉角到四元数然后四元数到欧拉角

将四元数旋转转换为旋转矩阵?

C ++ / openGL:使用四元数将QUAD旋转到一个点