GAMES101-现代计算机图形学学习笔记(22)
Lecture 22: Animation cont.
原课程视频链接以及官网
b站视频链接: link.
课程官网链接: link.
今天课程的内容主要讨论了如何对一些模拟进行求解,以及对应的方法:
- Single Particle Simulation
- Rigid body simulation
- Fluid simulation
Single Particle Simulation
这种方法是通过研究模拟单个粒子在速度场中的运动情况(速度场指的就是一种函数,在任意时刻
t
t
t 和位置
x
x
x,都有对应的速度取值
v
(
x
,
t
)
v(x, t)
v(x,t)):
而速度
v
(
x
,
t
)
v(x, t)
v(x,t) 通常可以用位移函数的一阶导数
x
˙
\dot{x}
x˙ 进行表示,其常微分方程形式为:
d
x
d
t
=
x
˙
=
v
(
x
,
t
)
\frac{d x}{d t}=\dot{x}=v(x, t)
dtdx=x˙=v(x,t)
所以我们可以求解这个常微分方程以得到对应时刻的粒子位置:
Euler’s Method
这种方法是通过时间间隔
Δ
t
\Delta t
Δt 来求解位置的,对于初始时间
t
t
t 和时间间隔
Δ
t
\Delta t
Δt,我们可以求解出对应变化的位移
x
t
+
Δ
t
\boldsymbol{x}^{t+\Delta t}
xt+Δt 和速度
x
˙
t
+
Δ
t
\dot{\boldsymbol{x}}^{t+\Delta t}
x˙t+Δt:
由于 Euler’s Method 依赖于
Δ
t
\Delta t
Δt 的取值,所以它的结果往往是存在误差和不稳定的:
误差是指当
Δ
t
\Delta t
Δt 取值越小,得到的
x
t
+
Δ
t
\boldsymbol{x}^{t+\Delta t}
xt+Δt 越精确:
不稳定是指无论如何减小
Δ
t
\Delta t
Δt,有一些情况始终无法通过模拟得到:
Instability and improvements
下面就有一些方法用来提高稳定性:
Midpoint Method
这种方法的步骤如下:
- 按 Euler’s Method 计算步长得到 a
- 计算 a 点与初始点的中点的速度(位移的导数)
- 按步骤 2 的速度更新初始点位置
这种方法为什么比 Euler’s Method 更稳定呢?因为它等于是用二次项进行模拟,更加准确:
Adaptive Step Size
这种方法的步骤如下:
- 按 Euler’s Method 计算步长得到位移 x T \mathbf{x}_{\mathrm{T}} xT
- 计算 x T \mathbf{x}_{\mathrm{T}} xT 点与初始点的中点的速度,并用这个速度更新得到 X T / 2 \mathbf{X}_{\mathrm{T} / 2} XT/2
- 看 x T \mathbf{x}_{\mathrm{T}} xT 与 X T / 2 \mathbf{X}_{\mathrm{T} / 2} XT/2 距离是否过远,如果较远的话就表示 Δ t \Delta t Δt 较大,需要对其进行缩小;
Implicit Euler Method
该方法是用未来的一些量(速度、加速度)来求解这个时刻的位移,比如说假设下一个
Δ
t
\Delta t
Δt 的加速度
x
¨
t
+
Δ
t
\ddot{\boldsymbol{x}}^{t+\Delta t}
x¨t+Δt 和当前时刻的位移
x
t
\boldsymbol{x}^{t}
xt 已知,那么就可以求解出下个
Δ
t
\Delta t
Δt 的速度和加速度(两个方程两个未知数肯定可以求解):
如何定义方法是否稳定?这里引入了阶来进行描述:
假设 Implicit Euler 的阶为1,它的局部误差和全局误差分别为 O ( h 2 ) \mathrm{O}\left(\mathrm{h}^{2}\right) O(h2) 和 O ( h ) \mathrm{O}(\mathrm{h}) O(h),这里 h 指的是步长即 Δ t \Delta t Δt。
O ( h ) \mathrm{O}(\mathrm{h}) O(h) 表示当 h 减小一倍时,对应的误差也会减少一倍。
Runge-Kutta Families
Runge-Kutta Families 是用来求解常微分方程(ODEs)的一类方法,它能更好的模拟非线性的运动:
Position-Based / Verlet Integration
这种方法指的是通过一些规则使得粒子在走下一步时,下一步的位置会得到一定的限制,防止粒子发散,与预期不符(它不是基于物理的方法):
Rigid body simulation
刚体模拟(Rigid body simulation)不会发生形变,即刚体的内部都会以一种方式(趋势)进行运动,所以也可以把刚体模拟看成是粒子的扩充进行模拟:
当给定了微分方程后:
d
d
t
(
X
θ
X
˙
ω
)
=
(
X
˙
ω
F
/
M
Γ
/
I
)
\frac{d}{d t}\left(\begin{array}{l} \mathrm{X} \\ \theta \\ \dot{\mathrm{X}} \\ \omega \end{array}\right)=\left(\begin{array}{c} \dot{\mathrm{X}} \\ \omega \\ \mathrm{F} / M \\ \Gamma / I \end{array}\right)
dtd⎝⎜⎜⎛XθX˙ω⎠⎟⎟⎞=⎝⎜⎜⎛X˙ωF/MΓ/I⎠⎟⎟⎞
我们仍然可以按照模拟粒子运动一样,采用诸如 Euler’s Method 等方法求解常微分方程,来求解刚体的运动。
Fluid simulation
流体模拟(Fluid simulation )可以采用 Position-Based Method 进行,它是一种非物理的方法。
Position-Based Method 主要基于两个假设:
- 假设水是由无数小的刚体球体组成
- 假设水无法被压缩,即任意处水的密度相等
基于上述两个假设,Position-Based Method 就可以通过下述步骤模拟流体:
只要知道水的任意处密度发生了改变,就需要改变刚体球体的位置来修正这一部分的密度;
水的任意处的密度都是关于刚体球体的位置的函数,所以我们也能知道任意处的密度梯度,如果想要改变任意处的密度,只需要通过梯度下降法即可。
Eulerian vs. Lagrangian
前面讲了一些关于模拟粒子运动的方法,接下课程继续介绍了关于模拟大规模物质运动的两种思路:
(“质点法”) Lagrangian approach:依次模拟空间中每个粒子
(“⽹格法”) Eulerian approach:将空间划分为不同格子,考虑不同格子的运动和密度变化
Material Point Method (MPM) 是一种混合了上述两种方案的方法: