Matter.js如何检测物体是否停止运动?

3

我正在使用matter.js创建一个2D场景。我对场景中的物体施加力,这些物体会撞击其他物体,但最终所有物体都因摩擦和能量损失而停止运动。

不知何故,我需要检测场景中所有物体停止运动的时间。我发现很难做到这一点,因为在查阅文档后,我没有找到内置方法来进行检查。同时,我尝试遍历场景中的物体并检查一些属性,以确定对象是否在移动或静止,但这并没有帮助我解决问题。

有人知道一种干净的方法来检查场景中所有物体是否都停止运动了吗?

1个回答

4
你是否尝试循环遍历bodies并检查属性speedangularSpeed是否接近于零?(请记住,将任何浮点数与精确的零比较几乎永远不会给出您期望的行为。)

实际上,目前我正在使用速度来检查物体是否在移动。也就是说,如果速度低于某个阈值,我就假设物体没有在移动。为什么速度不是一个确定的0呢? - undefined
为什么还要考虑角速度呢? - undefined
从非常准确的意义上讲,只有当速度为零时,运动才会停止。然而,在浮点格式中,速度远离零时,运动变得难以察觉。通常情况下,即使大陆漂移每年只有几毫米,你也不会考虑到它。由于小气流湍流引起的小振荡也是存在的,但在运动中并不计算。在强风下,一个大型塔楼甚至可能在其顶部以几米的幅度振荡,但对于未经仪器检测的眼睛来说,并不被视为运动。 - undefined
正如@LutzL所说的那样。此外,如果物理引擎中的一个物体受到恒定力(例如重力)的作用,并且处于持续碰撞状态(例如静止在地面上),它的速度可能仍然非常微小且波动,尽管这是无法察觉的。这是游戏物理引擎实现的一种副作用,为了性能而牺牲了准确性。 - undefined
有没有办法在这个时候触发一个事件?还是我应该在异步循环中检查所有物体的移动? - undefined
Matter.js中有一个事件机制。例如,物理引擎具有beforeUpdate钩子,请参见https://github.com/liabru/matter-js/blob/master/examples/events.js。看起来个别物体没有事件钩子,如果能在观察的物体上使用`afterUpdate`钩子来测试它们的速度将会很有用。但也许我漏掉了什么,文档和示例对实现细节并不是非常详尽。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接