GAMES101-22:动画2

前言

GAMES101-22:单粒子的运动的模拟方法(欧拉与其各种改进)、刚体模拟、流体模拟、网格法与质点法处理大量物体的移动问题

单粒子模拟

考虑一个粒子在速度场中速度随着时间的变化的模拟。即算常微分方程 x˙=v(x,t)\dot{x} = v(x,t)

简单而基础的方法:(前向)欧拉方法

xt+Δt=xt+Δtx˙tx˙t+Δt=x˙t+Δtx¨tx^{t+\Delta t} = x^t + \Delta t \dot{x}^t \\ \dot{x}^{t+\Delta t} = \dot{x}^t + \Delta t \ddot{x}^t

其中右上角只是标记,不是指数;而一个点表示一次求导(即速度)。这种方式用上一帧的数据计算下一帧的数据。其问题在于:

  • 不准确:步长(即两帧之间的间隔 Δt\Delta t)越大,结果越不准;
  • 不稳定:对于圆周运动的情况,会变成螺旋形飞出去;

不准确在 CG 中往往可以理解容忍,但是不稳定、无论如何都得不到准确的结果是难以接受的。这种不稳定现象是欧拉方法试图用数值方法解微分方程的必然结果。

下面是一些解决了不稳定性的方法。

中点法

  • 使用欧拉方法计算出在 o 点的粒子 p 下一步长所在的位置 a;
  • 取 oa 中点 b 的速度场方向;
  • 对(依然在 o 点的 p)应用 b 点的速度计算欧拉方法,得到实际到达的位置 c。

这样,中点法取了一个中间、更能代表平均运动方向的速度。

如果我们将中点法的公式推出来,那么,我们会发现中点法更准确的原因在于它引入了二阶导,而不是普通欧拉的一阶导。

自适应步长

  • 使用欧拉方法计算出在 o 点的粒子 p 下一步长所在的位置 a;
  • 使用欧拉方法计算出在 oa 中点的粒子下一步长所在的位置 b;
  • 如果 a、b 距离甚远,那么说明步长过大,缩小步长重新计算;
  • 如果 a、b 距离不大,那么说明步长已经缩得够小,取一个作为结果;

这种办法步长可变,所以能模拟得很好。

隐式/后向的欧拉方法

使用下一帧的速度而不是上一帧的速度。

xt+Δt=xt+Δtx˙t+Δtx˙t+Δt=x˙t+Δtx¨t+Δtx^{t+\Delta t} = x^t + \Delta t \dot{x}^{t+\Delta t} \\ \dot{x}^{t+\Delta t} = \dot{x}^t + \Delta t \ddot{x}^{t+\Delta t}

在实际情况中速度和加速度之间的关系往往并不是那么好直接解出。往往可能需要求根公式等导致速度会比显示慢得多————当然,也变得稳定得多。

龙格-库塔方法

通过中点法我们已经知道阶数越高效果越好。而龙格-库塔方法是一系列解常微分方程的很好的方法(同样基于欧拉),其中四阶的龙格库塔方法(RK4)最常用,它形如

xn+1=xn+16h(k1+2k2+2k3+4k4)tn+1=tn+hx_{n+1} = x_n + \frac{1}{6}h(k_1 + 2k_2 + 2k_3 + 4k_4) \\ t_{n+1} = t_n + h

其中四个 k 是四个关于 x、t 的函数,懒得记了,用到再说。

对推导感兴趣的话请学习数值分析。

不基于物理的方法(Position-based / Verlet Intergration)

不基于物理的方法难以保证能量守恒,但是又快又简单。

参见作业 8.

衡量稳定性

通常我们不关心单步的误差(局部误差)和整体误差的值是多少,但是会关心它们和步长之间的关系。

以隐式欧拉为例,步长为 h,整体误差是 O(h)O(h),局部误差是 O(h2)O(h^2),即如果步长减少一半,那么可以期望整体误差变为原来的一半,而局部误差可以期望变为原来的四分之一。

刚体模拟

刚体即不可变形的物体,刚体的模拟本质上就是一个大单体粒子的模拟。当然我们还需要考虑一些其他的属性,例如:

  1. 角度、角速度(一阶导,F/M)、角加速度(二阶导)
  2. 位置、速度、加速度

流体模拟

我们通过模拟小的刚体球(粒子)近似水体;并且认为水的密度是不变的,如果某处的密度改变了,那么就通过修正粒子的位置来进行修正。

物理模拟和渲染是有前后的两步,所以近似为小球不影响渲染。

每个粒子都可以对空间中的任意一点的密度产生影响。因此,为了达到“改变粒子的位置使得此处的密度降低”的目的,我们就需要知道密度对于所有粒子的位置的导数梯度。然后应用梯度下降法即可。(即改变对此处密度影响最大的粒子的位置)

以防万一:梯度是导数下降最快的方向。

这种模拟是不基于物理的,例如我们直接改了粒子的位置。当然为了避免水的运动停不下来,我们也可以加入能量衰减的公式。

大量物体的模拟方法(视角):质点法与网格法

  • 质点法:又称拉格朗日法,以质点为主体,研究观察质点的位置变化情况;
  • 网格法:又称欧拉法,以空间网格为主体,研究观察一个空间中的固定位置的密度等信息(类似盯着那种大颗粒 LED 滚动屏的单个珠子看)。
  • 材质点法:混合网格质点的方法,例如用粒子记录材质信息,然后用网格计算粒子的变迁,最后写回粒子里。

尾声

见笔记1。

跳转

Home:GAMES101-1:课程总览与笔记导航

Prev:GAMES101-21:计算机动画

Next:完结撒花!