[鬼才狗仔]用Houdini怎样才能模拟出理想的流体,大佬给出10条技巧( 三 )


使用的代码:
//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);
在制作中 , 更为实际的用法是在模拟过程中使用较低分辨率的碰撞 , 然后再后期模拟调整中运行这个功能 , 使流体看起来像是在于高分辨率碰撞产生的交互 。
建议查阅Henry toadstorm Foster的博客文章 , 详细了解xyzdist() 和primuv() 。
https://www.toadstorm.com/blog/?p=465

[鬼才狗仔]用Houdini怎样才能模拟出理想的流体,大佬给出10条技巧
本文插图
使用xyzdist()和primuv()将粒子推向碰撞表面 7.使用ID属性消除有问题的粒子
当遇到模拟完成98% , 差不多快完事的时候 , 而剩余2%的粒子不起作用的情况时 , 有一个简单而又有效的解决技巧 。 如果存储了前面提到的ID属性 , 就可以用它来消除有问题的粒子 。 如果没有ID属性 , 随着point count在帧与帧之间的变化 , 就没法标记标记正确粒子以进行删除 。
【[鬼才狗仔]用Houdini怎样才能模拟出理想的流体,大佬给出10条技巧】有一个很好的方法 , 进入point selection模式 , 在键盘上按9 , 这时会显示出Group Selection 窗格 , 按ID选择 , 点击齿轮图标 , 选择Attributes id , 然后只需在视窗中选择要删除的粒子 , 点击[Delete]即可 。 Blast节点会自动生成 , 参考的是 point ID , 而不是point number 。

[鬼才狗仔]用Houdini怎样才能模拟出理想的流体,大佬给出10条技巧
本文插图

一种通过ID属性正确清除有问题粒子的简单方法 8.使用reseeding来增加稀疏区域
在制作中 , 大部分的模拟开发工作都是使用中分辨率容器完成的 。 有时候 , 得到的中分辨率FLIP模拟可能达到了你的所有要求 , 唯独在最终网格渲染的时候看上去粒子不太够 。 遇到这种情况的解决办法是 , 在FLIP解算器中降低Particle Separation设置(提高分辨率和粒子数) , 将模拟提交到渲染农场 , (回家享受一下周末)第二天早上发现模拟效果看起来完全不同了 。
不过在这种情况下 , 更建议大家启用reseeding参数 , 而不是改变 particle separation 。 在默认情况下使用reseeding参数 , 增加Surface Oversampling参数可以通过散布粒子来帮助增加稀疏区域中的粒子数量 。 这样 , 在保持了模拟的总体外观的同时 , 还得保证有足够粒子来避免网格流体看起来像瑞士奶酪一样 。

[鬼才狗仔]用Houdini怎样才能模拟出理想的流体,大佬给出10条技巧
本文插图

增大surface oversampling来填充稀疏区域的模拟 这里有一个视频 , 来看一下操作流程 。
FROM:Dave Stewart 9.直接使用原始 FLIP 模拟作为不同元素
在进行流体模拟时的目标之一是最大限度地利用原始FLIP模拟 , 包括直接将其用作湍流/急流效果 。
模拟湍流的传统方式是模拟FLIP流体 , 然后再其之上运行湍流解算器 。 当然第二步并不总是非要有的 , 尤其对于飞溅和喷水等快速运动的流体来说 。 还有一个问题就是在对粒子进行网格化的时候 , 想让流体看上去真实一些也很不容易 。
建议大家用FLIP 模拟本身 , 直接加湍流着色器进行渲染 , 既可以渲染粒子本身 , 也可以将其光栅格为VDB , 进行体积渲染 。 有时Kevin Pinga会根据镜头的实际效果将两种方法结合到一起使用 。 使用Houdini海洋工具时自动创建的湍流着色器非常适合光栅化的粒子 。


推荐阅读