【问题标题】:Collision with shapes other than rectangles..?与矩形以外的形状发生碰撞..?
【发布时间】:2010-11-19 15:13:43
【问题描述】:

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

我试图检查第一个对象的四个点是否在第二个对象的点内,但这只是一个框(我认为)

我觉得我对此有困难的原因是角度。

【问题讨论】:

  • 您可以检查一个形状中两点之间的线是否与另一种形状中两点之间的线相交。您可以遍历形状中的所有相邻节点。这将提供最准确的碰撞检测,除非形状在周围。
  • @bhavinp 我明白了;我需要弄清楚检查线路碰撞的最佳方法是什么。我假设我必须使用某种坡度?
  • @Robert Fratto 创建一个使用两个点创建线段的函数。然后制作另一个函数来测试这些线段是否相交。这应该是简单的线性代数,或者您可以找到在线资源来帮助解决这个问题。然后你只需要测试两个形状的每个顶点的相邻点。
  • @Robert Fratto 注意:我能想到的一种方法是使用两个点创建一条线,然后使用矩阵求解。如果你能找到一个用于矩阵计算的 API,那将会很有帮助。那么如果矩阵有解(有交点),只要检查那个交点是否在框内即可。
  • 对所有线段对进行线-线相交测试 (a) 效率低下 (b) 它通常不起作用:如果一个多边形完全包含在另一个多边形中,则多边形相交,但没有任何线段相交。

标签: collision-detection


【解决方案1】:

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

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

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

现在您已将问题简化为针对静态多边形的静态多边形。查看由 realtimerendering.com 提供的方便的table of collision algorithms,根据参考资料,我们可以看到我们需要使用分离轴测试,例如@987654322 第 3 节中所述@大卫·埃伯利。

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

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

我们如何知道分离轴的运行方向?好吧,如果存在 任何 分隔轴,那么就有一个平行于其中一个凸多边形的边之一(参见Eberly,第 3 页)。所以只有一小部分方向需要检查,如果你检查了所有方向而没有找到分离轴,那么这两个多边形相交(因此原来的移动物体会发生碰撞)。

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

  1. 在进行完整的移动多边形/多边形测试之前,先做一个更简单的测试,比如圆/圆,这样您就可以快速拒绝简单的案例。
  2. 使用某种空间分区方案,例如四叉树,以便您只测试距离足够近以至于它们可能发生碰撞的对象。
  3. “缓存证人”——如果一条线在时间 t 分隔两个对象,它很可能在时间 t + δ 继续分隔它们,因此它可以支付记住你找到的分离轴,下次再试一次(参见 Rabbitz,Graphics Gems IV 中的“Fast Collision Detection of Moving Convex Polyhedra”)。

但不要太担心优化:先把它做好,相信以后可以加快速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多