【CG物理模拟系列】流体模拟--粒子法之Position Based Fluids
来源:互联网 发布:淘宝介入售后 退货拒收 编辑:程序博客网 时间:2024/04/28 23:59
Position Based Fluids
我们使用粒子法进行流体模拟时,一个很重要的因素就是如何保持流体的非压缩性。非压缩性是指,随着流体的流动,密度在空间和时间上不发生变化,比如像水这样的流体,另外,与音速相比流速足够小的空气也可以当成非压缩性流体来考虑 (接近音速的时候,空气会发生压缩,音速飞机产生的冲击波即音爆便是由空气压缩产生的)。为了保持非压缩性,学者们提出了各种各样的方法,如MPS,WCSPH,PCISPH,IISPH等, 这之中,能非常高速且稳定计算的方法便是我们这次要讲的基于位置流体法(Position Based Fluids, 以下简称PBF)[1]。
PBF是基于位置法(Position-based method)[2] 中的一种。Position-based法与以前的基于力学方法不同,是根据物体位置(空间坐标值)间的制约条件直接更新物体(传统的基于力学法则是根据支配方程,按照加速度->速度->位置的顺序逐步变更),因此不会产生在传统力学方法中由逐步积分所产生的误差积累。但是,由于这种方法中,顶点及粒子的位置关系所遵循的制约条件是属于几何学的范畴,严格意义上讲不属于物理模拟。
Position-based法介绍
这里先对基本的position-based法进行说明。首先,对于一个产生位移的点,其坐标为,是其制约条件。 正常状态下, 当粒子发生一个微小量的移动后,也满足这个条件,即 。 把这个式子泰勒展开,即
忽略掉2次以上的项,我们将得到一个关于的方程。
可以由制约条件的定义计算。现在,把当作粒子的中心坐标,在3次元空间粒子数为的条件下,需求得未知数的个数为。 如果每个粒子都分别计算一次的话(也就是), 上述方程个数为,未知数个数是,我们很难轻易求出解。因此,需要针对添加额外的制约条件。
假设点是按照某运动方程发生移动,而则是按照不同于运动方程的其他的制约条件来移动的。这样的话,就需要一个不妨碍原来的运动(平行移动和旋转)的移动方向,也就是要保留平行移动和旋转量的移动方向。 考虑到制约条件要对运动状态不产生影响,于是的方向便与原来的运动方向垂直。也就是,的方向与相同。 导入一个拉格朗日乘数,使得
带入上面的关于的方程,整理得,
然后把求得的带入的式子,可以得到满足条件的移动向量,进而可以更新点的位置。
Position-based法在粒子法中的应用
首先,我们要想出一个满足非压缩性条件的制约条件(Constraint)。假设流体初始密度是,流体不发生压缩就是指其密度一直保持不变,也就是要满足。把它转换成关于位置的制约,如下
・・・(1)
然后,按照粒子法之一的SPH法,求解某粒子的密度:
这里的是粒子的临近粒子的集合,是粒子质量,是有效半径。在临近粒子数为的时候,与粒子的密度相关的制约,是一个与临近粒子坐标相关的函数,的计算公式如下:
・・・(2)
可由把密度的公式代入式(1)求得。 如下,
这里要注意的是,由于是与和(和)相关的函数,满足的微分为0的条件只有和。于是上式可以改写成下面这样:
・・・(3)
的时候由于包含了所以直接计算便可。 时,由于只有的时候包含,所以只计算这一种情况即可 (这里的负号是由于)。另外,实际计算的时候一般都会把所有的粒子质量设为定值,简化运算。
由式(2)和式(3)可以计算出各粒子的拉格朗日乘数,下面我们来求各粒子的位置修正量。为使得对临近粒子的影响以及受临近粒子的影响保持对称(和SPH法的圧力项同理),我们用如下公式计算:
・・・(4)
原本这里的和的平均要乘以的, 但是与SOR法的加速缓和系数同理,不乘的话收敛会更加迅速。
张力的稳定化
SPH法中,当临近粒子数很少的时候,会发生由负压力所产生的粒子过度集中的现象(称作particle clustering或particle stacking)。这里参照Monaghan[3] 的解决方案,把下式添加到式(4)里,将的部分改成
这里的参数值,,。
边界粒子
前面所说的particle stacking现象在边界附近也会发生。粒子与固体边界间的碰撞处理,由于固体内部不存在粒子,因此粒子会在边界附近聚集。一个比较好的解决方法便是在固体边界内设置位置固定的粒子(边界粒子)。通常,为了符合边界粒子的有效半径会使用复数层的粒子配置,这里我们参照Akinci的方法[4],使用提前计算好的幻想体积,只设置一层粒子来计算。把粒子沿边界设置好之后,只对边界粒子按照[4]中的下式计算幻想体积。
此时,在计算PBF中的边界粒子质量时,替换成即可 。
参考文献
[1] M. Macklin and M. Muller, "Position based fluids" ACM Trans. Graph., 32, pp.104:1-104:12, 2013.
[2] M. Muller, B. Heidelberger, M. Hennix and J. Ratcliff, "Position based dynamics", J. Vis. Comun. Image Represent., 18, pp.109-118, 2007.
[3] J. Monaghan, "SPH without a Tensile Instability", Journal of Computational Physics, 159, pp.290-311, 2000.
[4] N. Akinci, M. Ihmsen, G. Akinci, B. Solenthaler and M. Teschner, "Versatile rigid-fluid coupling for incompressible SPH", ACM Trans. Graph., ACM, 31, pp.62:1-62:8, 2012.
- 【CG物理模拟系列】流体模拟--粒子法之Position Based Fluids
- 【CG物理模拟系列】流体模拟--粒子法之SPH法的加权函数计算
- 【CG物理模拟系列】流体模拟--粒子法之MPS法(理论)
- 【CG物理模拟系列】流体模拟--粒子法之SPH(理论)
- 【CG物理模拟系列】流体模拟--粒子法之SPH(实现)
- 【CG物理模拟系列】流体模拟--粒子法之SPH(代码讲解)
- 【CG物理模拟系列】弹性体模拟--Position-based法之Shape Matching
- 【CG物理模拟系列】弹性体模拟--Position-based法之Shape Matching(代码实现)
- 【CG物理模拟系列】粒子法--表面生成手法(上)
- 【CG物理模拟系列】粒子法--表面生成手法(下)
- 【CG物理模拟】风筝模拟
- 【CG物理模拟系列】开篇:介绍(上)
- 【CG物理模拟系列】开篇:介绍(下)
- 【CG物理模拟系列】弹性体模拟--Mass Spring及绳子模拟
- 粒子物理蒙特卡罗模拟库Geant4之能谱制作
- 粒子物理蒙特卡罗模拟库Geant4开发
- 流体模拟-项目方向
- 流体模拟技术
- LeetCode 525. Contiguous Array
- Codeforces Round #398 (Div. 2) C. Garland
- PinnedSectionRecyclerView
- LruCache的基本用法
- 【技术】c#入门:颜色和名称样式对照表
- 【CG物理模拟系列】流体模拟--粒子法之Position Based Fluids
- 《机器学习实战》——读书笔记1
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 使用APC加速PHP
- ++i 与 i++的区别
- Oracle非集群和集群中Java程序连接字符串
- webrtc封装sdk(二)call api的使用
- 文件与文件的一些相关类
- 安装qtceator后无法启动help插件 Qt编译错误:cannot find -lGL 解决办法