上下文
我需要在物理模拟中检测高速物体的碰撞。由于从网格中截断数字和对象的数字表示,快速移动的对象很可能会相互穿过或错过。我试图通过模拟“模拟”或现实生活运动的属性来执行插值碰撞,其中物体在每个点上移动。 (现实世界中的物体通常不会在宏观层面上传送到下一个点)
研究和深谋远虑 我们能够找到投影物体的最终和初始点,时间和速度的位移。我使用每像素碰撞来获得像素图,因此我们有一个像素簇。目前我解决这个问题的方法是使用牛顿方法来计算线性交点。
问题:如何计算像素群的交点,就像“单个像素”或“正常”行一样。
奖金:非线性运动(带加速度的速度)或计算插值内的多个碰撞(弹性碰撞会使其中一个碰撞物体与另一个碰撞物体发生碰撞否则会在最近的碰撞中移动,但会丢失。这最好都在插值计算中。)
答案 0 :(得分:2)
嗯,一年后没有答案,所以我想我会尽我所能尽力回答自己的问题。
似乎很多游戏并不关心这种特殊情况,不幸的是,这种情况很常见。游戏中的许多高速物体有时会因为缺乏捕捉它的机制而变成墙壁或墙壁。实现捕捉高速物体的东西需要插值微积分,这将不可避免地导致游戏的开销更高。
增加开销的概念在这里很明显,我很强烈你真的想要最精确的物理模拟,你会引入越来越多的计算,这对于游戏来说会有效地使其变得越来越难以维护平滑播放模拟,特别是如果要检查的对象数量更多的话。例如,比较完美Per Pixel Intersection与不太完美Axis Aligned Bounding Box Intersection的性能开销。如果你有Pong或Atari风格突破的游戏,AABB将是可以接受的,唯一的障碍是球正好在角落处击中另一个矩形。同时,没有足够的物体,每个像素的交点也很可怕(特别是如果你只考虑相对于其他物体的球的交叉点)。
当人们在游戏中处理复杂的交叉点时,作弊和使用近似来掩盖低迷的物理计算是关键。以我们之前的每像素交叉点为例,这次使用类似马里奥游戏的东西。我们不能仅仅考虑与马里奥相关的交叉点,因为他还可以投掷需要碰撞检测的火球,或者与其他敌人交互的敌人。在这种情况下,您可以使用像Quad Tree这样的东西,它会不断地将更多数量的碰撞细化到包含预定密度的物体碰撞的碰撞区域。现在重新考虑我们的乒乓球示例,例如在混音中增加4个球。 一个真正狡猾的程序员可以首先使用四叉树将交叉点放入区域,然后在确定与Per Pixel Intersection的精确碰撞之前执行与AABB的初步交叉,如果形状被标记为复杂的那样。
像Minkowski Portal Refinement或它的堂兄GJK distance algorithm这样的算法可以提供凸集之间的最短距离,这可能是我作为解决方案可以提供的最接近的答案。我个人对这些算法没有太多经验,但这是我能推荐的最佳真实答案。这些算法非常先进,绝对超越了初级中级程序员。
关于子弹碰撞的补充说明
如果你来到这里是因为你在考虑一个射击游戏,我还有一个宝石给你。我不建议实际制造子弹“可碰撞”物体(可能是速度较慢的导弹)。相反,你可以保持枪口闪光,但将视觉子弹变成效果。现在要计算子弹是否击中,您可以使用从枪口延伸的对齐锥体进行计算。锥体从尖端到无限底部的半径的变化可以从精度统计确定为常数,或者基于连续火焰来扩展。然后考虑一下,锥体相交多少所需物体的百分比,再乘以子弹是否命中的RNG概率。因此,我们将子弹交互简化为锥形与物体碰撞,并将其余部分简化为随机数生成。因此,获得精确物理模拟的错觉。 想象一下现在实施迷你枪是多么容易,这会使我们在基于非RNG的示例中吐出的所有子弹产生大量滞后。