Games201-弹簧质点系统

常规公式理想情况可行,连续方程根据运动学可以直接写出来

\[y(t)= \frac{1}{2}at^2+v_0t+y_0 \]

游戏中的情况是很复杂的加速度时刻都在变化,速度也会由于碰撞而时刻变化,这时就需要离散化数据,划分成一个个小的时间步,在每个时间步内这些物理量认定为常量然后求解。

因此我们需要转用数值方法求解:

时间上连续的问题转化为近似离散的问题,以时间步来划分,一步一步模拟

牛顿第二定律计算力,从当前时间步的力得出当前时间步的加速度然后结合速度求出下一时间步的位置

前向、显式欧拉

先更新位移再更新速度

\[r(t+\Delta t)=r(t)+v(t)\Delta t \\ v(t+\Delta t)=v(t)+a(t)\Delta t \]

半隐式欧拉 Semi-implicit

symplectic Euler

先更新速度,然后用更新过的速度去更新位移

是一个递推的方式

容易实现、对比较硬的材料不太好

可以用一些方法去分析数值稳定性

隐式欧拉

你的未来不止受到你的过去影响,还受到你的未来影响,显示积分容易出现时间步比较大,稳定性之类的问题,隐式欧拉相对稳定

\[\frac{\partial \mathbf{f}_{ij}}{\partial \mathbf{x}_i}=-k\left[ \mathbf{I}-\frac{l_{ij}}{\lVert \mathbf{x}_{ij} \rVert}\left( \mathbf{I}-\widehat{\mathbf{x}}_{ij}\cdot \widehat{\mathbf{x}}_{ij}^{\text{T}} \right) \right] \\ \frac{\partial \mathbf{f}_{ij}}{\partial \mathbf{x}_j}=-\frac{\partial \mathbf{f}_{ij}}{\partial \mathbf{x}_i} \\ \mathbf{J}_{ij}=\sum_{\text{k}}^{\text{n}}{\frac{\partial \mathbf{f}_{ik}}{\partial \mathbf{x}_j}} \]

https://forum.taichi.graphics/t/hw-0-5/707

https://blog.mmacklin.com/2012/05/04/implicitsprings/

https://mortal.blog.csdn.net/article/details/107093055

中点法

前向欧拉 semi欧拉 中点法的主要区别就是离散取值的位置不同,想象你有一条速度曲线你想通过其积分得到位移,离散化了很多小矩形,矩形的左上角在曲线上是前向欧拉,矩形的右上角在曲线上是隐式欧拉,中点法就是取矩形的中线在曲线上(Semi-implicit的方法先根据当前加速度预测一个速度值,意思就是矩形的右上角在曲线的切线上)

Helpful hints:

  • Don’t use Euler’s method (you will anyway.)
  • Do use adaptive step size

CFL condition

显式时间积分

从材料刚度有考虑时间步长限制

从粒子运动速度来考虑时间步长限制

各模拟都要遵循这个条件,我们要取这个Cmax

粒子对场景的碰撞

瞬时改变粒子的速度

相当于一个冲量

粒子碰撞有弹性和非弹性碰撞

image-20201225003053671

Verlet积分

Verlet积分:

\[r(t+\Delta t) = 2r(t) -r(r-\Delta t)+a(t)(\Delta t)^2 \]

注意:没有记录粒子的速度

好处:可以实现简单的距离约束,可以用松弛法满足多个约束

过程:先计算出一个 \(\ r(t+\Delta t)\)然后再用约束去纠正,使计算结果满足约束

加入不同的约束可以有不同的效果 比如一个抗变形的约束

Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域。Verlet算法要解决的问题是,给定粒子t时刻的位置r和速度v,得到t+dt时刻的位置r(t+dt)和速度v(t+dt)。最简单的方法是前向计算(考虑当前和未来)的速度位移公式,也就是显式欧拉方法,但精度不够,且不稳定。Verlet积分是一种综合过去、现在和未来的计算方法(居中计算),精度为O(4), 稳定度好,且计算复杂度不比显式欧拉方法高多少。

对于Verlet算法详细的介绍,可以参考维基百科:Verlet integration

Verlet算法简要介绍

\1. 将 x(t+Δt) 和 x(t-Δt) 进行泰勒展开

粒子运动模拟 - Verlet积分算法简介

\2. 将以上两个表达式进行相加,得到位置表达式

粒子运动模拟 - Verlet积分算法简介

这个式子就显明,如果知道当前时刻的位置和加速度,前一时刻的位置,就可以推算出下一时刻的位置。

\3. 将1中的两个式子相减,再同时除以 2Δt 即可获得速度表达式

粒子运动模拟 - Verlet积分算法简介

这个式子显明,只有在知道前一时刻和后一时刻的位置时,才有可能知道当前时刻的速度。也就是说,在当前时刻不能获得速度信息,必须要等到下一时刻的位置确定以后,才能返回来计算当前的速度。

\4. 力(加速度)根据当前的位置 x(t),基于一定的势函数进行更新

Verlet算法积分步运行过程

根据verlet算法,要计算t' ( = t+Δt)时刻的位置,必须知道 t'-2Δt 时刻和 t'-Δt 时刻的位置, t'-2Δt 的速度和 t'-Δt 时刻的加速度。具体演绎过程如下:

\1. 根据 t'-Δt 和 t'-2Δt 时刻的位置、 t'-Δt 时刻的加速度 ,获得当前时刻 t' 的位置。

\2. 根据当前时刻 t' 的位置,更新当前位置下的加速度(受力)。

\3. 同时,可以更新 t'-Δt 时刻的速度。(速度是附带更新了,不更新速度并不妨碍积分过程继续下去。)

那么,现在就获得了 t' 时刻的位置, t'-Δt 时刻的速度和 t' 时刻的加速度,相当于将已知条件向前推进了一步(可以对比红色的部分)。

接下来的过程就是重复上面的过程。下图生动的反映了这个过程。

粒子运动模拟 - Verlet积分算法简介

其中t表示时间,r表示位置,v表示速度,a表示加速度。

Fast Mass Spring Simulation

关键:块坐标下降法求弹簧弹性势能最小值

数学上,克罗内克积(英语:Kronecker product)是两个任意大小的矩阵间的运算,表示为⊗。克罗内克积是外积从向量到矩阵的推广,也是张量积在标准基下的矩阵表示。

尽管没有明显证据证明德国数学家利奥波德·克罗内克是第一个定义并使用这一运算的人,克罗内克积还是以其名字命名。在历史上,克罗内克积曾以Johann Georg Zehfuss名字命名为Zehfuss矩阵

迭代次数很少

One problem with PBD is that its stiffness parameters are not compatible with the standard Hookean model.

共轭梯度法

http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf

posted @ 2021-02-28 14:59  飞翔的子明  阅读(676)  评论(0编辑  收藏  举报