高速移动的粒子发射源处理技巧

高速移动的粒子发射源处理技巧

相信很多朋友都遇到过这样的问题,在Houdini的POP系统中,如果粒子发射源移动过快,会出现明显的“断层”,非常难看:

看到没,一截截的粒子,substep调高反而更明显。虽然可以在pop解算器中设置粒子的采样方式达到比较平滑的效果,但我们今天要讲的是一个百分百解决此问题的方法,一起来看~

▌产生该现象的原因:

首先你需要搞清楚为什么会这样。其实原因很简单,当一个物体高速移动,每帧产生的位移就越大,而我们的Houdini工程默认是24FPS也就是每秒24帧,如果物体移动速度较快,等到下一帧的时候物体移动了比较远的距离,必然产生间隔。

▌解决方案:

解决方法其实也非常简单,既然每帧发射源之间有缝隙,那我们就给他把缝隙补上,这样不就可以了吗~来看看如何实现:

别懵,我们来一一分析:

使用blendshape节点,配合timeshift,将当前帧与上一帧进行融合,当我调节blendshape的融合参数时,帧与帧之间终于出现了粒子:

现在的思路就是,将发射源上的粒子随机排布到每帧之间的缝隙中,就可以解决这个问题。因此使用for each循环,将上述操作对每个粒子都执行一遍,然后引用foreach的metadata中的interation参数,将这个参数引用到blend滑块上:

如上图操作完成后,在表达式detail(“../foreach_begin1_metadata1”, “iteration”, 0)的外面套一个random函数rand()。这一步的意思是,引用每一个粒子的iteration值(每个粒子在循环中都有一个唯一的iteration)生成一个随机数,这个随机数的范围是0到1,正好符合blend滑块的取值范围。

这样,发射源上的每一个粒子,就会随机分布到帧与帧之间的缝隙上,从而填补了运动过快留下的缝隙:

(优化之前)
(优化之后)

有一点要注意的是,我们需要自定义一个点号属性,否则blend节点无法确定当前帧与上一帧粒子的一一对应关系,也就无法进行补帧。使用pointwrangle定义一个orinId属性即可:

然后把这个属性填入blendshape节点的相应位置以供读取:

还有一个更加简便的方法实现上述blendshape的效果,就是使用vex表达式:

第一行的意思:根据ptnum点号生成一个随机数储存到randomize这个变量中。

第二行的意思:读取第一个端口上的P属性也就是位置属性的值储存到posB这个变量中(第一个端口也就是pointwrangle连接的timeshift,也就是上一帧)。

第三行的意思:使用lerp函数将原始粒子与上一帧粒子进行随机融合,这个lerp函数跟blendshape的作用是完全一样的。

最终,得到一个完美的粒子模拟:

最后附上工程文件供大家下载学习:

附上原视频链接: