Skip to content

FluidInTube

648字约2分钟

2022-07-17

show

背景

最近项目有个水管动画的需求,在尝试了RayMarching和FakeFluid之后美术反馈都不好。偶然在看到虚幻商城里有个沸腾水的资产,使用了GeometryCache。官方文档显示在4.25之后加入了这一实验功能,且支持移动端,于是准备利用Houdini的流体解算节点完成需求。

实现

管道设置

image-20220402214409372

虽然是模拟,还是需要加两挡板的,不然水全没了。。。

水源设置

image-20220402215008778image-20220402215034440

使用Bool操作在管道中间生成初始水体,然后使用倒角立方体作为Surface发射源,同时用VOP给每个粒子加上随机速度以产生一些扰动。

模拟设置

image-20220402225039727image-20220402225027650

在自动生成的DOP网络中引入之前创建的立方体VolumeSource,然后设置一下模拟的参数。有个小技巧,如果模拟的粒子太多导致后续运行缓慢,可以将Dop缓存到磁盘上,然后开启Playback Simulation,这时候进度条会显示为紫色。

构建网格

image-20220402225646911

这里有一些子步骤。

循环动画

  • 导入上一步缓存的模拟结果之后可以使用Retime节点以选取需要的区段
  • 在GroupExpress中使用粒子位置作为种子产生随机数,新建Threshold输入用于比较大小,小于Threshold的粒子在Blast节点被剔除。
  • 在目标时间段内设置四个对称的Threshold的关键帧,分别是1->0, 0->1。
  • 使用TimeShift节点将时间轴偏移目标时长,然后和原有时间段合并。
  • 将时间轴总时长设置为目标时长。

长度截取

使用GroupExpress配合Blast节点即可掐头去尾截取目标长度的模拟结果。

平滑结果

image-20220402232834104image-20220402232853808

直接使用模拟出来的粒子重建网格容易得到抖动且凹凸不平的表面,这里可以使用VDB处理一下。如图操作小型心调整参数,最后用ConvertVDB输出polygon即可。

输出结果

用PolyReduce减到目标面数后,使用Rop_Alembic将结果输出为.abc格式,然后就可以导入UE了。

参考

贡献者: Astroite