我有一个物体,希望能通过按键来旋转。该物体应该可以偏航、俯仰和翻滚。在尝试了很多后,我发现 glRotate
有其限制,并且使用该函数无法实现这样的功能。
我进行了一些研究并了解到基于四元数的旋转方法。虽然也可以通过旋转矩阵来旋转,但几乎每个人都认为四元数是最好的。
我已经阅读了四元数的相关内容并理解得相当不错,但如何在我的OpenGL程序中实现它仍然是个谜。是否有人知道一个小例子?不是如何实现四元数类而是如何使用它。我不明白如何将各个元素组合在一起。
我有一个物体,希望能通过按键来旋转。该物体应该可以偏航、俯仰和翻滚。在尝试了很多后,我发现 glRotate
有其限制,并且使用该函数无法实现这样的功能。
我进行了一些研究并了解到基于四元数的旋转方法。虽然也可以通过旋转矩阵来旋转,但几乎每个人都认为四元数是最好的。
我已经阅读了四元数的相关内容并理解得相当不错,但如何在我的OpenGL程序中实现它仍然是个谜。是否有人知道一个小例子?不是如何实现四元数类而是如何使用它。我不明白如何将各个元素组合在一起。
您可以轻松地使用单位四元数构建旋转矩阵。
给定一个单位四元数a + bi + cj + dk,您可以构建以下3x3矩阵:
添加来自身份4x4矩阵的最后一行和列,使用glMultMatrix
,然后你就完成了 :)最重要的是实现一个方法,该方法将从四元数构建旋转矩阵。然后,就像使用普通旋转矩阵一样,将其与您的模型视图矩阵相乘。
以下是使用鼠标移动旋转立方体的简单示例。如您所见,我需要实现三个方法: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);
}