扒一扒houdini中的局部变量与vex变量

发表日期:5/19/2018 5:09:45 PM    浏览次数:7191     

很多初学者会被houdini中各种变量的写法搞得晕头转向,特别是houdini15之后对vex的大量使用,很多看老教材的同学发现局部变量不起作用了,被弄得无所适从。

这里,小编就尽所能给大家解释一下,其实这里是两套系统完成同样的功能而已。

本文会部分会收录在即将出版的houdini书本中,敬请期待

1attribute create不起作用了?

这个是最常见的旧版本教程里的问题。添加attribute create节点,创建自定义属性var,使用$VAR就可以进行局部变量访问,但是在houdini15之后就不可以了。

这里最核心的问题在于旧版本的houdini默认是勾选 local variable把创建的属性转化为局部变量,而新版本默认是关闭的。

注意

默认开启后,不输入任何值,那么局部变量就是变量的大写形式 var→$VAR。当然,你也可以手动输入你需要的局部变量名字(一般不会这样操作)。

转化为局部变量后我们在spreads中查看

没有开启local variable的情况下:只有在对应层级多了var这个属性

开启了local variable的情况下:在detail层级还会多了一个把var转化为局部变量VAR的过程

所以,如果大家想按照旧版教程使用attribute create创建局部变量,那么记得勾选这个选项就行了。

2局部变量/全局变量的写法

一般是$符号+大写字母,但是也有不少特殊的写法

比如位置 $TX,$TY,$TZ,还有颜色是$CR,$CB,$CG,这些特殊的写法就需要死记硬背了

除了上面常用的局部变量和全局变量外(从帧开始,因为这些变量不需要任何的局部节点和属性都可以存在的,所以称为全局变量)

还有比较常用的对于copy节点中的局部变量

$CY 表示当前拷贝的顺序(第几份)

$NCY 表示拷贝的总数量

3vex变量的写法

@+变量名字(大部分不需要大写)

当然,vex中也有部分比较特殊的写法(比如@Frame需要开头大写,@P需要缩略大写)

对于特殊vex变量的记忆

直接创建vop(pointvop,attribute vop等都一样)进入内部,找到geometryvop global节点,里面就是常用vex变量写法

也可以通过添加houdini16中的point_old节点,都使用使用了vex变量(旧版本point中使用$TX,$TY,$TZ)

4为什么是vex取代局部变量

1更加直接和简洁,比如上面定义的var,不需要通过转化为$VAR,可以直接使用@var进行调用

2vex电脑运行效率更高(速度更快)

3vex更加统一,比如之前的位置 @P颜色是@Cd,如果要访问里面的分量通道,使用点格式,比如@P.x,@Cd.r(@Cd.x也是可以的)。并且vex除了在sop和shader中广泛使用,在dop中的粒子也是非常常用的,可以贯穿整个houdini,实现统一。

4vex除了调用变量,更多的是一些表达式和函数的调用,使用wrangle节点可以完成绝大部分节点的功能。创建变量非常方便

在houdini中,越来越多的节点除了局部变量外也支持vex变量(除了一些比较旧的节点)并且有很多新的节点只支持vex变量,所以这小编建议大家尽量使用vex变量(即使看到旧教材中做法,试着使用vex变量来实现)

5是不是局部变量/全局变量就没用了?

这倒不是,特别是全局变量还是非常有用的

比如$T,$FF,$HIP,$OS等代表时间,工程文件路径,节点名字,在控制紊乱变化,输出路径中等都非常有用。

某些节点的局部变量比如copy中的$CY和$NCY也是比较常用。

6如何创建属性

创建属性的方法有非常多,这里主要讲解最常用的attributecreate和wrangle节点

attributecreate 注意四个部分

1name 名字

2class 层级

3type 数据类型

4赋值

当然,这里还有是否需要转化为局部变量和size就是里面的元素多少需要注意

对于wrangle中创建属性同样需要上面的几个元素

run over 代表选择层级,f表示浮点类型,@rot变量名字是rot,赋值是1.0,还有分号结尾

常用的vex的数据类型有

i整形

f浮点

s字符

v矢量

marix 矩阵

......

7如何把变量转化为局部变量/全局变量

创建全局变量

除了默认已有的全局变量,我们可以通过Edit/ aliases and variable 别名和变量中进行设定

在这里添加了一个$MYNAME局部字符变量,用来存储我的名字carldrifter

大家还可以存储自己常用的工程文件路径或者数值等。

把已有的属性转化局部变量方法

方法一 attribute create的方法,勾选local vairable进行转化,注意输入同样的名字,激活local variable,并且关闭write value 创建值(否者会覆原来的值)

方法二 wrangle中转化局部变量的方法

使用函数addvariablename(输入端口,原来名字,后来名字)

方法三 在vop中转化成局部变量的方法 add attribute节点

旧版教程中使用add attribute节点进行输出输出自定义属性,现在使用的是bind export节点,而add attribute节点仅保留转化为局部变量的功能。

上一篇:深信数字有限公司与中科院先进技术研究院神经工程所签约《人体康复协作机器人原理演示三维动画》
下一篇:unity3d中脚本生命周期(MonoBehaviour lifecycle)