OpenGL相对于对象轴的旋转

时间:2013-01-21 20:16:37

标签: qt opengl rotation local axis

我正在努力旋转物体。我想通过这个小程序来说明我的AR Drone 2.0的陀螺仪读数。 也许您想先观看这段简短的视频:http://youtu.be/HvrLS8Olr2c

滑块适用于使用

完成的x,y,z旋转
glRotatef(rotationX, x_vect.x, x_vect.y, x_vect.z);
glRotatef(rotationY, y_vect.x, y_vect.y, y_vect.z);
glRotatef(rotationZ, z_vect.x, z_vect.y, z_vect.z);

其中值为:

Vector x_vect = {1.0f, 0.0f, 0.0f};
Vector y_vect = {0.0f, 1.0f, 0.0f};
Vector z_vect = {0.0f, 0.0f, 1.0f};

您可以从此处下载此小应用的完整源代码:http://ablage.stabentheiner.de/2013-01-21_openglimportmodel.zip

问题在于,如果你旋转让我们首先说Y轴,然后尝试使用X滑块,它将不会转动它应该做的轴(参见C4D动画进行比较)。我认为这是因为我首先执行X旋转然后执行Y旋转。交换代码行并不能解决问题,而是将其推送到另一个轴上。

2 个答案:

答案 0 :(得分:2)

这是因为当你致电glRotatef()时,对象的枢轴会旋转。看看这个漂亮的模具:
awesome d6

想象一下,x轴穿过4和3(d6的相对侧总是加起来为7),z轴穿过6和1,y轴穿过2和5。 如果你要写这段代码:

glRotatef(90,1,0,0);
glRotatef(90,0,1,0);

模具首先绕x轴旋转90度,顶部为6。然而,轴保持相对于模具,因此下一次调用将使模具围绕穿过2和5的轴旋转,从而有效地将侧面向右旋转6。当你绕过这些调用,并使模具首先围绕它的y轴旋转时,带有6的一侧将首先向右移动并且在顶部。

现在,开始了。你可以做的是围绕物体旋转相机,而不是旋转物体本身。我建议阅读有关实施弧形相机的内容。 This seems like a good start.

答案 1 :(得分:1)

http://doc-snapshot.qt-project.org/4.8/opengl-grabber.html

http://doc-snapshot.qt-project.org/4.8/opengl-grabber-glwidget-cpp.html

当我在Qt的opengl中进行旋转时,抓取器示例非常有用。这里有一点来自glwidget.cpp。

void GLWidget::paintGL()
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glPushMatrix();
// Here is the rotation code:
 glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
 glRotated(yRot / 16.0, 0.0, 1.0, 0.0);
 glRotated(zRot / 16.0, 0.0, 0.0, 1.0);

 drawGear(gear1, -3.0, -2.0, 0.0, gear1Rot / 16.0);
 drawGear(gear2, +3.1, -2.0, 0.0, -2.0 * (gear1Rot / 16.0) - 9.0);

 glRotated(+90.0, 1.0, 0.0, 0.0);
 drawGear(gear3, -3.1, -1.8, -2.2, +2.0 * (gear1Rot / 16.0) - 2.0);

 glPopMatrix();
}