Houdini模拟逼真流体效果的10条技巧

CGATLAS官方 | 2022-8-13 03:10
435 0 0
岛屿

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

0.webp.jpg

Kevin Pinga Demo截图

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

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

0-2.webp.jpg

Kevin Pinga 美国Houdini FX Artist

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,具有创建逼真效果的经验”。

Kevin Pinga FX Showreel 2020

好,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对象本身的粒子分离无关。

1.gif

使用 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节点,非常适合控制可能不太好控制的高速粒子。

2.gif

使用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信息可以避免用户错误,有助于创建更多程序性设置。

3.gif

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

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

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

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

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

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

4.gif

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

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

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

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

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

使用的代码段:

5-1.jpg5-2.gif

一个简单的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);

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

6.gif

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

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

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

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

7.gif

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

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

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

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

8.gif

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

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

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

模拟湍流的传统方式是模拟FLIP流体,然后再其之上运行湍流解算器。当然第二步并不总是非要有的,尤其对于飞溅和喷水等快速运动的流体来说。还有一个问题就是在对粒子进行网格化的时候,想让流体看上去真实一些也很不容易。

建议大家用FLIP 模拟本身,直接加湍流着色器进行渲染,既可以渲染粒子本身,也可以将其光栅格为VDB,进行体积渲染。有时Kevin Pinga会根据镜头的实际效果将两种方法结合到一起使用。使用Houdini海洋工具时自动创建的湍流着色器非常适合光栅化的粒子。

9.webp.jpg

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

10. 优化模拟和缓存

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

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

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

10.webp.jpg

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

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

标签

评论 (0)

Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji
Emoji