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

Posted

技术标签:

【中文标题】旋转其中一个后,如何将两个对象移动到同一方向?【英文标题】:How can I move two objects into the same direction after rotating one of them? 【发布时间】:2014-05-06 11:47:58 【问题描述】:

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

例如:->这是坦克的方向,

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

ps.:我的源码和教程里的差不多:“Print fonts using display lists”

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;


【问题讨论】:

您需要为炮塔提供与坦克车身相同的平移。所以,在你旋转炮塔之前,先将它与身体一样平移,然后再旋转它。 炮塔旋转: case 'k': case 'K': ObjRotate(&object[1],0,0,5);休息;案例'l':案例'L':ObjRotate(&object[1],0,0,-5);休息;前进:案例 GLUT_KEY_UP: ObjTranslate(&object[0],0,0.2,0); ObjTranslate(&object[1],0,0.2,0);休息; (后向左右几乎一样) 很遗憾我做不到,但感谢您的帮助。我用代码更新了我的帖子,我在其中应用了翻译和旋转。我应该在哪里粘贴 glPopMatrix() 和 glPushMatrix()? 先了解这些东西,然后用你的大脑弄清楚它们的去向。 【参考方案1】:

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

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

解决问题的最简单方法是以正确的逻辑顺序应用转换。合乎逻辑的顺序是坦克在移动,炮塔也随之移动。然而,炮塔的旋转是相对于坦克的旋转。所以首先坦克和炮塔都需要在正确的位置,然后需要应用旋转。

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

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

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

【讨论】:

很遗憾我做不到,但感谢您的帮助。我用代码更新了我的帖子,我在其中应用了翻译和旋转。我应该在哪里粘贴 glPopMatrix() 和 glPushMatrix()?

以上是关于旋转其中一个后,如何将两个对象移动到同一方向?的主要内容,如果未能解决你的问题,请参考以下文章

手动使用 Segue

单击时将图像添加到屏幕并允许其可拖动/可旋转

如何在SVG中旋转期间保持文本方向不变

如何在移动方向更改时重置 Disqus 宽度

OpenGL模拟波斯王子相机

在opengl中,如何将鼠标跟随更改为鼠标单击、拖动和释放?