【问题标题】:Collision detection for fast flying small objects快速飞行小物体的碰撞检测
【发布时间】:2019-01-07 18:14:11
【问题描述】:

我想模拟粒子的快速运动,这些粒子比它们通过的帧间间隙距离小两倍多。考虑以下情况,3个相同半径的粒子以相同的速度移动到中心的一点。像

这样的代码
for(i..) 
  for (j..) 
    check_if_ith_collides_with_jth();`

在其最简单的实现中,系统可能会表现如下:

但是在特定的反弹情况下,当 3 个(或更多)粒子同时碰撞时应该发生什么:

我想要任意数量的粒子的解决方案。这通常是如何解决的? 我可以用 4 个粒子展示更复杂的情况:

是否可以在一个固定的、更大的框架内覆盖?

【问题讨论】:

    标签: collision-detection simulation game-physics bounce physics-engine


    【解决方案1】:

    定义“时间”。从您的角度来看,我可能会误解其中的一些内容,并且不确定“帧大小”是否与此有关。我之前已经实现了基于物理的多粒子碰撞跟踪模拟,并且遇到过此类问题。首先,您需要问自己,获得所有同时发生的碰撞是否会使您对这个特定的应用程序受益。

    在我的回答中,我假设这是一种离散时间事件驱动的模拟,其中粒子沿着它们的轨迹向前推进,并且碰撞测试应用于所有对。 CPA = 最近的接近点。

    一种观点可能是检测时间存在一些最小误差条,并且您可能会发现大量对相对于该误差条“同时发生碰撞”。因此,在您测试它们的任何步骤中,您都可以采用 CPA 距离在阈值内且预计 CPA 时间在 current_time +/- 误差内的所有对。这将捕获所有符合您标准的对。这是可调整的,不同的 CPA 时间和距离阈值将在相同的初始条件下产生不同数量的对。

    第二个观点是,由于错误,此级别的信息无法跟踪此信息,您可以只使用遇到碰撞的第一对,继续模拟并在下一次通过时捕捉其他人。如果没有一些制衡,您可能会错过一些相互“通过”的东西,但这可以通过调整步长和实施一些逻辑来检查结果来解决。

    如果您要通过第二个建议来实现,那么设置一个对称测试用例必然会“无法”重现理论结果,但这又不是一个有意义的测试。

    相同类型的推理适用于三个或更多粒子在同一地点和同一时间碰撞。除非您设置了一个对称的测试用例,否则这不太可能发生,并且如果您的模拟应用于现实情况中的某些东西,“噪音”可以让您无需关心该级别的精度。实施第一个建议可能会得到您提供的特殊情况,但也可能会在没有真正发生时预测多粒子碰撞。

    CPA 通常应用于具有恒定加速度的直线运动,但类似的概念可以应用于更复杂的情况,特别是如果步长很小,您可以在时间步内假设一个粗略的 CPA,或者只检查两者之间的距离与阈值配对。

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多