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]