最近对流体模拟(Fluid Simulation)很感兴趣,参考Jos Stam的paper:Real-Time Fluid Dynamics for Games,扩展其2D solver,做了个简单的3D fluid solver,模拟简单的流体。Demo以及源代码在这里.
大话
实时流体模拟本是计算流体力学领域(CFD)的关心的事,工程人员为了通过计算机模拟获得某种流体在特定条件下的有关信息,如:流体的动量、热量和质量等。由于工程上的精确性,所需的计算一般是很复杂的。后来,实时流体模拟又成了计算机图形学(CG)的一个热点问题,不过人家是为了模拟流体的外在形象。所需的计算无需很精确,强调的是视觉效果。如:模拟烟、火、云彩、流水等,以满足电影特效或者游戏特效。
正文
我所关心的当然是CG中的流体模拟了,现实中能找的以及找不到的流体效果,都给我模拟出来,以假乱真,有趣!呵呵。在网上发现一些不同的算法,被不同的大牛发现。大概有这几种:
1.求解NSEs(拉格朗日法,欧拉法)
2.基于大规模数据采样(快速傅立叶变换(FFT))
3.参数建模(线性波组合)
4...
其中,还是求解NSEs方法得出的结果较逼真,毕竟是基于物理模型的,但缺点是计算量大,而且计算结果有时不稳定,对时间步长敏感。想要实时很难。这方面Jos Stam是个人物,他将半拉格朗日算法引入CG领域,求解NSEs,达到实时流体模拟。于是,找他的论文。好多,看到一篇Real-Time Fluid Dynamics for Games。好家伙,Real Time的,不就是想要的么。于是,看了下,其实其核心是采用Gauss-Seidel relaxation方法解线性方程组,收敛快而且稳定.详细的描述见:http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf.
由于原文是针对2D的情况,于是我自己试着写了个3D的,纯属好奇,未作什么优化,速度一般。渲染部分随便弄了个alpha混合,估计用体渲染法(volume rendering)效果好点。最后渲染出来在我的旧本本上(cpu 1.4GHz),grid size为16*16*16的情况下FPS为14左右,台式机(cpu 2.6GHz)为32左右,如果想要更好的效果,需增大grid size,当然FPS肯定会下降.
Demo
1.Grid size = 16*16*16, diff = 0, visc = 0 (散射系数=0,粘滞系数=0)
2.Grid size = 32*32*16, diff = 0.00001, visc = 0.000001