四边形OpenGL之间的碰撞检测

时间:2013-11-14 14:22:41

标签: c++ opengl collision-detection

我正在制作一个简单的3D OpenGL游戏。目前我有四个边界墙,内部墙壁的随机分布和我的播放器的简单四边形立方体。

我想在玩家和所有墙壁之间设置碰撞检测。边界墙很容易,因为我可以检查x或z坐标是否小于或大于一个值。问题在于内墙。我有一个glGenList,它包含小的矩形墙段,在初始设置中,我随机生成一个x,z坐标数组,并将这些墙段转换为绘制场景中的这个位置。我还增加了45度或90度的旋转度,这使碰撞检测变得复杂。

任何人都可以帮助我如何在这里检测碰撞。我有每个墙部分的坐标,每个墙部分的大小以及玩家的坐标。

我会看一下玩家和墙壁周围的有界盒子还是有更好的选择?

2 个答案:

答案 0 :(得分:0)

我认为你的问题很大程度上是关于以一定角度检测与墙壁的碰撞,这与“检测一个点是否匹配一条线”基本相同,这就是你在这里做的答案:

How can I tell if a point belongs to a certain line?

(代码可能是C#,但其背后的数学适用于任何语言)。您只需要在Z的公式中替换Y,因为Y似乎不是您当前设计中的一个因素。

有很多关于如何进行“良好”碰撞检测的文章甚至书籍。当然,部分原因归结为“你想要非常准确或非常快的代码” - 对于“完美”的模拟,你可能会牺牲速度来实现准确性。在大多数游戏中,玩家身体“凹陷”墙壁只是因为玩家已经越过了墙壁交叉点,这可能是可以接受的。

“划分空间”也很有用。常见的方法是“二进制空间分区”,这里有很好的描述和说明: http://en.wikipedia.org/wiki/Binary_space_partition

关于游戏编程的书籍应涵盖碰撞检测的基本原理。网上还有很多关于它的文章,包括维基百科中的条目:http://en.wikipedia.org/wiki/Collision_detection

答案 1 :(得分:0)

如果没有制作刚体物理引擎,可以使用点到平面距离来查看是否有任何立方角点距离平面小于0.0f(我会使用FLT_MIN,因此点的半径小到他们)。您需要存储一个标准化的3d矢量(长度为1.0f的矢量)来表示平面的法线。如果从平面中心到点的矢量与普通法线之间的点积小于半径,则表示碰撞。之后,您可以获取立方体的速度(矢量的长度),将其乘以0.7f以获得一些能量吸收,并将其存储为立方体的新速度。然后在平面的法线上反映立方体的归一化速度矢量,然后将其乘以先前计算出的立方体的新速度。

如果你真的想进入游戏物理,请从this guys github获取一个拉动。我把他的书用于物理学的游戏课。书中有一些错误,所以一定要从github获取所有代码示例。他经历了一个大规模聚合物理引擎和一个刚体。我也会刷上矩阵和张量。