Houdini JoyOfVex 教程01

原英文系列教程地址:在这里
文档翻译教程:PB_zz

01

houdini 中的 vex 语言,是一种类似于c/c++的强类型语言,执行效率高,具体帮助文档位于houdini菜单栏help-Contents

在使用vex时,能实时看到你的模型属性受到影响改变是很重要的。有一个快捷的方法来查看这些属性变化,按住键盘上的alt+]键,来使视窗分为上下两个,然后按住alt+8键来使其中一个窗口变为spreadsheet窗口。之后,点击菜单栏上的Build,在下拉菜单中选择Save Current Desktop,这样就将当前视图设置存储为默认视图了。

pointWrangle(点的争吵?哈哈哈哈)节点可以运行一个vex代码段来修改点属性,包括位置
可以在pointWrangle的VEXpression中编写vex代码并按 ctrl + enter 运行
首先让我们来用vex实现最简单的事情:改变模型的颜色
我们需要知道,在houdini中,@是属性,@ptnum@numpt是变量,例如@ptnum点序号,@numpt总点数,F帧。
而现在有一个Cd, 它指的是对象的颜色属性,N指的是法线信息,P是位置,这几个都是属性,使用他们的时候前面要加@
于是我们可以这么写

@Cd=@N;    或者 @Cd=@P; 将法线信息或位置信息赋值给物体,我们就会让物体颜色魔幻起来

此时我们可以在pointWrangle前插入一个transform节点来变化(旋转平移缩放)模型来观察颜色(位置或法线信息)的变化

Attribute components(属性成员)

这是我们的第一个简单的代码
其实@Cd,@P,@N都是vector,因为数据类型相同所以他们可以互相赋值,就像c++中的char与char赋值,int给int赋值一样,实际上,你也可以只想sub-components(子属性),就比如用@P.x来调用位置中的x信息,就像你在c++中可以将子类赋值给父类,C#也可以这么做,不过C#要求显式转换,而vex的转换大概看不见嘞
对于子属性的赋值我们可以这么写

@[email protected];  也可以  @[email protected];
除此之外,我们已经知道了Cd是颜色属性,那么它自然包含rgb三个子属性,那么我们也可以给子属性赋值
@[email protected];  也可以使用数组形式  @Cd[0][email protected]

此时,vex会为你做一些隐藏工作,把@P.x或@N.y的float(浮点类型)数值(比如0.2)转换为一个vector,来使=等号左右两边的数据类型对应。(隐式强制数据类型转换)

Basic maths(基础数学运算)

Vex是基于C语言开发的,意味着同样可以进行一些简单直接的数学计算。
举个栗子,我们tab或右键新建一个grid(网格平面),然后连接到pointWrangle,vex代码改成@Cd = @P.x,如果你查看spreadsheet,你会发现,模型有半面的数据都是负值,另一半则为正值,中心线为0(如果有点刚好在中心线上的话)。你可以试试下列代码来改变这些值查看一下效果。

@Cd = @P.x;
@Cd = @P.x + 2;
@Cd = @P.x - 2;
@Cd = @P.x -2 * 0.3;
@Cd = (@P.x-2) * 0.3;
Assigning to components(子属性相互赋值)

我们还可以对每个子属性单独进行赋值:

@Cd.x = @P.x-3 * 1.2;
@Cd.y = @P.z+2;
@Cd.z = @P.y;
第一小节里也演示过了

如我们开头举的例子,@ptnum(point number) 是点的序号,模型上每一个点都有自己的序号,也就是id,并且是从0开始,我们在视图中点击scene view 右边栏的display point number可以在视图中看到每一个点的序号,并且在Geometry Spreadtree视图中,我们可以看到每个点的属性,当然,不仅仅能看到点的属性

@Cd=@ptnum;

从视图中可以看到,第一个点是黑色的,剩下的全为白色的。因为@Cd颜色的属性值是从{0,0,0}到{1,1,1},R,G,B每个分量的值都是从0-1(而不是0-255),如{0.2 , 0 ,0.5}。而第一个点的@ptnum值为0(int整数类型),自动转换数据之后为{0,0,0},剩下点的序号值都大于0,自动转换之后颜色值都等于或超出{1,1,1}(可自行查看spreadsheet),可以说是相当亮眼了(原文’superwhite’),所以只有第一个点黑色,剩下的全白。
而与@ptnum经常一起用的,还有我们之前说到的,@numpt(the total number of pionts),和ptnum很像是不是?它就是模型点总数。我们很容易能想到用ptnum / numpt的用法,不过需要注意这两个都是int型,他们在做除法运算的时候会舍弃小数,很可惜,如果是float那能做的事情就更多了。比如@Cd=@ptnum/@numpt可以得到渐变色…当然我们强大的houdini怎么会做不到这一点呢,其实如同C++一样,我们可以将这两个int型转化为float再运算,我们的操作空间会大很多,方法是强制转化(casting),就类似这样

@Cd = float(@ptnum)/@numpt;

转化的类型将被转化的数据括起来,是不是很像c++的强制转换?不过C++能把类型括起来变量不动,vex却不允许,值得说明的是在@ptnum前加float即可,@numpt前不必再加来进行转换,当然你要加也可以。因为浮点型除以整形得到的最终结果是浮点型。

Channels(通道/UI参数)

当使用wrangle节点进行vex编程时,你发现我们之前打的代码得到的都是一个个自动计算得到确定的值。这个交互上来讲不友好啊,要是你想用滑竿之类的进行调节测试呢?大丈夫!Houdini提供了ch函数来实现这个功能。你只要在代码中输入ch(‘*’),(*为你想要的参数名称),点击右边那个图标为滑块与加号的按钮后,在P参数UI界面上就会出现你想要的参数控制:

@Cd = float(@ptnum)/ch('scale');

滑块的默认值为0~1之间,但你可以自己调整输出超过1或小于0。
可以点开wrangle节点面板上的齿轮按钮,在下拉菜单点击Edit Parameter Interface来调整创建的UI,比如设置滑块min和max值为0和1以外的数。另外,你也可以在Edit Parameter Interface中先创建UI参数,然后用ch等函数调用。值得一提的是,这很像python中opencv的tracker滑块,当我一次次调整数值编译的时候,其实加个滑块方便太多了

三角函数

当我在使用blender的时候,就一直想用三角函数实现一些骚操作,毕竟sin,cos能够返回波形变化的数值,这在节点,特效,材质中都是能够产生很强的表现力的,vex也不例外
这里我们可以使用sin函数,返回-1~1之间的波形数值,变化周期为2pi。

@Cd=sin(@ptnum);

你应该还记得之前讲的@ptnum是int整形数据,他是0,1,2…这样进行增加变化的,不带有小数,所以这个sin变化看起来也不是那么连续的(看视窗中平面的渐变效果)。所以我们进行以下叽里呱啦的各种操作变化,你可以看到不同的效果,自己思考一下。

@Cd = sin(float(@ptnum)/100);
@Cd = sin(float(@ptnum)/ch('scale'));
float foo = float(@ptnum)/ch('scale');    //这里是定义一个局部变量foo,它的值由后面的式子得到
@Cd = sin(foo);

提醒一点,vex里的注释写法有两种,和C/C++语言一样,一种是单行注释//,一种是多行自由注释/**/,注释只是额外说明,并不参与代码运行。

Variables(变量)

我们之前说过了,在名称左边由@符号修饰的是attributes(属性),他的数据是实实在在存在于模型对象上的,你可以随时读取(read)它也可以向它输入(write)数据,因为它本来就是默认存在的。

如果你要创造或者计算一些数据,并且暂时存储在某个东东里,你就可以使用variables(变量)了,在使用wrangle节点写vex代码时,你自己创建的变量只存在于当前节点中,它只是一个临时工,只存在于wrangle这代码编辑器里,家里蹲死宅一个,外面其他节点没人认得它,毫无存在感,只有家里人能知道它。如果你要使用一个变量,首先你要定义它的数据类型(int, float, vector等等)和名称,然后一个=等号,右边的式子给他赋值。如:

float foo = @P.x/ch('scale');
@Cd = sin(foo);

译者注:关于属性和变量。

属性是物体本身带有并一直存在的东西,houdini本身有许多默认的常用属性(COMMON ATTRIBUTES,包括P,N,Cd等),你也可以自定义新属性。属性可在spreadsheet面板中查看。打个比方就是,一个苹果,它的颜色,气味,硬度等是本身就有的东西,这些是它的属性,只要这属性已经是设定好的,就一直客观存在并且可以在houdini各个节点被调用(当然也可以通过Attribute Delete节点等方式删除)。更多与属性相关知识可以去查帮助文档。

而变量只是你自己在wrangle节点等地方临时设置来方便写代码用的而已,纯粹为你当前编程服务。你写代码总得让人看懂吧,不能写一大堆数字和符号扔那,所以才用变量这么个东西,你可以简单认为就是个有名字的虚拟容器,把数据往里丢,等下写代码用名字写,让人读起来才有意义能看懂,实际上计算还是用的那些数据。到了wrangle节点之外,上面和下面的节点是不认识你写的这些变量的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章