与矩形以外的形状碰撞..?

时间:2010-11-19 15:13:43

标签: collision-detection

我已经习惯于使用矩形进行碰撞检测,我现在有点难过。我正在使用类似钻石的形状,在过去的几个小时里,我一直试图弄清楚如何检查碰撞。

我试着检查第一个对象是否有四个点位于第二个对象的点内,但这只是一个盒子(我想)

我觉得我遇到这个困难的原因是因为角度。

1 个答案:

答案 0 :(得分:11)

你试图将移动的凸多边形(你的“钻石”)与另一个移动的凸多边形碰撞,是吗?像这样:

two moving diamonds

您的第一步应该是将问题转换为其中一个多边形是静止的等效问题:

one diamond moving with difference of velocities, other diamond stationary

然后,您可以将移动多边形转换为“轴”,覆盖移动多边形扫过的区域。这很简单:如果原始多边形具有 n 边,则轴具有 n + 2个边,其中两个边的长度和方向与运动矢量。您可以通过根据与运动矢量正交的分量对顶点进行排序,并在最大值处插入新边来找到插入这些新边的位置。

the moving polygon transformed to a shaft

现在,您已针对静态多边形将问题简化为静态多边形。看看realtimerendering.com提供的方便table of collision algorithms,并按照参考文献,我们可以看到我们需要使用分离轴测试,例如,如第3节所述大卫艾伯利this paper

在二维中,如果我们能找到一个分离轴,一条线使得一个多边形落在线的一边,而另一个多边形落在另一边上,则两个凸多边形不能相交:

two convex polygons and an axis that separates them

如果给出一个方向,我们可以很容易地发现是否存在一个在该方向上运行的分离轴,通过将两个多边形投影到垂直于该方向的直线上,并查看投影是否是不相交的:

two convex polygons projected onto a line are disjoint, showing the existence of a separating axis

我们如何知道分离轴的运行方向?好吧,如果任何分离轴存在,那么就有一个与一个凸多边形的一边平行的(参见Eberly,第3页)。因此,只需要检查一小组方向,如果您在没有找到分离轴的情况下检查了所有方向,则两个多边形相交(因此原始移动物体会发生碰撞)。

您可以进行许多改进和优化,当然不限于这些:

  1. 在进行完全移动的多边形/多边形测试之前,请执行更简单的测试,如圆/圆,以便您可以快速拒绝简单的情况。
  2. 使用某种空间分区方案,如四叉树,这样您只能测试足够接近它们可能发生碰撞的物体。
  3. “缓存目击者” - 如果一行在 t 时分隔两个对象,则可能会在 t +δ时继续将它们分开,因此它可以支付记住您找到的分离轴并在下次首次尝试(请参阅 Graphics Gems IV 中的Rabbitz,“Fast Collision Detection of Moving Convex Polyhedra”)。
  4. 但是不要过于担心优化:首先要确保你能够在以后加快速度。