2D游戏碰撞响应:SAT和沿给定轴的最小位移?


13

我正在尝试在自己制作的2D游戏中实现碰撞系统。分离轴定理(如metanet的碰撞教程所述)似乎是处理碰撞检测的一种有效且健壮的方法,但我不太喜欢它们使用的碰撞响应方法。通过沿最小重叠轴盲目移动,该算法仅忽略了运动对象的先前位置,这意味着它在进入静止物体并随后反弹时不会与静止物体发生太多碰撞。

这是一个很重要的情况的示例:

例

根据上述SAT方法,该矩形将简单地从垂直于其斜边的三角形中弹出:

SAT风格的反应

但是,实际上,矩形应该停在三角形的右下角,因为如果矩形沿着其位移矢量连续移动,那将是第一个碰撞点:

现实的回应

现在,这在游戏过程中可能实际上并不重要,但是我很想知道是否存在一种以这种方式有效且普遍地获得准确位移的方法。在过去的几天里,我一直在为之绞尽脑汁,我还不想放弃!

(从StackOverflow交叉发布,希望这不违反规则!)


这是违反规则的。不要交叉张贴。
AttackingHobo

是的,将其从StackOverflow删除并保存在此处:P
TravisG 2011年

gamedev.stackexchange.com/questions/9144/…我在这里回答了您的特定问题。
ultifinitus 2011年

已从SO中删除。
Archagon 2011年

开始赏金,archagon:P否则,我可能不得不这样做。这个问题确实很有趣,而且看到一个答案不仅仅是列出几个参考文献,真是太棒了。
TravisG 2011年

Answers:


11

这是我找到的方法。它可能有缺陷,但是在粗略的分析中我还没有发现任何问题。只需稍作修改,它也可用于任意多边形。

在下图中,蓝色物体在移动,红色物体在静止。 1个 步骤1:对于每个多边形,沿着该多边形在垂直于运动矢量的线上的投影找到两个最远的点。 2 步骤2:沿连接这些点的直线划分每个多边形。沿运动矢量面向另一个多边形的多边形的一半是“前壳”。这是多边形中可能发生碰撞的唯一部分。 3 第三步:从每个多边形的“前向船体”上的每个点沿着运动矢量向对角线投影一个矢量,并检查它是否与对向多边形的“前向船体”的每个边缘相交。(可能很慢,但是现在计算机非常快-对吗?)(对倾斜的箭头表示抱歉。所有箭头应平行。) 4 步骤4:取最短的向量。这是确切的碰撞距离。 5 步骤5:瞧! 6


2
真是令人印象深刻。您是否有机会将算法的速度与简单的(4倍或8倍)多重采样进行比较?
TravisG 2012年

很不幸的是,不行。
Archagon

令人印象深刻,我敢肯定数学也不会太复杂/太复杂。+1
you786

7

看看这个类似的问题: 冲突解决

另外,也可以从http://www.metanetsoftware.com/technique/tutorialA.html#section5(您在其中发布了指向:)的链接)

第5节:快速移动的对象

如上所述,在使用静态碰撞测试时,小的和/或快速移动的物体可能会产生问题。可以采用几种方法来处理此类对象-最简单的方法是限制游戏设计,以便不需要此类对象。

如果绝对必须使用它们,则有两种常见的方法可以处理小型和/或快速移动的物体:后冲碰撞测试和多重采样。

-=扫描测试=-

代替测试两个静态形状之间的交集,我们可以通过沿原始形状的轨迹扫掠原始形状并测试这些扫掠形状之间的重叠来创建新形状。

基本概念在[Gomez]中进行了描述,用于圆-圆和AABB-AABB扫描测试。

-=多重采样=-

扫频测试的一个更简单的替代方法是多样本。与其在对象的新位置执行单个静态测试,不如在对象的先前位置和新位置之间的多个位置执行多个测试。该技术用于碰撞N中的布娃娃。

如果确保样本始终以小于对象半径的距离隔开,则将产生出色的结果。在我们的实现中,我们限制了最大样本数,因此,极高的速度有时会导致问题。这可以根据您的特定应用程序进行调整。

编辑

总结和AFAIK,有一些解决方案

  1. 将您的游戏限制为永远不会有会引起这种情况的小和/或快速移动的物体
  2. 如我发布的第一个链接所述,实施一个系统来阻止实际发生的碰撞
  3. 提高对快速移动物体和/或较小移动物体的采样率
  4. ...可能更多,但我不是专家。

1

这取决于您是否仅需要线性运动,还是需要应对角运动。

使用SAT的替代方法:

在仅线性的情况下,可以沿对象的增量线速度从原点对两个多边形的Minkowski差进行射线投射。

如果射线撞击MD,则两个对象将发生碰撞,并且碰撞点将告诉您它们碰撞的时间t。

现在,如果对象在移动和旋转,将变得更加困难,但是您仍然可以使用类似的技术。保守进取将使您能够处理这种情况。这种技术是迭代的。每次迭代都会生成一个新的MD,使您更接近交叉路口的时间。

这是关于保守发展的原始文件草案:

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

我在这里写了一篇文章详细解释了该技术:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

希望这些帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.