过氧化氢 发表于 2023-4-2 00:53:48

Houdini程序化藤蔓制作

实现简单的藤蔓效果

![图片2.png](data/attachment/forum/202304/02/004718qf156fxx15cck9v5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 2.png")![图片1.png](data/attachment/forum/202304/02/004717yccrc4hjc1zw4ir4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 1.png")

Tommy:我当时害怕极了              Tommy:卒

这次实现的效果是这样的。

达成这种效果的过程分为以下几步:

1.确定藤蔓生长点

2.创建藤蔓的路径

3.为藤蔓设置半径

确定藤蔓生长点

首先把Tommy转化成VDB模型,然后创建一个跟Tommy长宽差不太多的地板,在上面撒点。接着在wrangle里写下如下的语句。这样我们就把Tommy脚踩的那个区域给挖空了。(显然我们不希望Tommy踩着的地方有藤蔓长出来)

![图片3.png](data/attachment/forum/202304/02/004751x488zhbfmeezq5vh.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 3.png")

代码的意思是计算每个点与Tommy的距离,距离近就删掉

接着将Tommy转化为polygon,再给他添加白色属性,同时把地上的点添加黑色属性,这样我们就可以用attribute transform节点将地上挖空区域附近的点转化为白色,最后用这些白色点构成seed组,再把其它的点都删掉,我们就确定好了藤蔓的出生点。

![图片4.png](data/attachment/forum/202304/02/004811ymtfzy4xswyb88sy.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 4.png")

创建藤蔓的路径

这一步可以再分解成以下内容:

1. 创建藤曼路径的影响因素

这一步由solver里的wrangle实现

![图片5.png](data/attachment/forum/202304/02/004841yp62zj2j606brm20.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 5.png")

vector up = chv("up");

vector dir = set(0,0,0);

vector pos = v@P;

vector wander = set(0,0,0);

vector wall = set(0,0,0);

vector wallN = set(0,0,0);

float wallDist = 0;

vector round = set(0,0,0);

for(int i=0;i<ch("MaxNumberofStep");i++)

{

wander = fit01(vector(noise(pos*4)),{-1,-1,-1},{1,1,1});



wallN = volumegradient(1,0,pos);

wallDist = volumesample(1,0,pos);

wall = -wallN;



round = cross(wall,up);



dir = up*ch("upFactor")+wander*ch("wanderFactor")+wall*ch("wallFactor")+round*ch("roundfactor");

dir = normalize(dir)*fit01(rand(@id+i),ch("min_step"),ch("max_step"));



wallN = -volumegradient(1,0,pos+dir);

wallDist = volumesample(1,0,pos+dir);



if(wallDist<0) dir+= normalize(wallN)*wallDist*1.8;



pos += dir;



int pt = addpoint(geoself(),@ptnum);



setpointattrib(0,"P",pt,pos);
}

设置的影响因素共有:up、wander、wall、round这四种。

其中up是固定的向上的矢量,因为藤曼肯定是要有向上的生长趋势的;wander是形成的噪波矢量,体现了藤曼每一步的生长具有随机性;wall是朝向Tommy的矢量,体现藤蔓对物体的依附;round是沿着物体旋转的矢量,这样藤蔓才有将物体缠绕起来的效果。

![图片6.png](data/attachment/forum/202304/02/004950wfffvsjswavrswdx.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 6.png")

2. 设置循环,使藤蔓每次循环都根据影响因素生长一小段

这一步是通过上面wrangle的循环和add节点实现的。dir变量是在所有影响因素共同影响下生成的矢量,让pos+=dir,之后就可以基于pos在该位置添加一个点。在循环结束后,使用add把这些点依次连接成polygon即可。需要注意的是,如此生成的点可能会进入Tommy的身体里,所以我们需要在每次生成点后进行一次检测,若该点到模型的距离为负,则让该点延wall矢量反向移动一定距离。

3. 设置分支,让分支进行相同的如上操作

先用group by range选择一部分点归入branch组,然后设置循环,让每个branch点都进行一次wrangle,也就是在这些点上长出分支。

![图片7.png](data/attachment/forum/202304/02/005016b4vo25vhqh8jtvoo.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 7.png")

最后,由于整个solver对所有seed点都循环了一遍,也就是说,每一个seed点都长出了藤蔓,于是就有了这样的基础路径。

![图片8.png](data/attachment/forum/202304/02/005027wkih33vdkpd7h65j.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 8.png")

为藤蔓设置半径

在设置半径前,我们先对这些路径进行一些处理,先resample再smooth让线条变光滑,然后fuse把挨得太近的点焊接起来。

![图片9.png](data/attachment/forum/202304/02/005043pdcmsd0cwgzg1iwc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 9.png")

接下来就可以用wrangle来为每个点设置radius属性了

![图片10.png](data/attachment/forum/202304/02/005053hshsohouq0audx92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 10.png")

为每个点随机设置一个0.03~0.05的半径值

![图片11.png](data/attachment/forum/202304/02/005109uhkhg7uzu45kqy5r.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 11.png")

把枝末点选出来

![图片12.png](data/attachment/forum/202304/02/005128qxgzsfxmuxfzc3gc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 12.png")

让接近枝末的点均匀变细

![图片13.png](data/attachment/forum/202304/02/005153c72mbhwd7qklobk0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "图片 13.png")

平滑radius属性,最后polywire节点把半径设为radius就完成了

最后的最后,复制一些叶子过来,把所有模型都merge起来就可以得到一开头的强人锁男效果辣。
页: [1]
查看完整版本: Houdini程序化藤蔓制作