gpt4 book ai didi

OpenGL 碰撞检测

转载 作者:行者123 更新时间:2023-12-02 07:56:11 26 4
gpt4 key购买 nike

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

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

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

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

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

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

有没有人知道一种方法或有任何想法来解决这个问题?我相信我需要一种方法将激光的新坐标转换为 map 的旧坐标,但我不确定如何撤消对它所做的所有转换。 OpenGL 可能还提供了一些功能来处理我只是不知道的这类问题。

最佳答案

您不应该将激光视为发射它的角色的空间子项。一旦发射,激光就是一个独立的实体,因此您应该按如下方式渲染:

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

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

记住要小心空间父/子关系。实际上,它们并不那么频繁。更多信息,请自行google关于场景图的问题。

关于OpenGL 碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/817719/

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