流体模拟学习——基于物理的流体动画

基于物理的流体动画

最近开始学习流体,这些天看了很多论文,一直来不及整理。正好今天是程序员节,忙里偷闲发布一下看论文时记的一点笔记。

基于物理方法的流体模拟,最经典的当然是Course notes的Fluid Simulation,但英文啃起来太难受了,搭配上师兄写的基于物理的流体动画综述和研究中文书就好多了,虽然公式推导很不详细(还是得看英文书),起码把流体模拟是什么东西了解个大概。

今天就先放一下中文书的笔记(注:小白笔记,如有错请勿计较)。

论文自取,github地址:FluidSimulation

1 流体动画:精度低但计算速度快,独立研究领域
流体渲染和绘制方法:
有清晰表面的流体(一般液体):图形流水线(液体与空气交界)、光线跟踪
无清晰表面的流体(烟雾):密度场、光线步进法

2 Navier-Stokes方程组
质量守恒、能量守恒、牛二定律

Lagrange方法:连续->离散粒子(粒子法)
在这里插入图片描述
流体不可压缩性
光滑粒子流体力学(SPH)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计算压强项->保证流体不可压缩

  • 传统方法:理想气态方程
  • 投影算法
  • Tait方程

lagrange方法对计算资源要求较低->广泛用于实时交互
lagrange方法很难进行液体表面跟踪和重构

Eular方法:固定观察点,考虑流体物理量在不同时刻的变化(网格法)
在这里插入图片描述
方法1标量记录在网格中心,矢量记录在网格表面
方法2所有数据记录在网格节点上
早期不直接处理方程组,而是假设和简化->波动方程、浅水方程->缺点太过简单
Eular法标准框架:
在这里插入图片描述
均一MAC网格

Lattice Boltzmann方法(LBM)
易于实现,着眼于微观模型和力学方程
在这里插入图片描述
分为2步:流动步骤->碰撞步骤
流动步骤:按速度和方向传递至相邻的网格
在这里插入图片描述

碰撞步骤:作用碰撞算子(BGK)
在这里插入图片描述

三种方法比较:
Lagrange:
优点:容易理解和实现,对计算资源要求较低,适合游戏以及其它需要实时交互的领域。
缺点:光滑核函数难以选取,无法严格保证流体的不可压缩性,很难通过大量粒子重构光滑的液体表面
Eular:
容易重构光滑液体表面和较大时间步长,但计算时间长,扩展性差(可以自适应和混合减少计算)
MAC网格不能很好贴合不规则的物理边界
四面体网格可以贴合,但计算量更大
Lattice Boltzmann:
优点:简单易懂并容易并行,描述微观
缺点:可扩展性差,时间步长有限制(为保证稳定性必须采用很小的时间步长)
在这里插入图片描述

3 流体现象分类
烟和云:粘性可忽略,没有清晰的自由表面,相对容易模拟
湿度,GPU加速,Lattice,旋度保持

火焰和爆炸:
火焰:焰心、外焰、黑烟
模拟多相流,基于过程的模拟方法
爆炸:径向超音速冲击波
先发光,冲击波扫过地面造成扩张的灰尘,气体和烟雾形成上升的火球

粘性、弹性和塑性流体:
不同区域不同粘滞系数:粒子系统模拟融化,点采样网格
兼具流动特征和弹性特征:
粒子系统模拟,网格系统模拟,弹性张量,弹性项的旋转

沙:
早期采用粒子系统;带摩擦的塑性模型

小尺度流体:表面张力(水滴)
虚拟表面方法

气泡和泡沫:
多相流模拟;网格与流体结合,SPH;简化浅水方程;模块化程序设计解耦模拟沸腾;SPH模拟气泡运动细节,Eular捕捉气泡周围水体运动;LBM
湿泡沫,干泡沫

固-液耦合
固体速度->边界条件,液体压强的积分->计算受力;弹簧-质点模型表示固体,无质量的粒子系统表示流体;刚性流体;八叉树,浸入边界;四面体网格离散流体;势能最小化原理

4 研究领域与方向
4.1 表面追踪和表示
经典Metaball方法->斑驳的表面;三维点云

前沿跟踪方法;点集方法;VOF

将液体表面隐式表示为一个带符号的距离场
在这里插入图片描述

水平集方法:会出现液体体积损失,细节被过度平滑->通过结合粒子与水平集来解决
零等面两边植入粒子,修正水平集的值->粒子水平集(PLS)
只在零等面植入粒子->标记水平集(MLS)
半Lagrange等高线方法(SLC):半Lagrange方法更新带符号的距离场,Marching Cube算法提取三角片网格

4.2 流体控制
最先的研究:压强和速度控制流体
参数曲线控制火焰;粒子控制爆炸模拟;引入粘度、速度场的散度和水平集控制粒子;优化控制参数;共轭方法解决非线性最优化问题;Eular引入控制力项和反扩散项;径向基函数;势能扬;匹配水平集表面和目标形状

尺度相关的控制力
保持小尺度流体细节:多尺度分解,控制项作用于粗尺度分量

4.3 混合方法
Eular:
四面体网格(三角面片可以精确地贴合任意边界)+规则MAC网格
需要特殊的过渡单元格
高度场+MAC网格解决大量水体时Eular扩展性差的问题
二维浅水模型+三维LBM方法模拟开放水域的现象
浅水方程模拟的液体表面+SPH模拟的泡沫模型
网格中植入Lagrange涡旋粒子
Eular+粒子水平集模拟流体,SPH模拟喷溅之类小尺度细节,同时Eular与SPH相互耦合
粒子系统+Eular水平集

4.4 模型降级****
将高维问题投影到低维子空间
精确地非实时方案生成高精度流体模拟->模拟结果作为低维基函数->Galerkin方法投影Navier方程到低维空间
大大缩短计算时间
所需时间与基的数量成正比
基的选取和基的数量选取都很困难(选的好可以实时模拟)

新研究提出一个统一的模型降级框架,Navier方程投影到一个由Legendre多项式张成的子空间
计算速度提高三个数量级(只适用于模拟流体的低频现象)

4.5 GPU
DirectX10
CUDA
着色语言
几何着色器,marching cube

5 研究趋势和未来研究方向
目前还没有允许实时交互,又完全基于物理的真实流体模拟效果

5.1 细节捕捉
在这里插入图片描述

增加采样评率->增加粒子数量或网格精度->内存消耗的线性增加+计算时间的超线性增长
粗精度物理模拟的基础上叠加高频的基于过程的流场,Kolmogorov理论

5.2 数值粘性
计算精度<->模拟速度
算法稳定性<->数值粘性
数值粘性==数值耗散:数值算法的误差会慢慢消耗系统中的能量,导致模拟的流体运动比实际流体缓慢,显得更为粘稠,大量运动细节逐渐流失

半Lagrange法计算方程任意大时间步长都无条件稳定,但只是一阶数值精度,采用大时间步长或低精度网格就会有很大粘性
Limited Catmull-Rom离散格式来高阶插值
误差补偿和矫正(BFECC)->先估计出计算误差,然后减去
QUICK,WENO,CIP->降低计算对流项的数值误差

速度、压强计算的先后顺序也会导致巨大误差
多步测量算子
算子分裂

5.3 网格生成方法
流体动画领域,目前只有2种网格类型用于离散求解流体方程:
MAC网格(边界)和四面体网格(计算)
空间弯曲的计算网格,椭圆网格,区域网格

6 结论
啊,进入下一阶段

(以上为综述,以下为研究)

7 多层网格流体动画框架
基于层次化网格结构->求解Navier方程组
与Eular不同之处:

  • 多层网格根据视觉重要性和计算复杂性将流体区域划分成多个互相嵌套的子区域,并在每个子区域分配一种合适的网格
    在子区域分别求解,最后利用边界条件对局部解进行同步,使收敛于全局解

7.1 求解方程组的欧拉方法
算子分裂:
在这里插入图片描述

对流项:
在这里插入图片描述

压强/不可压缩条件:在这里插入图片描述
在这里插入图片描述

半Lagrange过程:
在这里插入图片描述

7.2 立方体网格离散方法
MAC网格:交错式网格(不同变量存储于不同位置的网格)
在这里插入图片描述
在这里插入图片描述

立方体网格的问题:
边界走样
多尺度细节

7.3 四面体网格的离散方法
四面体网格:交错式网格(用于贴合不规则的固体)
存储形式:
在这里插入图片描述
速度场存储于四个面的外接圆圆心
压强存于外接球球心

插值:
三角形划分(Voronoi cell)
把四面体外接球球心连接起来
顶点加权平均值:
在这里插入图片描述
简化为:
在这里插入图片描述
顶点速度值(球心): 在这里插入图片描述

四面体网格的问题:
计算开销
方向偏差

7.4 多层网络框架
自适应的网格细化(AMR):多层相互嵌套
分布低精度网格->寻找视觉重要和计算困难的区域->高精度网格叠加(不限制层数)
视觉重要性(加权):

  • 到水面的距离
  • 到边界的距离
  • 旋度的大小
  • 烟雾的浓度

六面体-四面体双层网格

附录

  • 梯度
  • 散度
  • 旋度
  • Laplacian算子

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/xxxvvvop/article/details/83350214

展开阅读全文

没有更多推荐了,返回首页