Skip to main content

原文链接:www.cgchannel.com/2020/03/10-expert-tips-for-better-houdini-flip-fluid-simulations/
图片原始链接:cgchannelvideos.s3.amazonaws.com/tutorials/2003_KevinPinga_Houdini_FLIP_Fluids_Hacks.zip

houdini提供了一系列强健的工具来模拟流体。但是想要让流体模拟看上去真实,仍然是一个很有挑战性的工作,尤其是需要应对各种各样的流体时。

现在的TV剧集越来越依靠视觉效果,制作周期也越来越短,但是制作的效果还要电影级别的,制作的压力就会给到制作人员上,大多数只有几天甚至几小时的制作时间。

在过去的三年里,我参与了很多TV剧集的流体模拟工作,比如Walking Dead和Castle Rock,同时也参与了一些音乐MV的视效制作,比如Taylor Swift、Billie Eilish和Maroon 5。

经历过这些项目后,我收集了一些使用flip solver的技巧,这些技巧可以帮助你更加有效率的管理的你的流体模拟,尤其是在短周期情况下,仍然能保持一个高水准的效果。

这些技巧需要你已经熟悉flip solver。

1.使用POP Source作为发射源

工具架中创建的flip使用的是flip source节点作为发射源,它的本质是创建一个VDB,然后使用Volume Source节点读取数据,而且是在DOP中读取的。

这种方式在你使用一个大型,细节没那么多的发射源时还不错,但是会导致数据量繁冗且耗时。增加VDB的精度可以得到更精确的发射源,也会导致数据读取的更慢,甚至在进入到解算之前就已经很卡了。

所以,我更喜欢使用常规的polygon,而不是转成VDB。它可以使用POP Source读入到dop中,直接替换flip source连入flip solver中,这样就和平时使用粒子系统是一样的操作步骤了。

POP Source操作起来更直观,大多数人早就对粒子模拟很熟悉了。粒子量可以很容易被预测到,独立于FLIP object本身的Particle Separation。

2.模拟时使用POP节点

一些时候人们会忘记FLIP本质上是一套POPs,使用体积流动的方式传递运动。然而,它的基础就是粒子,这意味着所有的pop节点都可以在模拟flip时使用。这也是为什么我们可以使用pop source作为发射源。

在制作常规粒子效果时,POP Force节点是创建有趣的动态的一个基本做法,所以我们也可以在制作流体的时候使用这个节点。即便使用很小强度的noise,也会让流体看上去更有吸引力。低频率的noise可以让你在粒子量不多的情况下创建出一些细节。但是不要给的太强,这会让你的流体看上去不自然。

POP Speed Limit可以配合POP Drag节点来控制一些高速粒子,可以限制流体不会某一小部分迸溅的太猛烈。

3.使用Bounds qL设置FLIP边界框

Bounds qL节点是一个非常精致的节点,它打包了很多简单但是有用的功能。它来自一个叫做qLib的大型开源houdini工具包。在很多工作室中,qLib是默认安装的,它是根据真实的项目制作需求开发的,如果你还没有安装过,自己搜一下。

我使用Bounds qL主要用来设置flip和pyro的volume limits。和默认的Boud节点相比,它包含了一个可选项,就是根据带动画的输入端创建边界框。

我发现最有用的功能就是它的输出端:Values checkbox,它对边界框的中心点和大小不再做限制,这个数值可以复制到flip solver的volume limits面板下,或者任何需要边界框的地方。有一个统一的边界框信息可以避免一些错误,帮助工程更加的程序化。

4.开启flip solver中的一些有用属性

在大多数模拟中,flip solver中一些参数我都会打开。最主要的就是ID、age和vorticity。这些可以在调整缓存的时候有很大帮助。

大多数人都已经熟悉ID熟悉,也知道它有多么的强大。你的数据大小会因为一些额外的属性稍微变大,但是储存这些信息总是有必要的。

开启age属性同时也会导出life属性,可以通过这个属性控制整个模拟随着时间变化产生一些额外的变化,尤其是你的发射源持续发射粒子的时候。

vorticity属性可以作为第二次的发射源,比如在发射白水的时候,对于调整材质也很有帮助。

5.通过后期调整来挽救失败的模拟

现在有一种趋势,就是越来越依赖flip模拟本身的输出结果作为最终效果。这是一个理想情况下的工作流程,但是当时间受限制的时候,你不必总是重新进行耗时耗力的一次次模拟来修复问题。通过后期调整flip的粒子会更有效。

比如,你添加了ID属性后,就可以通过Retime节点来给模拟变速。有好几次我都忘了勾选ID属性,才发现给到了一个反馈要“慢80%”,这意味着我需要重新模拟一遍了。

我还遇到了一个普遍的情况是,在模拟中等精度的模拟时,流体的droplet在高密度区域是可以的,但是在稀疏的区域就太大了。这种情况下只需要简单的使用pcfind函数就可以让稀疏区域的粒子的spcale属性更低。

6.使用xyzdist来处理高精度的碰撞表面

这也是后期调整的方法,但是我发现xyzdist函数很有用,这也是我用的最普遍的一个函数,另一个是primuv。

在vex或者vop中,xyzdist找到离点最近的面,在面上插值一个点,然后计算点到面上点的距离。配合primuv,你可以提取面上的任何属性。注意这里的uv不是贴图意义上的uv,而是每个面都有一个单独的uv。

举个例子,你可以提取高精度的碰撞表面的位置,然后用来将粒子推到表面上。在一些情况下,你可以直接使用这个方式来调整流体包出的mesh本身,尤其是碰撞体是透明的时候,比如往一个玻璃杯里倒水。

确保使用xyzdist函数时,将distance参数设置的足够小,来加快计算。

这里有一个代码案例:

在工作中,最实用的方式是实用低精度碰撞体进行模拟,然后使用函数后期调整,让流体看上去是在和高精度碰撞体交互。

我非常推荐看一下这个博客,就会对xyzdist和primuv有更好的理解:https://www.toadstorm.com/blog/?p=465

7.使用ID属性删除有问题的粒子

当你的模拟有80%已经接近最终效果,但是还有2%粒子不太行的时候,你可以使用ID属性删除这些不太行的粒子。如果没有ID属性,你没有办法正确标记粒子,因为它的ptnum每一帧都会变。

最简单的方法就是进入到点选择模式,然后按快捷键9。这会打开一个组选择面板,点击齿轮图标,选择Attributes -> id。现在你可以直接选择点,然后按快捷键Delete,就会自动创建一个blast节点,根据id删除所选的粒子。

8.使用reseeding来加强稀疏区域

在生产中,大多数开发工作都使用中等精度进行模拟。有时候你得到了一个还不错的中等精度模拟,但是没有足够多的粒子创建一个用来最终渲染的mesh。你提高了粒子精度,然后提交给农场解算,回到家开始享受周末的假期。等回来上班的时候发现解算结果已经完全不同了!

这种情况,我推荐打开reseeding参数而不是提高粒子量。默认下reseeding已经是打开了的,你可以调整Surface Oversampling参数来提高粒子量。这个方式可以让解算维持一个大体不变的形态,有足够多的粒子来蒙mesh。

这里有个案例可以看下:https://vimeo.com/228926167

9.使用原始flip模拟作为其它的元素

渲染原始的flip解算作为白水

我做流体模拟的时候,其中一个目标就是最大化的利用原始的flip解算,比如直接作为白水渲染。

传统的方式创建白水是先解锁flip流体,然后再使用解算结果运行白水解算器。然而,二次模拟并非每一次都是必要的,尤其是快速移动的流体,比如飞溅的水花或者快速喷射的喷泉,想象一个坏了的消防栓。另外,这也是让mesh看上去正确的小技巧。

所以你可以直接给flip解算的粒子作为白水渲染,直接渲染为粒子或者转为VDB当作volume渲染。我自己会混合两种方式看看哪种效果更好。

10.优化解算和缓存

使用高精度flip解算的时候,处理它产生的大量数据也是一个挑战。普遍的优化是删除所有不需要的属性再进行缓存。

另一种方式就是剔除掉摄像机之外的粒子,方式有很多。

另外,如果你已经有了一个作为渲染的geometry,比较好的方式是先缓存出来,然后开启Delay Load Geometry。这样渲染时候就会从硬盘中读取数据,而不需要被mantra写入到IFD文件中。这能够节省读取缓存的时间,并且大幅度减少IFD生成时间和文件尺寸。

(完)

Leave a Reply