首页 > 解决方案 > 运动方程与 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。因此,除了旧位置之外,我还存储旧的加速度和速度。但是,我遇到了上述问题:它无法正常工作,因为它忽略了碰撞。即使它应该已经被计入加速度...

我应该如何处理这个?

标签: simulationphysicsnumerical-methods

解决方案


不应该是:

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

推荐阅读