gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:53:14 26 4
gpt4 key购买 nike

我正在制作一个 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;
}
}

最佳答案

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

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

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

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

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

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

关于c++ - 旋转其中一个物体后,如何将两个物体移动到同一方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23493897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com