Single particle simulation
粒子在速度场中的运动,速度场定义了任何位置的速度。
Ordinary Differential Equation (ODE) 常微分方程
常微分方程指不存在对其他变量的导数,只有一个变量。
知道起始位置,想知道在t时刻后粒子的位置。
Euler method
用上一个时刻的量去估计下一个时刻的量。
问题:
- 有误差,不准
使用不同时段的步长得到的结果不同,使用越小的步长越准确。
- 不稳定,上图按理说按照螺旋路线走,然而很快会偏离。错误的正反馈(不断累积)。
误差问题不大,不稳定问题较严重。
解决不稳定性的方法
![](https://i-blog.csdnimg.cn/blog_migrate/720e751e8b153753c7a40d097a8d86e7.png)
中点法
在原始点使用欧拉方法计算下一位置为a,不使用a,而是使用原始点与a的中点b,得到中点b的速度,回到原始点,使用b点的速度计算,得到c,c为下一步的位置。下图中上面的曲线是理想轨迹,直线是使用中点法算出的轨迹,比直接使用欧拉方法误差小。
实质上是每一步使用两次欧拉方法,欧拉方法是线性模型,中点法是局部的二次模型。
Adaptive Step Size 自适应步长
若在某位置将步长减半计算得到的结果与原步长计算的结果相差比较大,则应将步长减半进行计算。
在不同位置应用不同的步长。
Implicit Euler Method 隐式欧拉方法
使用下一个时刻的速度和加速度(未来属性)。
可使用求根公式(牛顿法)来解,比欧拉方法慢,但稳定性较好。
如何定义方法是否稳定?
研究局部截断误差和总体累积误差的阶
隐式欧拉方法是一阶的,累积误差为O(h),即把步长h减小一半,则累积误差也减小一半。
阶数越高越好,减小h,误差可以成指数倍的减小。
Runge-Kutta Families 龙格库塔方法
这类方法非常擅长解ODE,最广泛的方法是RK4(4阶)。
Position-Based / Verlet Integration (非物理的方法)
只通过调整它的不同位置,使得它最后能够满足某种限制
Rigid body simulation 刚体模拟
刚体不会发生形变。相当于对粒子的简单扩充。
Fluid simulation
以流体模拟的场景为例分析一下position-based的方法。
A Simple Position-Based Method
每当任何位置的密度不正确时,通过改变小球的位置将密度变为正确的。
任何一点的密度都是任何小球位置的一个函数,因此可以求出密度,若要将密度朝某个密度变化,则可使用梯度下降法完成。
Eulerian vs. Lagrangian
拉格朗日方法(视角):逐个模拟每个粒子。
欧拉方法(视角):将空间分成不同网格,考虑每个网格随着时间如何变换。
Material Point Method (MPM)
将两者混合:
- 不同粒子有不同属性,存储在粒子上
- 融化过程在网格中完成
- 完成后将格子里的信息写回不同的粒子上