2011-10-29 108 views
10

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

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

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

+0

最好不要问一个以上的问题。我已经链接回你的[新问题](http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right)。 – Kev

回答

4

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

这是用于使用鼠标移动旋转立方体的简单示例。如您所见,我需要实施三种方法: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); 
} 
+0

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

9

您可以很容易地build rotation matrices out of unit quaternions

给定一个单位四元A + BI + CJ + DK,你可以建立以下3x3矩阵:

The matrix

添加的最后一行和列从身份4x4矩阵,glMultMatrix采取和你已经完成:)