如何插入多个高速多边形碰撞(2D)?

How to interpolate multiple high speed polygon collisions (2D)?

上下文

我需要在物理模拟中检测高速物体的碰撞。由于网格中数字的截断和对象的数字表示,快速移动的对象很可能会相互穿过或错过。我正在尝试通过模拟 'analog' 的属性或对象移动通过每个点的现实生活运动来执行插值碰撞。 (现实世界中的物体通常不会传送到宏观层面的下一个点)

研究与预见 我们能够找到投影对象的最终点和初始点、时间位移和速度。我正在使用每像素碰撞来获取像素图,因此我们有一个像素簇。目前我解决这个问题的方法是使用牛顿法计算线性交点。

问题如何像计算 'single pixel' 或 'normal' 线一样计算像素簇的交点。

奖励:非线性运动(速度与加速度)或计算插值内的多次碰撞(其中弹性碰撞会使碰撞对象之一与另一个额外的物体,否则会靠近但错过初始碰撞。这最好在插值计算中。)

好吧,一年过去了,还是没有答案,所以我想我会尽力用我自己的知识来回答我自己的问题。

似乎很多游戏并不关心这种特殊情况,不幸的是,这种情况经常发生。游戏中的许多高速 object 有时会由于缺乏捕捉机制而陷入墙壁或穿墙。实现某些东西以捕获高速 objects 将需要 插值 微积分,这将不可避免地导致游戏的更高开销

增加开销的概念在这里很清楚,我如果你真的想要最准确的物理模拟,你将引入越来越多的计算,这对于游戏来说会有效地使它变得更更难保持模拟的流畅回放,尤其是当有更多的object需要检查时。例如比较完美Per Pixel Intersection to less perfect Axis Aligned Bounding Box Intersection的性能开销。如果您玩的是 Pong 或 Atari 风格的突破游戏,AABB 是完全可以接受的,唯一的问题是球恰好击中了拐角处的另一个矩形。同时,没有足够的 objects,其中每个像素的交叉点也很可怕(特别是如果你只考虑球与其他 objects 的交叉点)。


当一个人在游戏中处理复杂的交集时,欺骗和使用近似值来掩盖乏味的物理计算是关键。以我们之前的每像素相交示例为例,这次使用类似于马里奥游戏的东西。我们不能仅仅找出与马里奥有关的交叉点,因为他还可以投掷需要碰撞检测的火球,或者与其他敌人互动的敌人。在这种情况下,您可以使用类似 Quad Tree 的东西,它会不断将更多的碰撞细化到包含预定密度的 object 碰撞的碰撞区域。现在重新考虑我们的 pong 例子,比如在组合中再添加 4 个球。 一个真正狡猾的程序员可以先使用四叉树将交叉点放入区域,然后在确定与每像素交叉点的确切碰撞之前与 AABB 进行初步交叉,如果形状被标记为复杂的话。

Minkowski Portal Refinement or it's cousin GJK distance algorithm 这样的算法,它给你凸集之间的最短距离,可能是我能给出的最接近的答案作为解决方案。我个人对这些算法没有太多经验,但这是我能推荐的最好的 正确答案。这些算法非常先进,绝对超出了 beginner-intermediate 程序员的范围。


关于子弹碰撞的补充说明

如果你来这里是因为想玩射击游戏,我还有一个 gem 给你。我不建议实际制造子弹 "collidable" objects(也许是移动速度较慢的导弹)。相反,您可以保持枪口闪光,但将视觉子弹变成一种效果。现在要计算子弹是否命中,您可以使用从枪口延伸的对齐锥体进行计算。圆锥体从尖端到无限底部的半径变化可以根据精度统计确定为常数,也可以根据连续开火进行扩展。然后你考虑到,圆锥体与所需 object 的百分比相交,并乘以 RNG 概率,判断子弹是否命中。因此,我们将子弹交互简化为锥体与 objects 碰撞,并将其余部分留给随机数生成。因此,获得精确物理模拟的错觉。 想象一下现在实现 mini-gun 是多么容易,在我们基于 non-RNG 的示例中,它必须吐出的所有子弹都会造成大量滞后。