作者:丁薰

【火星时代专稿,未经授权不得转载】模拟流体复杂的运动及其制作流体特效动画,一直以来被运用在计算机图形的各个领域,同时也是计算机图形学内比较广的一个研究课题。而流体特效一直以来都是3ds Max的一个伤口,无法与Maya Fluid Effects [1] [2] 抗衡。其主要原因是现阶段3ds Max还没有集成内置的流体动力学运算引擎,导致人们通常要去使用Realflow这样的独立流体插件来在3ds Max中实现流体效果,虽然效果令人满意,但要让Realflow配合3ds Max的动力学、脚本、粒子系统一起使用的话,操作起来显然就没有一个内置的流体力学插件来得方便,而3ds Max现有的内置流体力学插件的效果也是不尽如人意的,因此我们也很少能看到一部大片中有通过3ds Max来实现流体效果的案例。
2006年12月,SitniSati公司(原Afterworks)发布了一款新的3ds Max流体力学插件 —— Fume FX,该插件是基于真实物理中流体力学原理而设计的,主要是为3ds Max 用户提供火焰、浓烟、爆炸及其他流体效果的解决方案。与之前所有3ds Max的流体插件相比,Fume FX最大的特点就是它不仅能很好地模拟出复杂流体气体的运动行为,同时还能考虑到物理学中温度、重力、燃料、能量等因素对模拟效果的影响,这对计算机图形学发展作出的贡献是巨大的。从官方网站所提供的图片来看,Fume FX 的效果已经相当不错了,完全可以满足大片中流体效果的需求。
前些天我拿到了这个插件的试用版本,虽然现在还是1.0版,但效果已经相当棒了。据说1.1已经出了,同时效果也有更大的改进,在此十分期待这个 Fume FX 的1.1版本,如果笔者能拿到1.1的试用版的话,一定对比现在的1.0版本写一篇评测性的教材和大家一起分享,现在就由我来向大家介绍一下Fume FX 以及关于流体这个名词他们背后的故事。
Fluid Mechanics流体力学及其发展历史 :
流体是气体和液体的总称。在人们的生活和生产活动中随时随地都可遇到流体,所以流体力学是与人类日常生活和生产事业密切相关的。流体力学这一门物理学科主要研究在各种力的作用下,流体本身的状态,以及流体和固体壁面、流体和流体间、流体与其他运动形态之间的相互作用的力学分支。而在流体力学中研究得最多的流体是水和空气。
流体力学是在人类同自然界作斗争和在生产实践中逐步发展起来的。对流体力学学科的形成第一个做出贡献的是古希腊的阿基米德,他建立了包括物理浮力定律和浮体稳定性在内的液体平衡理论,奠定了流体静力学的基础。此后千余年间,流体力学没有重大发展。直到15世纪,意大利达•芬奇的著作才谈到水波、管流、水力机械、鸟的飞翔原理等问题;17世纪,帕斯卡阐明了静止流体中压力的概念。但流体力学尤其是流体动力学作为一门严密的科学,却是随着经典力学建立了速度、加速度、力、流场等概念,以及质量、动量、能量三个守恒定律的奠定之后才逐步形成的。
如今各大高校的物理专业都开设了流体力学这一课程,这也是物理专业中最难学习的课程之一,现在流体力学也被分支成更多更细的学科。如:物理-化学流体动力学、磁流体力学等。而通过Fume FX 和Realflow之类的插件我们也可以看出:计算机图形学也是流体力学发展的受益者之一了。
计算机流体力学的发展 [4]:
计算机流体力学是用电子计算机和离散化的数值方法对流体力学问题进行数值模拟和分析的一个新分支。早期的流体模拟,由于计算能力有限,主要采用参数建模的方法,比较有代表性的是1986年Darwyn R.Peachey博士发表的海面及波涛的模拟一文[3]。文中通过将波浪函数表示成一系列线性波型的组合,更进一步将各个波型简化为波形和相位的组合函数,从而合成浅水表面高度场,能处理波折射问题,并采用粒子系统来模拟当波浪破碎或者碰到障碍物时形成的浪花。
但由于这篇文章中表示的水的粒子或者网格只是在其初始位置附近运动,所以它们都无法表现真正的流动效果,也无法处理边界给水面带来的影响。又如基于统计的FFT经验模型[5] 可以很好地描述波幅较小的海平面,但是对于以上这些模型,人们觉得控制起来很困难,而且不能模拟一些复杂的、细节更为丰富的效果,于是很多研究者转向基于物理的方法去研究。
描述流体现象最为完整的为雷诺-均值奈维尔-斯托克斯[4](NSE:Navier-Stokes Equation),简称N-S方程,是湍流最古老的方法。此方程是法国科学家C.-L.-M.-H.纳维于1821年和英国物理学家G.G.斯托克斯于1845年分别建立的。该方程是根据牛顿第二定律推导出来的。
基于物理的方法主要分为两种[4]:第一种方法是从研究流体所占据的空间中各个固定点处的运动着手,分析被运动流体所充满的空间中每一个固定点上的流体的速度、压强、密度等参数随时间的变化,以及研究由某一空间点转到另一空间点时这些参数的变化,该方法被称为欧拉法,是一种基于网格的方法;第二种方法是从分析流体各个微团的运动着手,即研究流体中某一指定微团的速度、压强、密度等描述流体运动的参数随时间的变化,以及研究由一个流体微团转到其他流体微团时参数的变化,以此来研究整个流体的运动,被称为拉格朗日法,是一种基于粒子的方法。[4]
对于流体来说,采用欧拉法的计算效率较高(有限差分法),而计算流体的自由边界(例如浪花)则是拉格朗日法(粒子方法)占优,所以现在出现一些混合方法(如levelset)。
而计算机流体技术发展到今天,关键部分已经不再是简单的模仿液体的运动,真正具有挑战性,同时也是流体力学的关键在于:实现如烟雾、火焰、爆炸等特效。一方面真实的实现这样的流体效果需要考虑到很多如温度、湿度、重力、燃料、能量等环境因素。把这些条件全部考虑到流体的解算中计算会变的相当复杂、巨大。另一方面如果这些效果能很好的用CG技术来实现,就不需要工作人员进行实拍了,那样既不安全也不经济。Fume FX的意义在于它能在3ds Max上准确的基于物理流体力学原理对这些效果进行真实的模拟。

如图是计算机安装好Fume FX以后的信息,提示版本是1.0,它的正版用户可以随时享受免费的资源、教材、软件更新以及在线帮助。原先著名的烟火插件Afterburn和景观插件Dreamscape也同样出品自这家公司。
Fume FX对火焰的模拟

这个是我模仿广告做的一个Fume FX火焰的测试,场景很简单,就是一个铁环在空中燃烧,使用V-ray进行渲染,参数也并不是太高,速度却很一般。E6600 OC到3.6G,解算150帧动画需要近半个小时,难以置信。不过这样的速度是Fume FX本身的解算方法所决定的,一会在下文中会稍做分析。
技术性评点:最常见的燃烧现象就是火焰,燃烧实际上是一种低速流动燃烧的过程,现阶段最为精确的模拟方法来自采用全NS方程来求解,并考虑了燃烧过程。前面也提到了欧拉法研究流体,是在规则网格上采用有限差分求截NSE的方法 [4]。它将NSE离散到网格上,然后计算各个固定点网格上状态量的变化,最后再根据牛顿第二定律以及能量守恒,从而得到整个场。
实际制作过程中,我们通常要求火焰效果是变化多端的,2002年Arnauld Lamorlette和Nick Foster两位教授发表了Structural Modeling of Flames for a Production Environment一文,该文献更倾向于为动画师提供更为灵活的控制,采用了非严格基于物理的方法,通过基本的火焰轮廓来构造初始状态,在人工风场和浮力的作用下运动,加上过程Noise噪声和Kolmogorow湍流噪声来形成最终的火焰形状。这点也在Fume FX中得以很好的运用。
不过在火焰的制作过程中,有些细节问题Fume FX并没有得以很好的处理,譬如在火焰燃烧时候所产生的热浪效果,即便在摄影机很靠近火焰的情况下,依旧无法渲染出热浪的感觉。热浪实际上不属于流体的范畴了(属于光学)。实际制作过程中我们会在后期软件中实现这种特殊效果。当然了,如果一定要Fume FX渲染出热浪的效果,那我想至少要让Fume FX可以计算光能传递才行。
另外一些比较重要的问题就是Fume FX模拟的火焰的间接照明能力很弱,拿V-ray渲染器来说,Fume FX燃烧时火焰的能量不能参与到V-ray的GI运算中,而且火焰的明亮程度很多情况下是取决于场景中灯光的亮度,这也和现实世界中存在的火焰有些截然相反,火焰是用来照明物体的,而不是需要灯光去照明它的。

这是我做的Fume FX测试场景的线框截图,图中的淡黄色矩形立方体是Fume FX的模拟区,任何流体效果都在这个淡黄色矩形立方体中进行,Fume FX是一种基于欧拉法的流体特效模拟插件,在Fume FX中所说的模拟区也就欧拉法中所谓“整个场”的概念,当然了这也就让Fume FX注定要有一个弊端:不管是对哪种流体进行模拟,当流体超出模拟区的时候,模拟就会自动停止,换句话说就是在模拟区外是不会有任何效果的。这样一来,制作人员在前期要对模拟区的大小把握得很好,过小会产生Bug,过大又会负担额外运算,导致解算速度下降。

这两张图描绘的是Fume FX模拟区的网格,这个网格的间距可以在Fume FX中被直接调节,间距越小,模拟就越精确,(Fume FX通过)当然所需要的解算时间也就越长。
在计算流体力学中最基本的考虑是如何把连续流体在计算机上用离散的方式处理,使用网格是一种常见的解决方法,Fume FX工作的时候,先确定一个单位的模拟区间,(欧拉点的间距),然后把这个空间离散到整个场上,从而构建出网格。这样,空间区域离散化成小胞腔,以形成一个立体网格或者格点,然后应用合适的算法来解运动方程(对于不粘滞流体是欧拉方程,对于粘滞的是奈维尔-斯托克斯方程(Navier-Stokes equations)。
这里Fume FX同样也有一个弊端,那就是如果问题是高度动态的并且在尺度上跨越很大的范围,网格本身应该可以动态随时间调整。譬如海洋,在海面浪花击打,碰撞出水花,这里需要很精细的模拟,而海洋的内部比较平静,波动变化也小,网格的精度也自然不需要过高,如果在这个时候网格自身不能使用自适应网格细化,那么制作人员就要把整个场的网格精度提高,从而得到好的海面浪花效果,造成了解算量的添加和资源的浪费。
另外,先阶段Fume FX网格还是只有正方形可以选择的,其实这样的一个网格可以是不规则,或者是规则的。理论上来讲,在二维中应该由三角形组成,在三维中应该由四面体组成。好处是象在Maya中那样,有2D流和3D流之分,艺术家们可以根据自己的需要自行选择流体的类别(非真实感流体)。
对烟雾的模拟

气态流体和液态流体的相同点就是他们都是由大量的、不断地作热运动,而且无固定平衡位置的分子构成的,并且没有一定的形状和具有流动性,但都有一定的可压缩性,液体可压缩性很小,而气体的可压缩性较大。不同点在于:他们二者比较明显的差距在于容易受周围环境的影响贡献值程度, 气体的密度很容易随压力和温度而变化,而且密度随压力的变化关系与过程也有关系。液体相对气体而言,它属于不可压缩类流体(粘性流体),这样就导致了每一点的变化都有很大的影响范围。烟雾问题流体现象模拟中最为简单的一类 [6],烟雾问题不存在自由运动界面的问题,其他特别要处理的东西也比较少,属于一种低速无粘流动数值解。

这是一个网友模仿官方的演示所制作的烟雾效果,使用了Fume FX自己的虚拟发射器。该测试中Fume FX的表现相当出色,使用了较为精细的网格细分之后,Fume FX完整的模拟出了冷气烟雾的所有细节,烟雾的边缘过度非常自然,可控性也非常高。更让人钦佩的是在这里Fume FX对于V-ray的Shadow map阴影贴图、GI(发光图、光子图、灯光缓冲、准蒙特卡罗积分)系统支持的都相当好,不仅任何角度渲染都没有出现bug,而且使用面阴影的渲染速度也是非常快的,这对于广大V-ray用户来说无非是一条喜讯。
需要特别申明一下的是:对于这张简单的烟雾效果的模拟,Fume FX消耗了笔者相当多的内存空间,一共200帧的动画解算,在解算第120帧的时候内存使用是931MB左右,到了第121帧3ds Max由于内存溢出而重启。后来,笔者被迫提高单位网格的大小才最终完成了200帧动画的解算。
唯一比较遗憾的是Fume FX目前不支持Mental ray这个超级渲染器,不过历史上Afterworks公司还没有哪款产品是支持Mental ray渲器的。Fume FX也不会是一个例外。(Mental ray的隐藏Shader中有一个lume公司出的摄影机Shader,名字叫Glare(lume),一般在制作火焰、发光物体的时候使用效果会很好,很容易产生柔光的效果)
3ds Max的默认渲染器——Scanline方面,Fume FX对于一些环境特效的支持也有些不尽如人意的地方,比如体积光,理论上来说,在一个环境中如果漂浮物颗粒越大、越浓,体积光效果就越明显。而当我们使用Fume FX构件了一个充满稀薄烟雾的空间之后,再在灯光中添加体积光效果进行渲染,丝毫没有发现这其间的变化。
另外,关于灯光的阴影,使用扫描线渲染器只能支持虚假的Shadow map,对于Raytrace光线追终型阴影Fume FX是无法支持的(不过在Fume FX中,Shadow map已经可以表现很好的效果了)。此外,Fume FX也缺少类似其他流体软件中Self shadowing的设置(即云烟自身投射的阴影)不够真实。
Fume FX的核心解算引擎
当离散化完成后,Fume FX要进行的方程系统的基本求解由很多数值线性代数的为人熟知的许多算法完成,在这里,现阶段Fume FX的流体力学解算器的名字叫做: Conjugate Gradient——共轭梯度法解算器。共轭梯度法解算器是基于高等数学中的共轭梯度法而设计,共轭梯度法是一种迭代方法,即:不断用变量的旧值递推新值的过程。与迭代法相对应的是直接法(一次解法),即一次性解决问题。
共轭梯度法在求解问题时,沿梯度下降方向以及历史迭代方向的组合,进行迭代求解之法,常用于大型线性方程组(未知数可按亿计的非线性的偏微分方程组)的求解。而另外一方面,Fume FX在解算流体效果的工作过程中,也运用到了时间相关法。
时间相关法这是用非定常方程求解定常问题的方法,常用于求解N-S方程和欧拉方程等。虽然用的是非定常方程,但所解的并不是非定常问题。根据给定的初始条件以及随时间改变的约束条件,非定常问题是研究流动随时间的演变过程。这种非定常行为和给出的初值很有关系。然而时间相关法的初值,原则上是随意选取的,只是须满足定常问题所规定的边界条件。在求解过程中,流动随时间的变化并不代表真实的物理过程。当时间足够长后,未知函数值逐步与时间无关,便渐近趋于定常解。所以时间相关法实际上也是一种迭代法,时间变量只不过是用来记录迭代的次数而已。
Fume FX在工作的时候,记录每一个点上的密度、压强、温度等参数,然后根据这个点的影响范围使用相应的数学模型对整个场内影响区域中的其他点进行迭代求解,解算出下一时刻各个点上密度、压强、温度等参数的变化情况,再用得到的新的数据去迭代旧的数据,依次类推不断地往下进行,最后生成动画。
而对于象Fume FX这样的高精度流体模拟软件来说,使用共轭梯度法解算是很有必要的。尤其是Fume FX大多数情况下都在模拟气体的运动。另外对于不可压缩流体(如水或者低速的空气)求解时的椭圆型方程比较麻烦,因为每一点的变化都有很大的影响范围,所以迭代求解方法的全局性和稳定性很重要。拉格朗日法处理能力很局部性,因此对付不可压缩流体需要太多的迭代次数,但对于高超音速流体就很好。
不管是欧拉法还是拉格朗日法,共轭梯度法对此二者都有应用,当然在欧拉法中使用最多。
总结:Fume FX作为3ds Max新添的内置流体力学插件,能够基于欧拉流体算法的思想精确的模拟出各类流体运动的动画效果,在3ds Max的发展史上也算是一次重大的进步了吧。
优点:欧拉法设计、共轭梯度法解算器、碰状很精确,效果好,单方面的渲染速度很快。
缺点:模拟速度太慢,需要消耗大量内存,而且会生成上G的中间文件。不支持Mental ray,火焰间接照明能力还有待改进。
留给今后的研究课题:使用Fume FX实现液体流体效果的制作,以及近水爆炸、深水爆炸、多液体混合、浮油燃烧等特效的制作。
文献参考:
[1] Jos Stam Stable Fluids [A]In:Proceedings of SIGGRAPH [C],New York ACM 1999. 1~7
[2] Jos Stam. Flows on Surfaces of Arbitrary Topology[J.] ACM Transactions on Graphice on Graphics 2003,22(3):724~731
[3] Darwyn R.Peachey.Modeling Waves and Surf[J].ComputerGrahpics,1986,20(4):65~74
[4]Youquan Liu, Xuehui Liu, Hongbin,Enhua Wu.ZhuPhysically Based Fluid Simulation in Computer Animation(基于物理的流体模拟动画综述)[A] Laboratory of Computer Science, Institute of Software [C] 2~9
[5] Jos Stam . A Simple Fluid Solver based on the FFT [A] Alias|wavefront [C] 1~7
[6] Ronald Fedkiw, Jos Stam, Henrik Wann Jensen. Visual Simulation of Smoke[A]. In: Proceedings of SIGGRAPH[C]
[7]Jerry Tessendorf.Simulating Ocean Wave.SIGGRAPH '99 Course Notes & SIGGRAPH' 2000:Course Notes 25:Simulating Nature: From Theory to Practice, Pages: 3.1-3.18.
[8] Jos Stam and Charles. Loop Quad/Triangle Subdivision [A] Alias|wavefront,Seattle,WA,USA Microsoft Research,RedmondWA,USA [C] 1~6
[9]Donald Hearn , M.Pauline Baker Computer Graphics with OpenGL Third Edition [A] 南京大学计算机科学与技术系...蔡士杰... [T] (电子工业出版社 计算机图形学第3版 333~377 曲面、二次曲面、超二次曲面.....柔性对象...Bezier曲面 362)


当前位置 :