多边形碰撞检测

时间:2012-02-24 17:40:55

标签: java android collision-detection polygon

我想知道是否有人可以给我一个关于如何实现第一个类来定义多边形的想法,以及如何使用这个类来检测两个多边形之间的碰撞。我在Android上的Java工作更具体,虽然我也可以使用NDK for C / C ++。我想定义我的多边形我只需要一个顶点数组吗?

当我进行碰撞检测时,我已经阅读了有关分离轴定理和GJK算法的信息。这是正确的方法,还是让我太复杂了。只是试着开始正确的方向。谢谢!

2 个答案:

答案 0 :(得分:5)

你听起来像是对这种事情相当新鲜,这可能是你意识到的一个更大的问题。

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

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

你在谈论2d还是3d?

这是物理系统吗?

你需要知道它们相交的位置还是它们相交?

你需要对形状做一个布尔运算(比如得到交集或联合或其他东西)吗?

答案 1 :(得分:2)

这取决于多边形的类型。

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

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

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

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

enter image description here

填充规则的不同之处在于中间的五边形孔是多边形的一部分还是仅仅是一个洞。

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

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

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