Lecture 22:Animation (cont.)
- 今日话题
- single particle simulation
- 详细的欧拉方法
- instability and improvements
- 刚体模拟
- 流体模拟
- single particle simulation
- 广告
Single Particle Simulation
- 先模拟某个粒子在一个速度场中怎么移动
- 对于任何位置、任何时间,都知道其速度
- 对于任何位置、任何时间,都知道其速度
- Ordinary Differential Equation (ODE) 一阶常微分方程
- 设定起始位置
- 欧拉方法!——最简单的思路(或者前向欧拉、显式欧拉)
- 始终用上一刻时间的量估算下一刻的量
- 但是非常不准,而且会迅速变得不稳定
- 欧拉方法的一个问题——误差
- 小步长较为精确,大步长不够精确
- 可以通过减小步长缓解
- 欧拉方法的另外一个问题——稳定性
- 比如螺旋形场不管如何减小步长,最后都会飞出去
- 下面第二个图会越模拟越大,不会按照道理水平
- 不稳定性就是无论步长如何,最后结果都会和实际结果无限远
- 误差和不稳定性
- 误差问题不大,可以通过减小步长降低
- 不稳定问题很大,会diverge——差得特别大,而且一定会出现
- 不稳定性的例子
Combating Instability 解决不稳定性
- 如下一些方法,挨个说
- 方法一:Midpoint Method 中点法
- 取欧拉方法的目标点与起点的中点,以该中点的速度重新对起点计算欧拉方法
- 写出并展开,实际上是因为中点法比欧拉方法多了一个二次项
- 取欧拉方法的目标点与起点的中点,以该中点的速度重新对起点计算欧拉方法
- 方法二:Adaptive Step Size —— 中点法更好的应用,一个自适应思路
- 将时间分半计算两次 ΔT/2
- 是否继续分半取决于分与不分的差别大不大
- 在不同的位置选用不同的 ΔT 做计算
- 方法三:Implict Euler Method 隐式的欧拉方法
- 也被称为backward methods,后项的欧拉方法
- 用的永远是下一个时间的导数
- 比较不好解,怎么办?
- 只需要解下一个时刻的位置和速度
- 但是稳定性非常好
- 如何定义方法是否稳定、多么稳定?
- 定义每一步的截断误差
- 以己整体最后的误差
- 研究误差如何随着更小的ΔT而减小,二者间的关系
- 隐式的欧拉方法是一阶的
- 局部误差是O(h平方)
- 全局误差是O(h)
- h即为ΔT
- 理解h,对于O(h)如果h减小一半误差也减小一半
- 说明阶数越高越好
- 一类有名的方法,龙格库塔方法
- 此方法擅长解ODE
- 特别是非线性的方法
- 其中一个用的最广泛的方法,四阶方法——RK4
- 去哪了解更详细?数值分析!
- 方法四:Position-Based / Verlet Integration
- 不是基于物理的方法
- 比如当弹簧的长度超过一个阈值,让它立刻回归原长度
- 快速简单
- 但是有时候不太能量守恒
Rigid Body Simulation 刚体模拟
- 刚体不会发生形变
- 内部相对一致
- 各种物理量的求导
Fluid Simulation 流体模拟
- 所谓 position-based 方法,一些假设:
- 认为水体又一堆刚体小球形成
- 水在任何地方都是不可压缩的,密度一致
- 由此产生解决思路,如果有地方密度不一样,则需要进行修正——通过移动小球的位置修正
- 为了修正,需要任何一点对所有小球粒子位置的梯度/导数
- 接下来,就是梯度下降法!
- 这是不基于物理的模拟!
- 拉格朗日方法(质点法) vs. 欧拉方法(网格法)
- 对于大规模物体模拟的两种方法!
- 最近有人把这两种方法结合了 MPM
- 由格子到粒子
- 由格子到粒子
- 对于大规模物体模拟的两种方法!
- 课上完了 (准备回去补写前面12节的笔记
- 下边一步怎么学习?
- realtime rendering + opengl?
- 学directX + realtime path tracing?
- 几何得有深厚数学基础!
- 光线传播的话看本讲后面的广告!
- 模拟仿真得去看games201
- 广告不写了先
- 拜拜!