在2D物理引擎中,当物体静止时,如何避免无用的碰撞解决方案?


9

在我正在使用love-2d开发(用于学习)的物理引擎中,我通过以下方式实现了碰撞解决方案:

FixedUpdate(dt)  // I use fixed timestep
 foreach collide c1 in allNotStaticColliders
   c1.integartePhysic // i.e. apply gravitational force..
   foreach collider c2 "near" c1 // "near"= I use spatial hashing 
      if collide(c1,c2)
        resolve collision (c1,c2)  // the heavy operation
        collison callbacks c1
        collison callbacks c2
        ...

物体掉落并停下来的动画

如您所见,在gif动画的末尾,当所有对撞机几乎都固定在静态对象上时,FPS会衰减。

最终静态,具有2 FPS

这是因为碰撞解决方案的数量随着对象在静止时花费更多的时间而增加。但是,许多计算都是“无用的”,因为对象已经相对彼此沉降到稳定的位置。

避免这些“无用的”碰撞检测的最佳实践(最好是不需要物理学位)是什么?

编辑:接受DMGregory提示,并得出此结果(尚不理想)

在此处输入图片说明

(红色=静态,蓝色=活动,绿色=睡眠)


1
通常的方法是“休眠”要休息的对象,而不考虑休眠/静态对象之间的交互(但是仍可以通过仍处于唤醒和移动中的动态对象的交互来唤醒休眠的对象)。不幸的是,这仅在物体完全静止时才有用。如果我正确地阅读了您的示例,则当对象仍然稳定并稍微移动时,似乎会出现性能问题。我在这里可以做的就是为系统增加更多的摩擦/阻尼(可能带有速度阈值),以便较小的运动更快地衰减到真正的静止状态。
DMGregory

@DMGregory听起来不错。加吗
安科

Answers:


9

我怀疑OP已经知道这种方法,因此我在评论中只是作为起点提到了它,但我将尝试使其更加充实...

大多数物理引擎将动态对象分为“ 清醒 ”和“ 睡眠 ” 两类。

物体静止时会睡觉,而当物体受到外部影响而移动或加速时会唤醒。

一个沉睡的对象行为就像在大多数方面的静态对象-它的运动是不会随着时间的整合(因为它是在休息,所以它没有运动),并且正在睡觉的对象或静态的引擎忽略的冲突。

尽管缺少碰撞响应,但坐在静止地板上的睡眠物体不会掉落,因为对于包括重力在内的睡眠物体,所有运动集成都被跳过。

因此,仅需要检查涉及至少一个唤醒动态对象的冲突:

Collisions    Static          Sleeping           Awake
          ------------------------------------------------
Awake     |    Check        Check & Wake         Check
Sleeping  |     No               No
Static    |     No

这样可以大大减少需要主动仿真的对象的数量,尤其是在桩中,如问题所示,它们相互之间有很多碰撞,以检查很少甚至没有净运动。

不过,只有在对象实际到达静止状态时,睡眠才有帮助,这可能需要一段时间。

您可以做一些事情以早日休息:

  • 最小速度或动量不为零,并将低于该速度或动量的任何东西钳制为零。(这基本上是一个epsilon,通常用于比较浮点数)

  • 使用摩擦,阻尼和非弹性碰撞将能量从系统中吸收出来,并帮助其更快地达到静止状态。

  • 为缓慢移动的对象有选择地增加摩擦/阻尼/非弹性,以使它们最终微动,而不影响更多高能体的行为。


好答案。您指出了一个好主意。对于睡眠/清醒检查,我看到两个弱点:1)如果处于睡眠对象o2下的睡眠对象o1醒来离开o2,则它不会唤醒o2;2)如果我移除一个处于休眠状态的物体下方的静态平台,则该物体不会唤醒(在重力作用下)
dnk drone.vs.drones

1
@ dnkdrone.vs.drones好的观察。我自己从来没有写过物理引擎,所以我不确定如何正常处理。一种可能性是,当将一个对象设置为睡眠状态时,我们存储它正在触摸的对象列表(或将其添加到本地对象集群中)。当我们唤醒睡眠对象时,我们还将唤醒其列表/群集中的所有内容。可能会有更多优雅的选择,例如在醒来时(在移开之前)检查附近的联系人。
DMGregory
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.