【houdini】CG猎人第014期houdini完全基础入门学习-vex基础
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
断更了一段时间的houdini完全入门系列又开始了,不过也快到结尾了。今天带来的是vex快速入门教程,使用2个简单小案例把vex中最常用的属性和函数都介绍了。对于入门的学习还是非常不错。小编把重点内容也做了解释和标识。同时附上houdini16的制作文件,希望对大家学习有所帮助。


一什么是vex
在houdini中,之前是用于编写材质,但是在最近的版本中vex功能得到扩展,从控制点面和粒子等各种地方的拓展,几乎在任何地方都可以用vex。
二为什么学习vex和局部变量的关系
在houdini14之前,没有直接节点通道中输入vex的方法,只能使用局部变量$PT之类。但是后来版本直接在节点通道中支持输入vex,非常方便,并且运行效率更高。
三 简单案例一
给sphere添加法线
旧版方案 使用point节点在法线通道添加$NX,$NY,$NZ使用局部变量进行法线设置
新版方法,直接使用attributewrangle节点直接设置 代码 @N=@N;
vex的基本格式
@变量符号+变量名字,查找变量名字最便捷的方法直接添加vop节点进入内部,可以查看最常用的vex的变量的名字。
在wrangle中输入表达式需要以;号结尾

对于矢量元素的单个元素访问,使用点格式
比如 @N.x,@Cd.r(其实写成@Cd.x也是可以的)
把小球整体上移一个单位
point节点在position的y轴上@P.y+1
wrangle节点,使用set函数,或者单独某个通道进行叠加,下面两种写法都可以
@P+=set(0,1,0);
@P.y+=1;
@v=@N;把法线赋予给速度,vex中可以进行属性值传递
对于局部变量中的$BBX,$BBY和$BBZ的边界框的值
在wrangle中获取使用函数 relbbox()函数,返回的是是一个矢量,一般对与这类函数,至少有一个值,第一个值一般都是wrangle的输入端,0-3一个四个输入端口。
要访问参数,使用函数ch()进行访问,也可以使用wrangle的快捷方式快速创建一个自定义的参数(右边小+号)
案例二 制作随机挤出控制
point节点中设置
$PT/($NPT-1) 基于点序号进行0-1的渐变控制,用vex的写法就是 @ptnum/(@numput-1)
但是在wrangle中写法有点不一样。如果直接是@ptnum/(@numput-1)这种写法,那么返回的值是0,因为数据类型是整数计算,结果也是整数,所以所有小数都强制转化为0。那么要正确的写法,可以先把某个变量转化为浮点形式即可。
方法一 简洁转化
@Cd=0;
f@b=@ptnum;//这一步就是定义了浮点b用于继承@ptnum的值,实际上就是转化为浮点的过程。
@Cd.r=@b/(@numpt-1);
方法二 数学转化
@Cd.r=@ptnum*1.0/(@numpt-1) //这种通过整形*浮点的形式得出结果也是浮点,当然,也可以让@numpt*1.0
方法三,使用函数形式
@Cd.r=float(@ptnum)/(@numpt-1)//通过float()函数把整型转化为浮点形式;
制作随机挤出动画
wrangle节点,需要注意的是我们是对面挤出,所以要切换到面层级;

@Cd=noise(@P/2+@Time);//noise函数,叠加了时间@Time,会生产紊乱动画
f@b=chramp("m",@Cd.r);//获得渐变spline的快速写法,chramp()函数
f@zscale=@b*rand(@ptnum);//定义了zscale属性,并且对点进行随机采样
添加polyextrude节点,要使用上面变量@zscale的值控制polyextrude的中的
local局部变量。divide into 挤出模式为 individual element单独的元素。

至于是否是zscale这个名字无所谓,只要上下保持一致就行。
案例三 使用区域控制点变形
新建猪头作为初始化物体
新建rubber玩具作为目标物体
新建box做为控制范围
对猪头和玩具模型进行scatter撒点并且sort按y轴排列(scatter是为了保证变形点是一一对应,sort是保证顺序是从上往下序号排列,这样点是依据需要进行一一映射变形)
分别连接到input0,1,2中
@Cd=relbbox(2,@P);//获得第三个输入端中box的编辑框范围,转化为颜色
@Cd.g=clamp(@Cd.g,0,1); //使用颜色中的g也就是y周,但是由于编辑框取值可以超过0-1,所以需要限制
@P=lerp(@P,@opinput1_P,@Cd.g); //lerp函数基于@Cd.g做mix的切换,@opinput1_P是反问第二个接口属性P的快捷写法,一般可以使用point(1,"Cd",@ptnum)函数进行获取。

获得教程的方法: