运动方程与Verlet:忽略碰撞



我最初使用标准运动方程对模拟进行编码,但众所周知,它最终非常不稳定,即使它在技术上有效。

如果我们取x(t(作为运动方程的位置函数;下一个";通过重新分解x(t+delta(在模拟中的位置,如下所示:

x(t+delta) = x(t) + (1/2)*a*delta^2 + a*t*delta
t = t + delta

最重要的是,a计算为NetForce/Mass。如果我的系统/粒子遇到碰撞,法向力会影响净力,使其在碰撞轴上为0(即,如果它落在地面上,重力下拉,地板的法向力抵消重力(<到目前为止,这在任何类型的碰撞中都非常有效>

然而,我决定切换到Verlet集成,因为众所周知它更稳定,而且出于某种原因,它完全忽略了碰撞。我使用以下公式:

x(t+delta) = x(t) + v(t) * delta + .5*a(t)*delta^2
v(t+delta) = v(t) + .5 * (a(t) + a(t+delta)) * delta
a(t+delta) = NetForce / Mass
t = t + delta

其中v(0(=0,a(0(=0。因此,除了旧的位置,我还存储了旧的加速度和速度。然而,我遇到了前面提到的问题:它就是不能正常工作,因为它忽略了碰撞。尽管它应该已经被考虑到加速度中。。。

我应该如何处理?

它不是应该是:吗

if x(t) is a position of collision:
v(t+delta) = v(t) - 2*( dot(normal_at(x(t)), v(t)) / norm(normal_at(x(t))^2 )*normal_at(x(t))
x(t+delta) = x(t)
else: 
x(t+delta) = x(t) + v(t) * delta + .5*a(t)*delta^2
a(t+delta) = NetForce( x(t+delta) ) / Mass
v(t+delta) = v(t) + .5 * (a(t) + a(t+delta)) * delta   
t = t + delta

最新更新