【问题标题】:Equations of motions vs Verlet: Collision ignored?运动方程与 Verlet:碰撞被忽略?
【发布时间】:2020-11-12 19:45:13
【问题描述】:

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

如果我们将 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。因此,除了旧位置之外,我还存储旧的加速度和速度。 但是,我遇到了上述问题:它无法正常工作,因为它忽略了碰撞。即使它应该已经被考虑到加速度中......

我应该如何处理这个问题?

【问题讨论】:

    标签: simulation physics numerical-methods


    【解决方案1】:

    难道不是这样的:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2015-02-19
      相关资源
      最近更新 更多