OpenGL相对于物体轴的旋转

3
我正在努力解决一个物体的旋转问题。我想用这个小程序来说明我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个回答

3
这是因为当你调用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的面将首先向右转并移至顶部。
现在,做完这件事后,您可以围绕对象旋转摄像机,而不是旋转对象本身。我建议阅读有关实施弧形球相机的内容。这似乎是一个不错的开始。

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接