Practical Animation of Liquids 笔记

这篇文章讲的是液体的模拟,液体不同于烟雾的地方在多了一个液面的概念。这个液面可能是一些比较光滑、连续的流体液面,也可能是一些飞溅的小液滴或雾气。除此以外,整体的算法跟烟雾模拟没有太大的区别。这里重点作一下液面的笔记。

对于液面来说,我们希望通过传统的图形学方法去绘制它。这里用到了一种粒子和网格的混合方法:

一、粒子法

1、首先,在网格中随机放入一些粒子,通过线性插值的方法,根据速度场 u 计算粒子的速度。我们希望通过粒子生成一个三角面片构成的曲面,该曲面是平滑的,没有不可导点,即一些突变的、尖锐的地方。这些粒子生成在一个包含于NS网格的次级网格中。

2、接下来通过一个函数生成等高面,进而生成液面。说白了就是把这些粒子转换成一个有体积的球体。对处于xp处的粒子而言,该函数为:

其中r为半径。

3、对次级网格的每个网格顶点,用与之最近的粒子求该顶点的Φ值,接下来用marching cube算法,根据Φ的值生成各cell的等势面。Φ大于零表示在零势面外,反之则在零势面内。

4、此时各cell的等势面相连,其实就是液面,但这个液面还有一些尖锐的地方。接下来平滑它。

5、对网格边线上的Φ,迭代次数η:

其中:

经过几次迭代后实现平滑。用root finder算法求解零势面。

6、至此粒子法的过程基本完成。但存在一些问题,如零势面附近粒子可能太多,但实际不需要这么多粒子;又或者粒子即使处于液体内部对液面无贡献,也依然需要存在和计算。因此,我们在建立粒子时同时构建Φ场,直接通过速度场来控制Φ的流动。

二、网格法

1、接上。已经说过,最直观的方法是用粒子直接组成表面,但这样有种种问题,处理起来显得比较繁琐。所以这里引入一个level set方法。追踪Φ流动的公式是:

2、网格法的不足之处在于对细节的表现力比较差, 因为一些细微的地方可能在解算过程中迭代几遍就没了;粒子法则相反,但需要耗费更多的资源。结合粒子法。先推算Φ场和粒子,在零势面内的无贡献粒子可以删除,近表面的、附近稀疏的地方,适当填补粒子。

3、对于表面粒子,局部插值求曲率

对于k较小的地方,忽略粒子,用level set方法表示该平滑面。对于k较大的地方,也就是一些细节变化较多的地方,比如飞溅面,我们允许粒子修改Φ。

4、另外还有少量粒子飞溅出液体外部的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值