2

我目前正在使用 JOGL 设计我的第一个 FPS 游戏。(OpenGL 的 Java 绑定)。

到目前为止,我已经能够生成“世界”(一系列立方体)和玩家模型。我的播放器和立方体之间的碰撞检测效果很好。

现在我正在尝试添加枪支。我正确绘制了枪模型并加载到玩家模型上。我尝试使用的第一把枪是激光枪,它可以向您瞄准的任何目标发射瞬时视距激光。在我着手实现敌人模型之前,我想让激光和墙壁之间的碰撞检测工作。

目前,我的激光是由一系列小立方体一个接一个地绘制的。第一个立方体在玩家枪的末端绘制,然后从那里连续绘制。这个想法是继续绘制激光的立方体,直到检测到与某物发生碰撞,即世界上的立方体。

我知道立方体在世界上的位置。问题是我必须调用 glMatrixPush 来绘制我的角色模型。然后在此模型视图中绘制激光。这意味着我失去了旧的坐标系 - 所以我在一个系统中绘制世界,然后在另一个系统中绘制激光。在这个播放器矩阵中,我多次调用 glRotate 和 glTranslate,以便将所有内容与相机旋转的方式同步。然后通过沿这个新系统的 z 轴平移来构建激光器。

我的问题是,通过所有这些转换,我不再知道我的激光在地图坐标系中的位置,主要是由于涉及相机的旋转。

有谁知道一种方法 - 或有任何想法,如何解决这个问题?我相信我需要一种方法将激光的新坐标转换为地图的旧坐标,但我不确定如何撤消已对其进行的所有转换。OpenGL 可能还提供了一些功能来处理我不知道的这类问题。

4

2 回答 2

4

您不应该将激光视为发射它的角色的空间孩子。一旦发射,激光就是它自己的一个实体,所以你应该渲染如下:

glPushMatrix(viewMatrix);
glPushMatrix(playerMatrix);
DrawPlayer();
glPopMatrix();
glPushMatrix(laserMatrix);
DrawLaser();
glPopMatrix();
glPopMatrix();

此外,请确保不要将渲染转换逻辑与游戏逻辑混为一谈。无论您当前的 OpenGL 矩阵堆栈如何,您都应该始终存储对象的世界空间位置,以便能够测试交叉点。

记住要小心空间父/子关系。在实践中,它们并不那么频繁。更多信息,谷歌关于场景图的问题。

于 2009-05-03T19:12:17.830 回答
3

在第一个答案中提出的观点是,您不应该首先依赖矩阵来定位对象。在考虑绘制激光之前,您应该跟踪激光的位置和旋转。然后,您使用 translate 和 rotate 命令将其放置在您知道应该放置的位置。

您正在尝试向后做事,是的,这确实意味着您必须进行矩阵数学运算,而 OpenGL 不会跟踪它,因为 ModelView 矩阵是 OpenGL 唯一会跟踪的东西到对象位置。OpenGL 没有“世界空间”或“相机空间”的概念。只有所有输入乘以的矩阵。它非常简单……但在某些情况下,我更喜欢 DirectX 具有单独的视图矩阵和模型矩阵的方式。

因此,如果您不知道没有矩阵数学的对象位于何处,那么我会认为这是一个基本的设计问题。如果你不需要知道对象的位置,那么矩阵变换到你的心内容,但如果你确实需要它的位置,位置开始。

(几乎是第一个答案所说的,只是以不同的方式......)

于 2009-05-04T22:02:23.357 回答