Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt OpenGL相对于对象轴的旋转_Qt_Opengl_Rotation_Local_Axis - Fatal编程技术网

Qt OpenGL相对于对象轴的旋转

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 =

我正在努力解决一个物体的旋转问题。我想用这个小程序来演示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 = {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相机的内容