GAMES101 学习22——动画与模拟(欧拉方法、刚体模拟、流体模拟)
今天课程的内容主要讨论了如何对一些模拟进行求解,以及对应的方法:
- Single Particle Simulation
- Rigid body simulation
- Fluid simulation
一、Single Particle Simulation
这种方法是通过研究模拟单个粒子在速度场中的运动情况(速度场指的就是一种函数,在任意时刻t和位置x,都有对应的速度取值v(x,t):
而速度v(x,t) 通常可以用位移函数的一阶导数
进行表示,其常微分方程形式为:
ODE:常微分方程。
所以我们可以求解这个常微分方程以得到对应时刻的粒子位置:
1.1 Euler’s Method
这种方法是通过时间间隔Δt 来求解位置的,对于初始时间 t和时间间隔Δt,我们可以求解出对应变化的位移 和速度 :
由于 Euler’s Method 依赖于Δt 的取值,所以它的结果往往是存在误差和不稳定的:
误差是指当Δt 取值越小,得到的
越精确:
不稳定是指无论如何减小Δt,有一些情况始终无法通过模拟得到:
1.2 Instability and improvements
下面就有一些方法用来提高稳定性:
1.2.1 Midpoint Method
这种方法的步骤如下:
- 按 Euler’s Method 计算步长得到 a
- 计算 a 点与初始点的中点的速度(位移的导数)
- 按步骤 2 的速度更新初始点位置
这种方法为什么比 Euler’s Method 更稳定呢?因为它等于是用二次项进行模拟,更加准确:
1.2.2 Adaptive Step Size
这种方法的步骤如下:
- 按 Euler’s Method 计算步长得到位移
- 计算 点与初始点的中点的速度,并用这个速度更新得到
- 看 与 距离是否过远,如果较远的话就表示Δt 较大,需要对其进行缩小;
1.2.3 Implicit Euler Method
该方法是用未来的一些量(速度、加速度)来求解这个时刻的位移,比如说假设下一个Δt 的加速度
和当前时刻的位移
已知,那么就可以求解出下个Δt 的速度和加速度(两个方程两个未知数肯定可以求解):
如何定义方法是否稳定?这里引入了阶
来进行描述:
假设 Implicit Euler 的阶为1,它的局部误差和全局误差分别为
和O(h),这里 h 指的是步长即Δt。
O(h) 表示当 h 减小一倍时,对应的误差也会减少一倍。
1.2.4 Runge-Kutta Families
Runge-Kutta Families 是用来求解常微分方程(ODEs)的一类方法,它能更好的模拟非线性的运动:
1.2.5 Position-Based / Verlet Integration
这种方法指的是通过一些规则使得粒子在走下一步时,下一步的位置会得到一定的限制,防止粒子发散,与预期不符(它不是基于物理的方法):
二、 Rigid body simulation
刚体模拟(Rigid body simulation)不会发生形变,即刚体的内部都会以一种方式(趋势)进行运动,所以也可以把刚体模拟看成是粒子的扩充进行模拟:
当给定了如上微分方程后,我们仍然可以按照模拟粒子运动一样,采用诸如 Euler’s Method 等方法求解常微分方程,来求解刚体的运动。
三、Fluid simulation
流体模拟(Fluid simulation )可以采用 Position-Based Method 进行,它是一种非物理的方法。
Position-Based Method 主要基于两个假设:
- 假设水是由无数小的刚体球体组成
- 假设水无法被压缩,即任意处水的密度相等
基于上述两个假设,Position-Based Method 就可以通过下述步骤模拟流体:
只要知道水的任意处密度发生了改变,就需要改变刚体球体的位置来修正这一部分的密度;
水的任意处的密度都是关于刚体球体的位置的函数,所以我们也能知道任意处的密度梯度,如果想要改变任意处的密度,只需要通过梯度下降法即可。
3.1 Eulerian vs. Lagrangian
前面讲了一些关于模拟粒子运动的方法,接下课程继续介绍了关于模拟大规模物质运动的两种思路:
- (“质点法”) Lagrangian approach:依次模拟空间中每个粒子
- (“⽹格法”) Eulerian approach:将空间划分为不同格子,考虑不同格子的运动和密度变化
https://www.youtube.com/watch?v=iDIzLkic1pY
Material Point Method (MPM) 是一种混合了上述两种方案的方法:
- 点赞
- 收藏
- 关注作者
评论(0)