Houdini VEX:基础语法

  • VEX VS Python

VEX语言是Houdini中VOP系统从编程角度的表达方式,而VOP系统是VEX的可视化编程节点操作方式。

VEX语法规则和C语言接近,和Python有很大区别,下面列出一些和Python语法上的不同点,以便区分是VEX脚本还是Python脚本。

  • VEX行结尾使用分号;
  • VEX代码块使用花括号{}
  • VEX声明变量定义变量类型
  • VEX声明函数定义函数返回值类型
  • VEX注释使用正斜杠,单行//,多行/multi-code/

Houdini中可以在Attribute Wrangle节点(节点网络中TAB键输入aw,后面简称aw节点)来编写VEX代码,这个节点很神奇,官网文档有说明它有一种内建的上下文处理机制,参数Run Over切换五种模式会得到不同的结果。

  • Detail(only once)
  • Primitives
  • Points
  • Vertices
  • Numbers

默认参数Points意味代码将在每个点循环执行,虽然你代码并没有写循环,只要有任何处理点的操作即会循环。

创建个box,连接一个aw节点,写入如下代码:

printf("hello vex\n");
printf("%d\n", @ptnum);

// hello vex
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
  • 变量以及变量声明
vector <variableName>;
  • 属性 VS 变量

属性实际也是变量,唯一的区别是属性是定义在几何体上的变量而已,用来处理几何体数据,可以传递给下游节点。

声明属性的时候只要在变量前加@符号即可,当然会有一些小技巧。

属性有内置属性和自定义属性之分。

  • 内置属性

Houdini中有很多内置属性,也就是几何体有一些约定俗成的属性,这些属性不需要声明类型就可以使用,Houdini能自动识别它们的数据类型,没有特别说明都假定为浮点型。

内置属性都可以在VOP系统中找到对应的参数入口。

内置类型 内置属性
int @id, @ptnum, @primnum, @vtxnum, @numpt, @numprim, @numvtx, @group_*, @resx, @resy, @resz
float @pscale, @Time, @Frame, @density, @age, @life, @opacity
string @name
vector @P, @Cd, @N, @force, @rest, @up, @uv, @v
vector4 @orient

更多内容可参考文档:http://www.sidefx.com/docs/houdini/model/attributes.html

  • 自定义属性

自定义属性在声明的时候@符号前加属性的数据类型,比如v@表示向量,f@表示浮点数,i@表示整数等,后面引用属性的时候就可以像内置属性一样不用加具体的数据类型,如果没有声明变量的类型,则默认以浮点型作为类型,自定义属性最好是声明具体的类型。

属性一般都有创建、设置、获取三种行为,比如给当前几何体添加法线属性(法线属性@N是一种内置属性)。

@N = {0, 1, 0};
@N = set(0, 1, 0);
@N = @P;

或者自定义属性

v@pos = @P;
f@y_pos = @P.y;

变量声明vector <variableName>和自定义属性v@attriName区别在于变量只会在当前代码中发挥作用,而属性会传递给几何体,作为数据流的一部分可以传递给下游节点,是使用变量还是属性的原则就是数据是否要给到下游,如果不需要就使用变量,因为几何体上的属性都是需要占用硬件资源的。

  • 数据类型
变量声明 自定义属性 案例
int i@ 1, 2, 3
float f@ 3.14, 9.8
vector2 u@ {0, 0}, {0.1, 0.2}
vector v@ {0, 0, 0}
vector4 p@ {0, 0, 0, 0}
array i/f/s[]@ {1, 2, 3, 4, 5, 6, 7, 8}
matrix2 2@ {{0, 1}, {2, 3}}
matrix3 3@ {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
matrix 4@ {{1, 0, 0, 1}, {0, 1, 0, 1}, {0, 0, 1, 1}, {0, 0, 1, 1}}
string s@ “hello world”

更多内容可参考文档:http://www.sidefx.com/docs/houdini/vex/lang.html

  • 数组

数组在VEX中是一种极其重要的容器,不管是向量还是四元素都离不开数组的组织数据。

  • 字符串
  • 切片

切片很容易理解,和Python中列表切片概念是一样的,通过元素的index来获取区间。

  • 结构体

  • 点操作符

    • .x 或 .u 指向vector2变量或属性的第一个元素。
    • .x 或 .r 指向vector和vector4变量或属性的第一个元素。
    • .y 或 .v 指向vector2变量或属性的第二个元素。
    • .y 或 .g 指向vector和vector4变量或属性的第二个元素。
    • .z 或 .b 指向vector和vector4变量或属性的第三个元素。
    • .w 或 .a 指向vector4变量或属性的第四个元素.

如果是矩阵,则

  • .xx 指向[0][0]元素。
  • .zz 指向[2][2]元素。
  • .ax 指向[3][0]元素。

参考文档: