欢迎光临散文网 会员登陆 & 注册

Houdini学习笔记041_曲面Reaction Diffusion

2022-10-14 16:33 作者:独孤嘌呤  | 我要投稿

这一篇是上一篇(040)的延伸,用到的还是Gray-Scott扩散方程:

唯一的难点在于Laplacian算符的计算,上一篇中我们用的是给相邻网格点的属性分别乘上一个系数然后加和的方法,如下所示——

显然,该方法的局限性是只适用于平面正交网格,如果是曲面或者是非正交的网格,则需要另想办法。针对于曲面的情形,有个专门的算子叫Laplace-Beltrami(拉普拉斯-贝尔特拉米)算子,但是计算过程实在让人头晕,我就不写出来了。

实际上,我们需要做的就是给每个点周围的点分配不同的权重,然后再计算u或v值的变化。而在Houdini中,有个函数就能做这件事情——pcfilter

对于曲面上的每个点,用pcopen函数可以得到一个点云文件,按照由近到远的顺序分配不同的权重,加权平均后就是所谓的Laplacian算子的值。

接下来的事情就简单了,我们用一个三角网格面的球体作为初始曲面,用point wrangle节点给曲面上的点添加属性ca和cb,@ca = 1.0,@cb = 0.0。

 然后设置一些点的@cb值为1.0,打破平衡。

可以用Group Paint节点手动刷选曲面上的局部区域,然后将组内的点的@cb属性值设为1.0。

接下来是solver的过程,我们还是先自定义一些参数,包括:扩散系数dAdB、A的feed速率f、B的kill速率k、离散时间dt。然后还有pcopen函数需要的参数——半径r和最大点数量maxpt

默认的参数值可设置如下:

Solver节点中直接用point wrangle节点来实现反应扩散(Reaction Diffusion)的过程。在VEX中先调用自定义的参数——

然后自定义laplacian函数,相对于上一篇的计算,这里的写法相对简单,如下所示:

新的@ca和@cb属性值计算如下:

最后,用color节点按照属性@ca进行着色。

根据@ca属性值的差异,也可以沿法线方向偏移不同的距离,得到凹凸的效果。

以下是不同的f和k值得到的结果(dA = 1.0;dB = 0.5)——

今天的分享就到这儿,感谢阅读,下回见~

Houdini学习笔记041_曲面Reaction Diffusion的评论 (共 条)

分享到微博请遵守国家法律