12 Animation
Mass Spring System#
A Simple Spring#
\[\begin{aligned}
& \boldsymbol{f}_{a\to b}=k_S(\boldsymbol{b}-\boldsymbol{a}) \\
& \boldsymbol{f}_{b\to a}=-\boldsymbol{f}_{a\to b}
\end{aligned}\]
考虑弹簧原长度:
\[\boldsymbol{f}_{a\to b}=k_S\frac{\boldsymbol{b}-\boldsymbol{a}}{||\boldsymbol{b}-\boldsymbol{a}||}\left(||\boldsymbol{b}-\boldsymbol{a}||-l\right)\]
考虑弹簧上的微小摩擦:
\[f_{\boldsymbol{b}}=-k_d\frac{\boldsymbol{b}-\boldsymbol{a}}{\|\boldsymbol{b}-\boldsymbol{a}\|}(\dot{\boldsymbol{b}}-\dot{\boldsymbol{a}})\cdotp\frac{\boldsymbol{b}-\boldsymbol{a}}{||\boldsymbol{b}-\boldsymbol{a}||}\]
Structures from Springs#
Note
能够保证在拉伸、压缩、翻折的时候都会导致部分弹簧长度变化,从而能自发稳定到平面形态
Note
Finite Element Method (FEM) 也可以用来实现类似的效果
Particle Systems#
- 每个粒子的运动都取决于外力作用
- 可能需要很多的粒子,以及邻居搜索的数据结构
Simulated Flocking#
Note
定义个体和群体之间的关系,状态更新
Kinematics#
Forward#
Inverse#
Note
- 可能没有唯一解,可能没有解
- 可以使用优化法来解方程
Rigging#
例如通过控制骨骼或者可动单元的控制点,来控制人物姿势或表情
Motion Capture#
Facial Motion Capture#
Production Pipeline#
Single Particle Simution#
模拟一个粒子在速度场中的运动
常微分方程:
\[\frac{\mathrm{d}x}{\mathrm{d}t}=\dot{x}=v(x,t)\]
Euler's Method#
\[\begin{aligned}\boldsymbol{x}^{t+\Delta t}&=\boldsymbol{x}^t+\Delta t\boldsymbol{\dot{x}}^t\\\boldsymbol{\dot{x}}^{t+\Delta t}&=\boldsymbol{\dot{x}}^t+\Delta t\boldsymbol{\ddot{x}}^t\end{aligned}\]
Note
- simple iterative
- commonly used
-
very inaccurate
-
most often goesunstable
Errors#
Note
减小 \(\Delta t\) 能够减小误差
Instability#
Note
- 误差会积累,造成模型发散
- 实际运用中,误差可以在一定程度上忽略,但是不稳定性不可被忽略
Midpoint Method#
Note
- 计算欧拉方法
- 得到欧拉方法下的中点速度
- 使用这个中点速度
\[\begin{aligned}
x_{\mathrm{mid}} & =x(t)+\Delta t/2\cdot v(x(t),t) \\
x(t+\Delta t) & =x(t)+\Delta t\cdot v(x_{\mathrm{mid}},t)
\end{aligned}\]
Modified Euler#
\[\begin{aligned}
& \boldsymbol{x}^{t+\Delta t}=\boldsymbol{x}^t+\frac{\Delta t}{2}(\dot{\boldsymbol{x}}^t+\dot{\boldsymbol{x}}^{t+\Delta t}) \\
& \dot{\boldsymbol{x}}^{t+\Delta t}=\dot{\boldsymbol{x}}^t+\Delta t\ddot{\boldsymbol{x}}^t \\
& \boldsymbol{x}^{t+\Delta t}=\boldsymbol{x}^t+\Delta t\dot{\boldsymbol{x}}^t+\frac{(\Delta t)^2}{2}\ddot{\boldsymbol{x}}^t
\end{aligned}\]
Note
- 使用起点和终点处的平均速度
- 引入二次关系,更加准确
Adaptive Step Size#
Note
- 按照一个步长 \(\Delta t\) 计算得到一个终点
- 取 \(\Delta t/2\) 计算两次得到另一个终点
- 每次都取更小的步长,直到得到的终点位置相近
Implicit Euler Method#
\[\begin{aligned}
\boldsymbol{x}^{t+\Delta t} & =\boldsymbol{x}^{t}+\Delta t\boldsymbol{\dot{x}}^{t+\Delta t} \\
\boldsymbol{\dot{x}}^{t+\Delta t} & =\boldsymbol{\dot{x}}^{t}+\Delta t\boldsymbol{\ddot{x}}^{t+\Delta t}
\end{aligned}\]
Note
- 直接使用下一时刻的速度加速度
- 稳定性好,但是需要解方程
quantize "stability"
- 两种误差定义
- local truncation error (every step) 局部截断误差
- total accumulated error (overall) 整体积累误差
- 假设 \(h=\Delta t\) 表示步长,考虑两种误差的阶(对于隐式欧拉方法)
- local: \(O(h^2)\)
- global: \(O(h)\)
- 如何理解 \(O(h)\)
- 将步长减小一半,误差也可以减小一半
Runge-Kutta Families - RK4#
a family of advanced methods for solving ODEs, RK4 is a order-four version
Position-Based / Verlet Intergration#
Note
- 不完全基于物理
Rigid Body Simulation#
\[\frac{d}{dt}
\begin{pmatrix}
{\mathrm{X}} \\
{\theta} \\
{\dot{\mathrm{X}}} \\
{\omega}
\end{pmatrix}=
\begin{pmatrix}
{\dot{\mathrm{X}}} \\
{\omega} \\
{\mathrm{F}/M} \\
{\Gamma/I}
\end{pmatrix}\]
是对粒子模拟的扩展
Fluid Simulation#
- 假设用粒子模拟水
- 假设水是不可压缩的
- 如果出现了密度不正确的部分,需要修正小球的位置来纠正密度
- gradient descent 进行局部调整,直到密度不超过阈值
Eulerian vs. Lagrangian#
- lagrangian: 考虑空间所有的网格
- eulerian: 考虑很多粒子
Material Point Methods (MPM)#
- 使用 eulerian 中的粒子来表示物质性质
- 使用 lagrangian 的网格进行计算
- 同步更新两种数据结构