AABB vs Circle - 反之亦然使用单独的轴定理

时间:2011-05-27 15:03:43

标签: math 3d 2d physics collision

在我的2d游戏碰撞处理的本教程之后,本教程解释了我最喜欢的游戏“N”中使用的碰撞。他们如何更有效地使用单独的轴定理来实现AABB与AABB和AABB与Circle之间的碰撞。 http://www.metanetsoftware.com/technique/tutorialA.html。我理解AABB与AABB碰撞处理的实现,但我无法理解AABB与Circle碰撞检测,特别是 voronoi区域。完全混淆了如何/从哪里开始。

AABB与AABB碰撞检测

  1. 通过查找每条边的法线来找到沿着所有边的轴。
  2. 将所有顶点投影到 结果轴,最终结果应该 是一个标量值。
  3. 依次产生的标量值 用于查找是否存在碰撞 是否存在。
  4. 有人可以解释如何处理碰撞AABB vc Circle - 反之亦然?

1 个答案:

答案 0 :(得分:6)

由于与圆的碰撞总是归结为与半径的比较(在您的情况下,通过投影),具有最近的线段(多边形的边)和法向量是您需要的唯一构建块。法线向量很容易从线段的点计算(类似于单位(y2-y1,x1-x2)......斜率的负倒数)。找出哪条边最近是剩下的构建块。 Voronoi地区为我们提供了最后的基石。

您了解轴对齐边界框之间的碰撞。我假设你也理解两个圆圈之间的碰撞。我假设你不懂voronoi地区。那么,从哪里开始呢? Voronoi图。我强烈建议您找到图解说明。 This link is quite good。然而,取决于你是多么失落,也许还有一些额外的背景(严肃地说,没有任何解释可以击败视觉):

voronoi图是计算几何的普遍存在的数据结构之一。任何计算几何书都将讨论Voronoi图。它回答了一个简单的问题:最近的邮局在哪里?给定平面(邮局)中的一组点,voronoi图将平面分成不同的区域,每个区域包含一个点。如果您在特定地区,您知道哪个点(邮局)离您最近。如果你是一个圆圈,这对碰撞检测很有帮助,原因很简单:最接近的点是测试碰撞最重要的点。

请注意,如果要以数学方式导出voronoi图,只需考虑所有点对并计算所有二等分线。然后你将所有的二等分线相交并扔掉那些不重要的部分,因为其他一些点更接近感兴趣的点(在每个交叉点都会发生)。然而,这导致了非常低效的算法。有效的实现涉及计算几何中的另一个无处不在的事物:线扫描算法。它的细节可以在其他地方找到;重要的是它提供了一种只考虑算法任何阶段的重要点的方法。

教程中的voronoi区域稍微复杂一些。我们有线段,而不仅仅是点。幸运的是,线扫描算法很好地处理了这个问题。您最需要担心线段的开始或结束。从概念上讲,一旦你掌握了基本算法,就没有太大的变化。同样,这对于使用圆圈进行碰撞检测非常有用:给定voronoi区域,您可以知道要测试碰撞的哪个线段。

这有帮助吗?反馈意见。我很乐意澄清任何事情。在没有视觉效果的情况下解释voronoi图可能是一个坏主意。