我有一个想要通过按键旋转的对象。物体应偏航,俯仰和滚动。在尝试了很多之后,我发现glRotate
有其局限性,并且不可能用该函数实现类似的东西。
我研究了一下,发现了基于四元数的旋转。也可以通过旋转矩阵进行旋转,但几乎每个人都将四元数描述为最好的。
我已经阅读了关于四元数并且理解它们的方法,但是如何在我的OpenGL程序中实现它们仍然是一个谜。有谁知道一个小例子?不是如何实现四元数类,而是如何使用它。我不知道如何把事情放在一起。
答案 0 :(得分:9)
您可以轻松build rotation matrices out of unit quaternions。
给定单位四元数 a + bi + cj + dk ,您可以构建以下3x3矩阵:
添加从身份4x4矩阵glMultMatrix
中取得的最后一行和列,您已完成:)
答案 1 :(得分:4)
最重要的是实现将从四元数构建旋转矩阵的方法。然后,正如您将使用正常旋转矩阵,只需将其与模型视图矩阵相乘。
这是用于通过鼠标移动旋转立方体的简单示例。如您所见,我需要实施三种方法: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);
}