GAMES101-22:动画2
前言
GAMES101-22:单粒子的运动的模拟方法(欧拉与其各种改进)、刚体模拟、流体模拟、网格法与质点法处理大量物体的移动问题
单粒子模拟
考虑一个粒子在速度场中速度随着时间的变化的模拟。即算常微分方程
简单而基础的方法:(前向)欧拉方法
其中右上角只是标记,不是指数;而一个点表示一次求导(即速度)。这种方式用上一帧的数据计算下一帧的数据。其问题在于:
- 不准确:步长(即两帧之间的间隔 )越大,结果越不准;
- 不稳定:对于圆周运动的情况,会变成螺旋形飞出去;
不准确在 CG 中往往可以理解容忍,但是不稳定、无论如何都得不到准确的结果是难以接受的。这种不稳定现象是欧拉方法试图用数值方法解微分方程的必然结果。
下面是一些解决了不稳定性的方法。
中点法
- 使用欧拉方法计算出在 o 点的粒子 p 下一步长所在的位置 a;
- 取 oa 中点 b 的速度场方向;
- 对(依然在 o 点的 p)应用 b 点的速度计算欧拉方法,得到实际到达的位置 c。
这样,中点法取了一个中间、更能代表平均运动方向的速度。
如果我们将中点法的公式推出来,那么,我们会发现中点法更准确的原因在于它引入了二阶导,而不是普通欧拉的一阶导。
自适应步长
- 使用欧拉方法计算出在 o 点的粒子 p 下一步长所在的位置 a;
- 使用欧拉方法计算出在 oa 中点的粒子下一步长所在的位置 b;
- 如果 a、b 距离甚远,那么说明步长过大,缩小步长重新计算;
- 如果 a、b 距离不大,那么说明步长已经缩得够小,取一个作为结果;
这种办法步长可变,所以能模拟得很好。
隐式/后向的欧拉方法
使用下一帧的速度而不是上一帧的速度。
在实际情况中速度和加速度之间的关系往往并不是那么好直接解出。往往可能需要求根公式等导致速度会比显示慢得多————当然,也变得稳定得多。
龙格-库塔方法
通过中点法我们已经知道阶数越高效果越好。而龙格-库塔方法是一系列解常微分方程的很好的方法(同样基于欧拉),其中四阶的龙格库塔方法(RK4)最常用,它形如
其中四个 k 是四个关于 x、t 的函数,懒得记了,用到再说。
对推导感兴趣的话请学习数值分析。
不基于物理的方法(Position-based / Verlet Intergration)
不基于物理的方法难以保证能量守恒,但是又快又简单。
参见作业 8.
衡量稳定性
通常我们不关心单步的误差(局部误差)和整体误差的值是多少,但是会关心它们和步长之间的关系。
以隐式欧拉为例,步长为 h,整体误差是 ,局部误差是 ,即如果步长减少一半,那么可以期望整体误差变为原来的一半,而局部误差可以期望变为原来的四分之一。
刚体模拟
刚体即不可变形的物体,刚体的模拟本质上就是一个大单体粒子的模拟。当然我们还需要考虑一些其他的属性,例如:
- 角度、角速度(一阶导,F/M)、角加速度(二阶导)
- 位置、速度、加速度
流体模拟
我们通过模拟小的刚体球(粒子)近似水体;并且认为水的密度是不变的,如果某处的密度改变了,那么就通过修正粒子的位置来进行修正。
物理模拟和渲染是有前后的两步,所以近似为小球不影响渲染。
每个粒子都可以对空间中的任意一点的密度产生影响。因此,为了达到“改变粒子的位置使得此处的密度降低”的目的,我们就需要知道密度对于所有粒子的位置的导数梯度。然后应用梯度下降法即可。(即改变对此处密度影响最大的粒子的位置)
以防万一:梯度是导数下降最快的方向。
这种模拟是不基于物理的,例如我们直接改了粒子的位置。当然为了避免水的运动停不下来,我们也可以加入能量衰减的公式。
大量物体的模拟方法(视角):质点法与网格法
- 质点法:又称拉格朗日法,以质点为主体,研究观察质点的位置变化情况;
- 网格法:又称欧拉法,以空间网格为主体,研究观察一个空间中的固定位置的密度等信息(类似盯着那种大颗粒 LED 滚动屏的单个珠子看)。
- 材质点法:混合网格质点的方法,例如用粒子记录材质信息,然后用网格计算粒子的变迁,最后写回粒子里。
尾声
见笔记1。
跳转
Home:GAMES101-1:课程总览与笔记导航
Prev:GAMES101-21:计算机动画
Next:完结撒花!