Houdini如何模拟理想流体?

小伙伴们都知道Houdini提供了一套非常强大的模拟流体工具,怎么才能让流体效果看上去逼真是一项非常富有挑战性的工作。现在不光是电影,就连电视剧集对视觉效果也有了很高的要求,制作周期越来越紧张,质量效果却要与电影媲美。

 

今天想给大家分享曾在多家知名视效公司任职Houdini FX Artist艺术家总结的10条Houdini FLIP流体模拟技巧,帮助大家在制作流体镜头时能够高效地完成流体模拟,同时还会保持较高的质量效果。


需要说明的是,这些技巧针对于熟悉FLIP解算器的小伙伴们,如果刚好你是萌新级别选手,还请尝试SideFX的教程。


Kevin Pinga目前在FuseFX担任Houdini FX Artist,毕业于萨凡纳艺术与设计学院视觉效果专业,辅修技术方向,后来担任学校视觉效果讲师。曾在Luma Pictures、Ingenuity Studios、Zoic Studios、Gradient Effects等知名团队任职。曾参与《蜘蛛侠:英雄远征》《行尸走肉》《城堡岩》等影视作品的特效制作,也为Taylor Swift、Billie Eilish和Maroon 5的音乐MV完成过特效制作。总结一句话,也是Kevin Pinga对自己的描述,“注重细节的Houdini FX Artist,具有创建逼真效果的经验”。


好,10条Houdini FLIP流体模拟技巧来咯!


1. 获取源流体要用 POP Source,而不是FLIP Source


FLIP获取源流体的默认方法是使用 FLIP Source节点,实质就是创建了一个VDB,由DOP中的Volume Source节点读取。这是使用shelf tools时自动获取的。


对于需要从较大模糊形状中获取源流体的情况来说,这是种不错的方法,但会占用大量资源,相当耗时。而且在进入模拟阶段之前,想要获得更精准sourcing而增加VDB分辨率的话,还会进一步降低速度。


相反,大佬采用方法的是直接使用基于多边形的常规SOP几何图形,无需转换为VDB。source可以与FLIP解算器本身的Sourcing input相连接的POP Source节点读取,与为常规粒子模拟导入source的方式相同。


POP Source节点控制起来非常直观,大多数艺术家应该在使用常规粒子的过程中非常熟悉了。这样可以通过预测的方式来控制和监视粒子计数,而与FLIP对象本身的粒子分离无关。

 

使用 POP Source的源流体提供熟悉的emission, activation和velocity属性


2. FLIP fluids使用POP节点


很多刚入行的伙伴很容易会忘记的,FLIP本质上就是一系列中间带有容积平流步骤的POP节点,基础本身只是粒子,意味着DOP中所有的POP节点都可以用于FLIP fluids。这就是为什么上一个技巧可以用POP Source节点获得source的原因。


POP Force节点是用于处理常规粒子时创建运动的基本所在,那么,为什么不将其与FLIP流体一起使用呢?用POP Force节点可在产生很小噪波的情况下产生更有魅力的流体效果,低频噪波也可以有助于创建细节,无需增加粒子数量或粒子分离。但需要注意的是,不要添加过多噪波,可能会导致模拟看上去不是很真实。


FLIP模拟中另外一个有用的POP节点是POP Speed Limit。结合 POP Drag节点,非常适合控制可能不太好控制的高速粒子。

使用POP Force节点添加少量噪点对FLIP细节模拟有很大帮助


3. 使用Bounds qL来设置FLIP limits


Bounds qL 节点是一个非常好的工具,包含很多简单实用的功能,它是非常大型的开源Houdini工具集 qLib的一部分。大多数工作室默认安装qLib,因为它的开发是以实际制作而驱动的。如果你还没有用到的话,可以按照GitHub上的说明轻松安装。


将Bounds qL主要用于设置FLIP和Pyro模拟的体积限制。这是从标准Bound节点开始的步骤,它包括一个选项,可以根据输入动画来创建边界。


最有用的功能是Output: Values checkbox,可解锁 bounding box的大小和中心值。然后可以把这些值复制到FLIP解算器Volume Limits选项卡的任何参数,或需要 bounding box的其他任何操作。具有集中的 bounding box信息可以避免用户错误,有助于创建更多程序性设置。

参考Bounds qL中的参数有助于设置模拟极限


4. 在FLIP求解器中启动有用的属性


在大多数FLIP模拟中打开FLIP解算器上的一些参数。有三个主要的参数是ID、age和vorticity,可用于模拟后的调整(正如下一条技巧会介绍到),在Behavior and Vorticity选项卡的FLIP Solver中就能找到。


相信很多Houdini用户都很熟悉ID属性和它的功能。缓存额外的属性可能会对数据大小有一些影响,但是能够获取到这些信息还是有用的。


通过Age Particles checkbox(也可导出life属性) 获取Age属性,可以随着时间控制模拟的外观,尤其是当粒子源在恒定发射的时候。


vorticity属性对于获取激流/湍流这种次级模拟来源来说非常方便,而且对处理着色也非常有用。

启用额外的FLIP属性:就像Houdini的其他操作一样,只需要勾选几个复选框


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


一般情况下更依赖于FLIP模拟作为最终结果输出,这是最理想的工作流程。可由于时间限制,在实际情况中我们不一定总是拥有重新模拟的机会来解决问题。在这种情况下,FLIP粒子模拟后进行一些调整可以“挽救”失败的状况。


例如,添加ID属性的原因之一是可以使用Retime节点对模拟进行重置时间。


在运行中分辨率模拟时还会遇到一个常见的问题,liquid droplets在模拟高密度区的大小很好,在稀疏密度区就会很大。在这种情况下,可以尝试使用pcfind,函数可以帮助标记稀疏区域并降低它们的pscale值。


使用的代码段:

一个简单的VEX讨论,根据点云密度调整粒子大小。全尺寸图片在这里。

 

6. 使用xyzdist处理高分辨率碰撞表面


另一个模拟后的调整方法就是,xyzdist()非常好用,(Kevin Pinga认为)是到目前为止和 primuv()齐名的。


在VEX或VOP文本中,xyzdist() 计算的是表面上到最近插值点的距离。它与primuv()结合起来,就可以从对象的参数UV中提取任何属性。


在上述情况下,提取高分辨率碰撞表面位置,并用于将粒子推向该表面。在某些情况下,也可以直接在网格表面位置进行这个操作,尤其是针对于那些可以看到碰撞表面的镜头(例如将液体倒入透明玻璃杯中)。要确保把距离限制在一个很小的值上,才能加快计算速度。


使用的代码:
//initializing variables
int p_prim;
vector p_puv;
//getting the distance and the parametric position of the closest point
float dist = xyzdist(1,@P,p_prim,p_puv);
vector P2= primuv(1,"P",p_prim,p_puv);
//mixing the P of the points, influenced by a mapped distance
@P = fit(dist,chf("min_dist"),chf("max_dist"),P2,@P);


在制作中,更为实际的用法是在模拟过程中使用较低分辨率的碰撞,然后再后期模拟调整中运行这个功能,使流体看起来像是在于高分辨率碰撞产生的交互。

使用xyzdist()和primuv()将粒子推向碰撞表面


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


当遇到模拟完成98%,差不多快完事的时候,而剩余2%的粒子不起作用的情况时,有一个简单而又有效的解决技巧。如果存储了前面提到的ID属性,就可以用它来消除有问题的粒子。如果没有ID属性,随着point count在帧与帧之间的变化,就没法标记标记正确粒子以进行删除。


有一个很好的方法,进入point selection模式,在键盘上按9,这时会显示出Group Selection 窗格,按ID选择,点击齿轮图标,选择Attributes > id,然后只需在视窗中选择要删除的粒子,点击[Delete]即可。Blast节点会自动生成,参考的是 point ID,而不是point number。

一种通过ID属性正确清除有问题粒子的简单方法


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


在制作中,大部分的模拟开发工作都是使用中分辨率容器完成的。有时候,得到的中分辨率FLIP模拟可能达到了你的所有要求,唯独在最终网格渲染的时候看上去粒子不太够。遇到这种情况的解决办法是,在FLIP解算器中降低Particle Separation设置(提高分辨率和粒子数),将模拟提交到渲染农场,(回家享受一下周末)第二天早上发现模拟效果看起来完全不同了。


不过在这种情况下,更建议大家启用reseeding参数,而不是改变 particle separation。在默认情况下使用reseeding参数,增加Surface Oversampling参数可以通过散布粒子来帮助增加稀疏区域中的粒子数量。这样,在保持了模拟的总体外观的同时,还得保证有足够粒子来避免网格流体看起来像瑞士奶酪一样。

增大surface oversampling来填充稀疏区域的模拟


9. 直接使用原始 FLIP 模拟作为不同元素


在进行流体模拟时的目标之一是最大限度地利用原始FLIP模拟,包括直接将其用作湍流/急流效果。


模拟湍流的传统方式是模拟FLIP流体,然后再其之上运行湍流解算器。当然第二步并不总是非要有的,尤其对于飞溅和喷水等快速运动的流体来说。还有一个问题就是在对粒子进行网格化的时候,想让流体看上去真实一些也很不容易。
建议大家用FLIP 模拟本身,直接加湍流着色器进行渲染,既可以渲染粒子本身,也可以将其光栅格为VDB,进行体积渲染。有时Kevin Pinga会根据镜头的实际效果将两种方法结合到一起使用。使用Houdini海洋工具时自动创建的湍流着色器非常适合光栅化的粒子。

将原始FLIP模拟直接渲为湍流


10. 优化模拟和缓存


高分辨率FLIP 模拟具有的挑战之一是需要处理生成大量的数据。一种常见的做法是在缓存模拟的任何部分之前删除不需要的属性。


另外一个可以减少内存占用的操作是清除相机可视范围以外的粒子。在Houdini中有很多执行这个操作的方法,大家可以选用自己喜欢的一种。


另外,如果已经准备好了要渲染的几何图形,最好将其缓存并启用Delay Load Geometry checkbox,Mantra不会将几何图形嵌入到IFD文件中,而是将其引用到硬盘的文件中。这将有助于减少加载时间,大大减少IFD生成时间和文件大小。如果你有渲染农场而且不想太麻烦的话,这个方法会很好用。

使用 File Cache节点中的Delay Load Geometry复选框可加快高分辨率模拟的工作


好啦,关于Kevin Pinga介绍的10条Houdini FLIP流体模拟技巧我们先介绍到这里,可能其中会有一些不准确的地方,还请大家多多谅解。

posted @ 2022-05-26 15:19  qwezx  阅读(317)  评论(0编辑  收藏  举报