四边形 OpenGL 之间的碰撞检测

Collision Detection between quads OpenGL

本文关键字:碰撞检测 之间 OpenGL 四边形      更新时间:2023-10-16

我正在制作一个简单的3D OpenGL游戏。目前,我有四个边界墙,随机分布的内墙和一个简单的四立方体供我的玩家使用。

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

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

我会在玩家和墙壁周围查看一个有界的框,还是有更好的选择?

我认为您的问题主要是关于以一定角度检测与墙壁的碰撞,这与"检测点是否与线匹配"基本相同,这里有一个答案:

如何判断一个点是否属于某条线?

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

已经有很多关于如何进行"良好"碰撞检测的文章甚至书籍。当然,部分原因归结为"你想要非常准确还是非常快速的代码"——对于"完美"的模拟,你可能会为了精度而牺牲速度。在大多数游戏中,玩家的身体因为玩家经过了墙壁交叉路口而稍微"凹陷"了墙壁,这也许是可以接受的。

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

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

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

如果你真的想进入游戏物理领域,那就从这个家伙的github中获取一个拉力。我用他的书在游戏物理课上。书中有一些错误,所以一定要从github获取所有代码示例。他通过制造质量聚合物理引擎和刚体物理引擎。我也会复习矩阵和张量。