25 1月

VEX Expression 基础

作者:will  网址:http://ymuhua.com/2016/01/25/vex-101/

Houdini中的Vex语言是什么?

VEX在houdini中是一种执行效率很高的语言。简而言之它执行速度非常的快,速度接近C/C++的执行速度,而且编译houdini会帮你完成。这是他的优势所在了。它的目的是方便提供给用户自定义节点,自定义材质的一种语言。
当然了,日常中我用vex语言很容易搞混,它语法和C挺相似但是有不完全像C,所以我自己有时用的时候也经常犯一些愚蠢的语法问题。如下图。

cclose

这里是sidefx官网关于Vex的解释:

http://www.sidefx.com/docs/houdini15.0/vex/_index

Vex Expression是什么?

俗称vex的表达式,它是基于vex语法,大概是houdini12可以写在以下节点里面的语言,比如 Point Wrangle, Attrib Wrangle ; Geometry Wrangle, Gas Field Wrangleparticle dynamics nodes.我们可以直接将vex写在这些节点里面。

vex表达式运行是基于物体的((point, particle, edge, primitive, voxel),通过vex表达式可以很方便访问物体最底层的属性,并直接修改赋值。它们的出现大大方便了我们写vex表达式,同时也可以替代一些节点,如point节点,自从wrangle出现之后,我基本就不用这个节点了。
wrange

数据类型

数据类型的定义和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.

更多关于数组用法: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

注意:在声明属性的时候,等号的右边不能函数,变量、运算符(个人认为很不解的地方)

attributes

访问和修改属性属性:

注意:在赋值vector的时候如果右边有运算符或者调用函数,不能用{}。要用set()

houdini本身会自定义一些预设属性,所以我们在定义自己的属性的时候最好避开这些命名,如果你想更改预设属性也可以,名字要匹配(区分大小写),类型也一定要对上才能完成修改。

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每个元素之间的相乘

当两个不同类型的变量相加时,结果数据类型和第二个数据类型相匹配 for example

点符号Dot operator

可以用来表示一个向量每个元素。

  • .x or .u 表示vector2的第一个元素

  • .x or .r 表示vector and vector4的第一个元素

  • .y or .v 表示vector2的第二个元素

  • .y or .g 表示vector and vector4的第二个元素

  • .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

 

转载请注明作者和出处,谢谢。http://ymuhua.com/2016/01/25/vex-101/

2 thoughts on “VEX Expression 基础

  1. Pingback: Vex Expression | RAY & Houdini

发表评论

电子邮件地址不会被公开。