【问题标题】:Collision Detection With Polygons多边形碰撞检测
【发布时间】:2012-03-15 04:17:55
【问题描述】:

我想知道是否有人可以告诉我如何首先实现一个类来定义多边形,然后如何使用这个类检测两个多边形之间的碰撞。更具体地说,我正在 Android 上使用 Java,尽管我也可以将 NDK 用于 C/C++。我认为要定义我的多边形,我只需要一个顶点数组对吗?

当我进行碰撞检测时,我已经阅读了有关分离轴定理和 GJK 算法的内容。这是正确的方法吗,还是我把它弄得太复杂了。只是试图朝着正确的方向开始。谢谢!

【问题讨论】:

  • 您几乎走在了正确的轨道上。如果您希望碰撞正常工作,真的没有更简单的选择。
  • 我在这个网站codezealot.org/archives/55找到了对分离轴定理的一个很好的解释
  • This 也很不错。制作 N 的人的教程

标签: java android collision-detection polygon


【解决方案1】:

听起来你对这种事情还很陌生,这可能是你意识到的一个更大的问题。

我认为您最好先定义您要解决的问题,然后找到解决该问题的解决方案。

让我问你一些合格的问题:

你说的是 2d 还是 3d?

这是针对物理系统的吗?

您是否需要知道它们在哪里相交或是否相交?

您是否需要对形状进行布尔运算(例如获取交集或联合之类的)?

【讨论】:

  • 我在 2D 中工作,是的,这是一个物理游戏。我的目标是让世界上的一个球在所有物体上反弹。我目前有矩形并且它可以工作,但我想添加一些图像,我可以创建多边形以使用预定义的顶点。根据物体碰撞的位置,我希望将球弹开。
  • 对于物理学,您需要一些听起来很简单但在实践中却非常困难的事情:1)您需要关于多边形游戏如何接触的极其精确的信息(不仅仅是它们接触)。事实证明这很难。 2)您需要能够解决多个移动物体之间的碰撞。这也很难。如果您想做的是编写一个物理库并假装您正在编写游戏,那么请查找“Erin Catto”。他写了很多关于这个的东西。如果您想编写游戏,请获取 Box2D 物理库的(免费)实现
  • 这很可能就是我最终要做的。我已经研究过使用 Box2D,但希望自己尝试让它工作,只是想知道学习 Box2D 是否比尝试手动实现它需要更长的时间。谢谢。
  • 对不起,我不小心一直按“返回”。使用 Box2D 可能需要一点时间,但不会太多。除非您将“Pong”作为物理引擎,否则您将花费​​很多很多个月才能正常工作,并且在那之后您将永远摆弄它。
  • 是的,我知道你的意思,我认为是 Box2D。我可能需要将我的代码移植到 LibGDX 以使其更易于使用。但幸运的是,我还没有进入游戏太深。
【解决方案2】:

这取决于多边形的类型。

如果你的多边形是凸的,那么一个有序的顶点列表将描述一个,分离轴和 GJK 都是适用的算法。

如果您的多边形是凹的但简单(即边从不相交),那么有序的顶点列表仍然足够,但分离轴或 GJK 都不适合。

如果您的多边形很复杂(即边可能相交),那么您将需要顶点列表和填充规则。该规则确定了平面的哪些部分被认为在多边形内部,哪些在多边形外部。

例如,想象一个像五角星这样的多边形:

填充规则的区别在于中间的五边形孔是多边形的一部分还是只是一个孔。

所有更复杂的多边形类型都可以分解为多个更简单类型的多边形实例,因此只需在地上放一面旗帜并声明您只对凸多边形感兴趣 - 这正是例如,GPU 的作用。

假设您将碰撞定义为简单地定义两个多边形是否重叠,分离轴定理非常简单,绝对是要走的路。如果您打算制作一个包含大量多边形的场景,那么您可能还需要一个广泛的阶段,这是一种快速的方法,可以在您进行昂贵的测试以找出哪个多边形之前将一大堆多边形标记为绝对不重叠其余的仍然是。

一个明显的例子是 bin 排序——假设您将屏幕分成 16 个像素的垂直条,然后对于每个多边形,您可以 (i) 确定它接触到哪些 bin; (ii) 对已经在这些箱中的所有多边形进行测试; (iii) 将其添加到垃圾箱中。这可能意味着您甚至在很多时候都不会考虑应用测试。该特定方案存在一些明显的问题,具体取决于您的场景,但存在更智能的算法。

【讨论】:

  • 这是一个很好的解释,谢谢!我在想 Box2D 可能是我应该走的路线。我真的对实现这一点很感兴趣,但使用完整的物理库对我来说可能更容易和更有用。非常感谢您的回答。
  • 这可能不是一个坏主意。多年来我一直在做这些事情,快速浏览一些代码表明我已经成功地在大约 1,500 行中制作了带有硬约束的刚体凸体,并且 - 完全独立地 - 制作了具有软约束的非凸弹性体一样,但是如果你想投入 Box2D 所做的所有事情(这比我的 1,500 件工作中的任何一件都多)并让它变得高效,你必须做更多的事情并且要非常小心它。不过,这是一个非常有趣的领域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多