Qt OpenGL相对于对象轴的旋转
我正在努力解决一个物体的旋转问题。我想用这个小程序来演示AR无人机2.0的陀螺读数。 也许你想先看这段短片: 滑块用于x、y、z旋转,该旋转由Qt OpenGL相对于对象轴的旋转,qt,opengl,rotation,local,axis,Qt,Opengl,Rotation,Local,Axis,我正在努力解决一个物体的旋转问题。我想用这个小程序来演示AR无人机2.0的陀螺读数。 也许你想先看这段短片: 滑块用于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 =
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};
您可以从此处下载此小应用程序的完整源代码:
问题是,如果先旋转Y轴,然后尝试使用X滑块播放,它将不会旋转它应该旋转的轴(请参见C4D动画以进行比较)。我想这是因为我先做X旋转,然后做Y旋转。交换代码行并不能解决问题,但会将其推到另一个轴。
当我在Qt中使用opengl进行旋转时,grabber示例非常有用。下面是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();
}
这是因为调用
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的一侧会先向右,然后在顶部
现在,让这件事过去。可以做的是围绕对象旋转摄影机,而不是旋转对象本身。我建议阅读有关实现arcball相机的内容