Games201-拉格朗日视角和欧拉视角
pep8代码格式化 可以使用yapf
导出gif文件
Lagrangian View
节点随着材质一起动,每个节点是一个sensor
一般是粒子
Eulerian View
每个节点都是固定不动的,是still sensor that never move
穿过我的材料速度是多少
欧拉里的格点的位置是不用记的,而欧拉的点位置要记录
Mass-Spring System
stiffness 硬度 对抗变形的能力,胡克定律的k
damping 阻尼 小了会不停的晃动 一般是给弹簧加damping
胡克定律 + 牛顿第二定律
常微分方程
计算机的积分,时间是离散的,需要取一个dt ,大一点算的快但是会有不稳定的问题
dt内速度和质量都是常数,前两个的区别是预测位移时使用的速度不一样,后者有一些守恒的性质
back Euler+牛顿方法 得到隐式欧拉
1、计算力和速度
2、处理碰撞
3、处理位移
显式积分和隐式积分
显式积分的未来只取决于过去,
易于实现,容易爆炸(对dt),对比较硬的材料不是很适合
爆炸:计算误差无法随时间衰减,而是随时间爆炸性增长
有数值稳定性的约束
后向欧拉 隐式时间积分,未来取决于过去和未来,鸡蛋问题,每一个timestep变昂贵,难实现,难优化,timestep可以更大
有好处也有坏处
f(x)一般是非线性的,如果有非线性方程就比较难解,转换成线性的方程
线性化用到了一阶泰勒展开
解线性系统
-
jacobi 迭代 最简单
-
gauss-seidel 迭代 更快
-
共轭梯度
最后一个错了 B = 1
求矩阵的逆是非常昂贵的操作,大的矩阵不推荐求逆
有非常多的粒子怎么办?
- 稀疏矩阵
- 共轭梯度
- 预条件
- 基于位置的运动学
拉格朗日解流体粒子方法 SPH
一堆粒子携带物理量,使用核函数近似一个连续的场
在x这一点,物理场的值用核函数去求周围的粒子的作用,接近这个粒子的贡献的多,远离这个粒子的贡献少
速度、density、pressure
一开始是用来模拟天体物理
优点:不需要mesh,自由表面(水和空气的有明确的表面,烟雾是分散于空气中的没有明确的表面),每一个粒子是一滴水,然后被其他水滴作用
WCSPH weekly compressible SPH 可压缩的流体模拟(入门)
Dv称为材料倒数,跟着粒子动的倒数,和小d不同
压强梯度除密度为内力,g为外力,v就是速度了
压强的表示,状态方程
B:bulk modulus \(\rho_0\)是一个理想密度,密度很大压强就很大,压强很高就会尝试推着周围的粒子离开自己
粒子的\(\rho\)是就算周围的粒子的质量加权来算的
A计算每一个粒子的所在位置的物理量的多少,任意的粒子物理属性,一个加权平均,应该把它看做一条公式
算梯度的多方法,sph做的不是很好
计算通用属性的公式:
SPH也可以比较方便的加表面张力加粘度
SPH计算:
1、对每个粒子计算它所在位置的密度
2、对每个粒子计算它的压强梯度,进而得到它的Dv/Dt
3、Symplectic Euler Step
有很多的变种
PCI - SPH 有隐式的SPH,但不完全是隐式的,有预测的做法,不断的校正
Position-based fluid PBF 实时的PBD + SPH 的模拟流体的方法
Divergence-free SPH 指的是速度场无分离,接近一种不可压缩流体的方法
显示时间积分的条件
CFL condition
从材料刚度有考虑时间步长限制
从粒子运动速度来考虑时间步长限制
各模拟都要遵循这个条件,我们要取这个Cmax
需要加速SPH,时间复杂度O(n^2)n可能达到百万
实际中我们会使用一些特殊的数据结构(voxel grid)来加速对相邻的粒子的search达到复杂度O(n)
对每一个粒子要精确的找到和他比较近的所有粒子 只要loop比较近的粒子,维护一个grid,每一个格子维护自己内部有哪些粒子,每次我们要寻找周围的粒子时先找自己格子和自己周围一定距离格子,然后遍历这些格子维护的粒子
还有很多其他的加速方法
SPH论文:
R. A. Gingold and J. J. Monaghan (1977). “Smoothed particle hydrodynamics: theory and application to non-spherical stars”. In: Monthly notices of the royal astronomical society 181.3, pp. 375–389.
J. J. Monaghan (1994). “Simulating free surface flows with SPH”. In: Journal of computational physics 110.2, pp. 399–406.
其他的粒子法:
DEM discrete element method 每一个粒子都是一个刚体小球,可以模拟沙子
MPS moveing particle semi-implicit
PP power particle
导出gif
https://taichi.readthedocs.io/en/latest/export_results.html#export-your-results
流固耦合
解线性系统联立求解就是强耦合
先解流体然后把流体作为刚体的边界条件解刚体,然后把解出来的刚体作为边界条件解流体
SPH有一个很好模拟各种介质的耦合,流体、弹性物体、刚体
从粒子生成表面的mesh
marching cube
队伍格子上面的点去算一下他的密度,然后尝试画出他的值为0的一个等势面,等势面就是用三角网格去近似的
有很多种情况,这里给了14种
marching cube 有 很多的预处理 smooth操作
openVDB 有smooth operator
先把粒子光栅化到一个背景网格上,然后背景网格上做一个根据距离场的圆滑或者尖锐,得到一个density field然后就可以使用marching cube
实时应用:屏幕空间渲染,一种近似,但镜头动的比较大就比较麻烦