在已知弹簧-阻尼系统的数学模型之后。我们需要知道的是,我们并不想要两个碰撞的刚体出现震荡,而是希望刚体碰撞之后立即弹开,这才是现实中两个刚性物体碰撞的正常效果。为了达成这种效果,我们最好选择重阻尼或者临界阻尼这两种模型中的一种。并且,为了迅速的将两个产生穿透的刚体分开,我们需要在物理渲染一帧的时间内,将简谐运动的幅度降低到0,以保证我们的物理动画更加真实。
为了达到真实的效果,对于该模型的一些关键参数我们需要人为的设定它。
首先是两帧之间的间隔时间,应该小于周期的一半,原因是,我们观察简谐运动的曲线可以发现,周期一半正好是弹簧向外弹开物体的最大点,也是开始收缩的最小点,我们当然不希望已经要分开的物体再次的碰撞在一起,所以两帧之间的时间间隔要小于震动周期的一半

当我们对两帧的间隔时间取极值,也就是周期的一半就可以利用这一点求出一个可用的弹簧的弹性系数k。

由于


这样根据上式,我们就可以推导出 k 的大小

然而光有一个弹性系数是不够的,我们还需要一个阻尼系数 b 用于控制简谐运动的衰减。由于我们需要一个足够大的阻尼来避免碰撞来产生的震荡,所以我们需要利用高阻尼简谐运动的条件来推导阻尼系数。也就是

下面是推到步骤




由于 c 为无穷大,所以推导出

由于 k 是与帧数相关,是已知条件,所以 b 就可以利用 k 来求出。同样可以求出来的还有震荡的频率,由于满足。

所以,震荡的频率为

这意味着震荡消失了,周期趋近于无穷大。推导出谐振子运动的指数衰减公式。

由于后面的cos项是一个常数了,所以可以简化为

这时候我们就疑惑了,既然周期趋近于无穷大了,那么显然两帧之间的间隔时间必定小于周期的一半,那对两帧间隔时间取极值还有什么意义呢,并且我们应该如何求出两帧的间隔时间呢。这个不急,我们接下来会慢慢的说。首先指数衰减,通常以衰减到exp(-1) = 0.37为标准。

也就是,我们可以将这里面的 τ 设定为我们进行运动插值的步长。也就说说在两帧的间隔时间内若干步插值计算的常数。



可以看到,当确定插值的常数之后我们就可以确定出弹性因子与阻尼因子。在两帧之间我们肯定需要在考虑的就是,如何将运动的幅度降低到一个范围内,也就是下图的范围。

我们既然取了时间τ为时间的步长,那我们就需要知道要插值几步才能满足上述条件。所以推到:


这样的话我们就求出了两帧之间的间隔时间与插值的时间步长的关系。也就是解决了如何通过两帧的间隔时间求出插值的步长。

本文探讨了在物理模拟中如何避免刚体碰撞后的震荡现象,倾向于采用重阻尼或临界阻尼模型。通过设置合适的弹性系数k和阻尼系数b,确保在两帧间隔时间小于周期一半的情况下,实现简谐运动快速衰减。通过数学推导,得出k和b的计算方法,并解释了如何确定插值步长以在两帧间有效地降低运动幅度,从而增强物理动画的真实感。
6607

被折叠的 条评论
为什么被折叠?



