OpenGL 相对于对象轴的旋转

Posted

技术标签:

【中文标题】OpenGL 相对于对象轴的旋转【英文标题】:OpenGL Rotation relative to object axis 【发布时间】:2013-01-21 20:16:36 【问题描述】:

我正在为一个物体的旋转而苦苦挣扎。我想用这个小程序来说明我的 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 旋转。交换代码行并不能解决问题,而是将其推到另一个轴上..

【问题讨论】:

【参考方案1】:

发生这种情况是因为当您调用glRotatef() 时,对象的枢轴会旋转。看看这个漂亮的模具:

想象 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.

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于OpenGL 相对于对象轴的旋转的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 转换

为啥我的 OpenGL 对象绘制相对于最后绘制的对象?

在OpenGL中保存旋转矩阵

OpenGL相机的相对旋转

openGL中的完全透明对象

如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?