OpenGL 碰撞检测

标签 opengl graphics jogl

我目前正在使用 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/

相关文章:

c++ - OpenGL 绘制多个对象

c++ - Eclipse CDT 编辑器无法识别 OpenGL 扩展

math - 带有行进立方体的隐式表面上的 CSG 操作

Java缓冲策略失去硬件加速

java - Qt Jambi 与 JOGL 用于 java OpenGL 开发?

java - Jogl-2.0不支持GLAutoDrawable gLDrawable.addKeyListener(this); ?

c++ - OpenGL纹理ID的范围是多少?

java - 边界填充算法..java中的Stackoverflow错误

java - 使用 glReadPixels 读取纹理图像的像素数据

opengl - 实时渲染后处理效果