VEX Expression 基础
作者:will 网址:http://ymuhua.com/2016/01/25/vex-101/
Houdini中的Vex语言是什么?
VEX在houdini中是一种执行效率很高的语言。简而言之它执行速度非常的快,速度接近C/C++的执行速度,而且编译houdini会帮你完成。这是他的优势所在了。它的目的是方便提供给用户自定义节点,自定义材质的一种语言。
当然了,日常中我用vex语言很容易搞混,它语法和C挺相似但是有不完全像C,所以我自己有时用的时候也经常犯一些愚蠢的语法问题。如下图。
这里是sidefx官网关于Vex的解释:
http://www.sidefx.com/docs/houdini15.0/vex/_index
Vex Expression是什么?
俗称vex的表达式,它是基于vex语法,大概是houdini12可以写在以下节点里面的语言,比如 Point Wrangle, Attrib Wrangle ; Geometry Wrangle, Gas Field Wrangle , particle dynamics nodes.我们可以直接将vex写在这些节点里面。
vex表达式运行是基于物体的((point, particle, edge, primitive, voxel),通过vex表达式可以很方便访问物体最底层的属性,并直接修改赋值。它们的出现大大方便了我们写vex表达式,同时也可以替代一些节点,如point节点,自从wrangle出现之后,我基本就不用这个节点了。
数据类型
数据类型的定义和c语言有点像又有点不像,相似的地方是声明一个变量需要定义他的类型。
Type | Definition | Example |
---|---|---|
int | Integer values | 21, -3, 0x31, 0b1001, 0212, 1_000_000 |
float | Floating point scalar values | 21.3, -3.2, 1.0, 0.000_000_1 |
vector2 | '二维向量',float类型 | {0,0}, {0.3,0.5} |
vector | '三维变量' positions, directions, normals or colors (RGB or HSV) | {0,0,0}, {0.3,0.5,-0.5} |
array | '数组' | { 1, 2, 3, 4, 5, 6, 7, 8 } |
struct | '结构' | c |
matrix3 | '矩阵' | { {1,0,0}, {0,1,0}, {0,0,1} } |
matrix | '矩阵' | { {1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1} } |
string | '字符' | hello world |
bsdf | PBR shaders for information on BSDFs. |
1 2 3 4 5 |
float a=2.0; int b=2; vector c={1,2,3}; int d[]={1,2,3,4,5,6}; string maps[] = { "Mandril.rat", "default.pic" } |
更多关于数组用法:http://www.sidefx.com/docs/houdini15.0/vex/arrays
定义属性
和c的变量定义很相似,那么下面是不同的地方。它不单可以定义变量,它还能定义属性attributes。这是vex表达式特有的。
何为属性,大家应该看着个教程之前都有一定houdini的基础了。就是基于模型元素的一些属性来表示元素性质,如质量,速度。
属性名前面必须要加@符号。
type | Syntax | Example |
---|---|---|
float | f@name | 21.3,-3.2 |
vector2 (2 floats) | u@name | {0,0}{0.3,0.5} |
vector (3 floats) | v@name | {0.3,0.5,-0.5} |
vector4 (4 floats) | p@name | {0,0,0,1} |
int | i@name | 21,-3,0x31 |
matrix2 (2×2 floats) | 2@name | |
matrix3 (3×3 floats) | 3@name | { {1,0,0},{0,1,0},{0,0,1}} |
matrix (4×4 floats) | 4@name | |
string | s@name | hello world |
1 2 3 4 |
float @a=2.0; //定义一个float类型属性a f@b=2.0; //可以省略float,用f来代表数据类型 vector @c={1,2,3}; //定义一个vector类型属性c v@d={1,2,3}; //可以省略vector,用v来代表数据类型 |
注意:在声明属性的时候,等号的右边不能函数,变量、运算符(个人认为很不解的地方)
1 2 3 4 5 6 7 8 9 10 |
float @mass = 1 / 2; // Error /////////////// float @mass; @mass=1/2; //ok /////////////// vector @up = set(0, 1, 0); // Error ////////////// vector @up; @up={1,2,3}; //ok ////////////// |
访问和修改属性属性:
1 2 |
vector color=@Cd; //访问颜色Cd属性。 @Cd={1,0,0}; //改成红色。 |
注意:在赋值vector的时候如果右边有运算符或者调用函数,不能用{}。要用set()
1 2 |
@P={@P.x,rand(@ptnum),@P.z}; //Error @P=set(@P.x,rand(@ptnum),@P.z); //ok |
houdini本身会自定义一些预设属性,所以我们在定义自己的属性的时候最好避开这些命名,如果你想更改预设属性也可以,名字要匹配(区分大小写),类型也一定要对上才能完成修改。
VEX type | Attribute names |
---|---|
vector (3 floats) | @P,@accel,@center,@dPdx,@dPdy,@dPdz @Cd,@N,@scale,@force,@rest,@torque,@up,@uv,@v |
vector4 (4 floats) | @backtrack,@orient,@rot |
int | @id,@ix,@iy,@iz,@nextid,@pstate,@resx,@resy,@resz @ptnum,@vtxnum,@primnum,@numpt,@numvtx,@numprim,@group_* |
string | @name,@instance,@OpInput1,@OpInput2,@OpInput3,@OpInput4 |
注意,这里某些预设的属性他们作用域不是全局的,是局部的,只针对当前节点,如果这个节点支持这个属性那么,我们才可以调用。
全局变量
和HScript的表达式不同, 你不能在vex中使用$F(我经常搞混这里)
.
要改成这些命名了。这些是全局的,你可以在所有类型的wrangle都能用。
@Time |
Float time ($T ) |
@Frame |
Float frame ($FF ) |
@SimTime |
Float simulation time ($ST ), only present in DOP contexts. |
@SimFrame |
Float simulation frame ($SF ), only present in DOP contexts. |
@TimeInc |
Float time step (1/$FPS ) |
操作符
Vex操作符和c相似,下面主要是区别一些和c不同的地方。
vector相乘的结果是vector每个元素之间的相乘
1 2 3 |
vector a={1,2,3}; vector b={2,3,4}; a*b==set(a.x*b.x,a.y*b.y,a.z*b.z); |
当两个不同类型的变量相加时,结果数据类型和第二个数据类型相匹配 for example
1 |
int + vector = vector |
点符号Dot operator
可以用来表示一个向量每个元素。
-
.x
or.u
表示vector2的
第一个元素 -
.x
or.r
表示vector
andvector4的第一个元素
-
.y
or.v
表示vector2的
第二个元素 -
.y
or.g
表示vector
andvector4的第二个元素
-
.z
or.b
表示vector and
vector4的第三个元素
-
.w
or.a
表示
vector4的第四个元素
对于 matrices, 你可以使用以下:
-
.xx
表示
[0][0]
元素
-
.zz
表示
[2][2]
元素
-
.ax
表示
[3][0]
元素
保留关键字
break
, bsdf
, char
, color
, const
, continue
, do
, else
, export
, false
, float
, for
, forpoints
, foreach
, gather
, hpoint
, if
, illuminance
, import
, int
, integer
, matrix
, matrix2
, matrix3
, normal
, point
, return
, string
, struct
, true
, typedef
, union
, vector
, vector2
, vector4
, void
, while