旋转其中一个后,如何将两个物体移动到同一方向?

时间:2014-05-06 11:47:59

标签: c++ opengl rotation

我正在制作3D坦克(仅用于学习3D编程)(使用本教程:http://www.spacesimulator.net/wiki/index.php?title=3d_Engine_Programming_Tutorials)我制作了两个3ds模型,坦克的主体和炮塔。现在我可以用我的坦克移动,我可以玩灯等等我可以旋转炮塔。但是如果我旋转炮塔,然后我想向任何方向移动坦克,炮塔就会朝着自己的方向移动,身体也会移动。

例如: - >这是坦克的方向,< - 这是旋转后炮塔的方向。所以在这个例子中,坦克将向右移动,炮塔将向左移动(而我只是按下右键)。我希望炮塔与坦克的身体一起向右移动。

当然没有轮换,它的工作。我猜,矩阵是这个问题的关键,但我不知道该怎么做。

ps:我的源代码与教程中的几乎相同:“使用显示列表打印字体”

void keyboard_s (int p_key, int p_x, int py)
{
switch (p_key)
{
case GLUT_KEY_UP:
ObjTranslate(&object[0],0,0.2,0);
ObjTranslate(&object[1],0,0.2,0);
break;
case GLUT_KEY_DOWN:
ObjTranslate(&object[0],0,-0.2,0);
ObjTranslate(&object[1],0,-0.2,0);
break;
case GLUT_KEY_LEFT:
ObjRotate(&object[0],0,0,3);
ObjRotate(&object[1],0,0,3);
break;
case GLUT_KEY_RIGHT:
ObjRotate(&object[0],0,0,-3);
ObjRotate(&object[1],0,0,-3);
break;
case GLUT_KEY_PAGE_UP:
ObjRotate(&object[1],0,0,5);
break;
case GLUT_KEY_PAGE_DOWN:
ObjRotate(&object[1],0,0,-5);
break;
}
}

1 个答案:

答案 0 :(得分:1)

(广义推广)在OpenGL中,所有转换都是通过操纵模型视图矩阵来完成的。这意味着矩阵总是包含模型和视图之间的转换(实际上是模型与世界的组合转换,然后是世界与观察者坐标的转换)。

在您的情况下,您将旋转应用于模型视图矩阵。它只不过是一个带有正确旋转矩阵的矩阵乘法(由ObjRotate为您完成)。显然,在模型视图矩阵包含旋转之后,任何进一步的平移操作(再次,乘以矩阵)都与旋转有关。这是因为旋转现在是坐标转换的一部分。

您问题的最简单解决方案是以正确的逻辑顺序应用转换。逻辑顺序是坦克正在移动,炮塔随之移动。然而,转台的旋转是相对于罐的旋转。因此,首先坦克和炮塔都需要处于正确的位置,然后需要应用旋转。

在您的情况下,这意味着您无法在用户按下按钮时进一步操纵模型视图矩阵。相反,你必须自己记住坦克的位置/旋转和炮塔的旋转,这样你就可以按照正确的顺序应用两种变换。

一种方法是保留两个矩阵:一个用于坦克定位的变换矩阵,另一个用于炮塔旋转。然后,您可以只更改这些转换,然后将它们应用于模型视图。另一种方法是保持平移和旋转的参数,并在每次发生变化时调用ObjRotate,ObjTranslate等(按正确的顺序!)。

OpenGL管理其转换矩阵的堆栈。这意味着,在应用这些转换之前,您应该使用glPush推送到堆栈。然后你可以应用它们并绘制对象。然后你可以再次从堆栈中拉出来。这意味着保留了原始状态,因此您可以重新应用转换而不会损坏。