四边形OpenGL之间的碰撞检测

Posted

技术标签:

【中文标题】四边形OpenGL之间的碰撞检测【英文标题】:Collision Detection between quads OpenGL 【发布时间】:2013-11-14 14:22:41 【问题描述】:

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

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

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

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

【问题讨论】:

glGenLists? 2013 年(几乎是 2014 年)的显示列表?伙计,这些东西已被弃用多年。不要使用它们。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

我会看看这对我有用。如果墙壁没有必要倾斜,我相信使用直边墙壁会容易得多。 我从未听说过将二进制空间分区用于 3D 世界。我通常在 2D 游戏中看到四叉树,在 3D 世界中看到八叉树。【参考方案2】:

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

如果您真的想深入了解游戏物理,请从this guys github 中获取信息。我已经将他的书用于游戏物理课。书中有一些错误,所以请务必从 github 获取所有代码示例。他经历了制造质量聚合物理引擎和刚体引擎的过程。我还会复习矩阵和张量。

【讨论】:

我会看看你的建议,我只是在寻找基本的碰撞检测,在这个阶段我不需要考虑任何反作用力,复杂性不适合使用任何物理引擎 在这种情况下,只需使用点到平面的碰撞。此链接底部有一个代码示例。 geomalgorithms.com/a04-_planes.html

以上是关于四边形OpenGL之间的碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

碰撞检测之Box-Box检测

两个Sphere和gluLookAt函数之间的OpenGL碰撞

在 OpenGL 中检测碰撞

OpenGL 2D 圆 - 旋转 AABB 碰撞

OpenGL:关于处理碰撞检测和顶点数据的建议?

2D 碰撞检测和 OpenGL 的东西