Houdini学习笔记019_开始入坑VEX
学习Houdini的第七七四十九天,我决定开始VEX的学习。
什么是VEX?
VEX是Houdini内置的一种高效的表达式语言,有点类似于C语言。但VEX语言是一种更小的、更具有针对性的语言,仅用于Houdini中。
为什么要学VEX?
学习Houdini并不是非要学VEX不可。但是学会VEX后,你可以将Houdini的功能发挥到极致。
个人认为,学习VEX至少可带来以下三个方面的帮助:
更深层次地理解Houdini节点操作的底层逻辑;
优化项目进程,减少走弯路,提高工作效率;
自定义某些软件中没有提供的节点功能。
比如有时候需要多个节点配合才能实现的功能,一个VEX节点就搞定了;又或者在没有思路的时候,VEX往往能提供额外的解决方案。

零基础学VEX难不难?
VEX相当于一门简化的编程语言,需要会基本的数学运算和逻辑思维。学会VEX很容易,但想要用得好还得训练自己解决问题的思路。比如现在让你把树上的苹果摘下来,有些人会找一根长竹竿去打,有些人会找梯子上树,还有些人干脆直接把树砍了。至于哪种方法简单高效,因个人掌握的知识量和项目需求而异。
到底难不难呢?套用一句废话:难者不会,会者不难。
这里我推荐b站上两个VEX基础的教程,你自己也可以搜到。一个是岛国小哥Junichiro Horikawa的“VEX for Alogorithmic Design”;另一个是Entagma的“VEX101系列教程”。当然,你愿意的话也可以跟我的Houdini学习笔记系列。
下面开始具体内容的学习——
VEX代码编写相关的节点名称中一般都有“wrangle”这个词,搜索时可以看到Attribute Wrangle等节点。

一般情况下,我们会对几何对象的点进行操作。Run Over默认选择的就是Points,实际上Point Wrangle、Primitive Wrangle、Vertex Wrangle等几个节点都和Attribute Wrangle节点一样,只是Run Over的方式不同。

VEXpression就是用来输入代码语言的,和代码相关的基础知识无非就变量、数据类型、函数、条件语句、循环语句等等。用这些基础语言来实现某种特殊的功能,就是我们的最终目的。举个简单的例子,比如让一个平面移动到高度为6的地方,只需要输入“@P.y = 6;”即可。

这里有两点需要注意:
VEX中调用属性用@符号,@P即坐标属性;
一段语句结束后要加分号“;”,否则会报错。
@P.y = 6的意思就是每个点的y坐标都变为6,注意这里是多线程的操作模式,也就是这个语句对每个点都执行了一次。最终结果就是平面整体往上移动到高度为6的地方。
同样的语句,如果初始对象换成球,你会发现球在y方向上被压扁成了一个平面。如果要让球只是移动而不变形,只需要在=前加个+号,变为“@P.y += 6;”。+=是缩写,就相当于“@P.y = @P.y + 6;”。

除了现有的属性外,VEX中也能创建属性(之前我们用的是Attribute Create节点)。例如输入“@index = 1;”,意思就是给点创建index属性,值为1。你可以在Geometry Spreadsheet窗口看到该属性。

如果改成“@index = @ptnum;”的话,就是index直接调用点的编号来给其赋值。

通常在创建属性时,会定义属性的数据类型,一般是在@前面加上特定的字母或数字来表示。下面是不同数据类型对应的字母或数字,当前面没有加任何内容内容时,默认为浮点型(float)数据。所以前面的“@index”就相当于“f@index”。

如果输入的是“i@index = @ptnum;”,定义index属性是整数类型,那么Geometry Spreadsheet窗口中index数值都会变成整数。

回到之前球体移动的例子,如果我要让移动的高度不是固定的数值,而是一个可变的量,该怎么做呢?
这时候就涉及到了变量的定义,定义变量的格式为“数据类型+变量名”。如“float moveHeight = 6;”,然后让沿y轴移动的高度值为moveHeight。

看上去好像是多此一举,但如果我们把变量定义语句改成“float moveHeight = chf("moveHeight");”,然后点击下图中箭头所指的图标,就会在底部创建一个参数控制滑块。拖动滑块就可以调节高度的变化值。

讲了半天,我们只是实现了Transform节点中一个简单的移动功能而已。没办法,越基础的东西往往是越简单而枯燥的。
最后,简单提一下VEX中属性和变量的区别。变量是当前Wrangle节点中定义的一个用于储存某类数据信息的名称,只在当前语句内部发挥作用。而属性会添加给节点对象本身,在后续的节点中都可以调用。
今天的笔记就写到这里,感谢大家的阅读,下回见~