28 1月

Vex 案例

作者:will 网址:http://ymuhua.com/2016/01/28/vex-104/

用volume做mask选点。(volumesample)

现在我们有一个河床,和一个用box塞满点。我想做个一条小溪流。

comb

但是,我想把在河床外面的点去掉,只留下河床里面的点来作为水。

bedvolume

那么,首先我们需要将河床转换成有体积的模型后再转换成volume。

然后,我通过volumesample来选择我需要的点。

v1node

结果:

wkresult

用volume来选模型的好处就是,速度非常的快,比用一个封闭的几何体去选择快很多,这个在生产中是非常实用的。

 

vex选出稀疏(落单)的点(point cloud)

我们做水或者水花的时候,可能会发现某些点飞得非常的远,为了处理这些落单的点,可能通常会用到速度来判断删除,但是用速度有个问题,当它速度减小的时候这些点又会重新出现。

所以,我们需要用点云pointcloud来判断,当某个点周围没有点,或者点很少的时候,我们可以删除这个点。

pointxxx density

 

 

更具一个轴来旋转方向向量

现在如图有一个法线N,它 的初始方向是{1,0,0}, 现在我需要让法线N绕y轴{0,1,0}来旋转。rot

rot2

转载请注明作者和出处,谢谢。http://ymuhua.com/2016/01/28/vex-104/
27 1月

Vex 语法

作者:will 网址:http://ymuhua.com/2016/01/27/vex-102/

这部分我们会简单介绍一下,判断和循环。为什么简单介绍一下呢,因为几乎和c是一样的。

{}

和C一样,大括号在逻辑语句中表示开始和结束的标记

If

结果:

cd

while loop

For

结果:增加10个点

foreach

这个循环旨在帮助你循环数组中的元素。
语法

举例

return

函数返回值

跳出当前循环,进行下次循环

Break

结束循环

 

调用使用用户自定义函数

转载请注明作者和出处,谢谢。http://ymuhua.com/2016/01/27/vex-102/
27 1月

Vex Expression 用法

作者:will 网址:http://ymuhua.com/2016/01/27/vex-103/

自从有了wrangle这些节点让我能够写vex表达式之后,houdini原有哪些很常用的节点都被我抛弃了。下面来介绍一下它可以代替哪些节点。

Point

point

如果用过houdini15之前的版本的同学,我们发现houdini15之后这个节点里面填写的内容发生改变了。说明sidefx也更倾向于用vex表达式了。

point2

以上的这些参数,我们用vex可以这么写:

Attribute Create

pscale

vex可以这么写:

很简洁~

将属性映射为local varible.

group

可以替代group节点

创建组:用group_name的前缀就能很方便创建一个组

判断组是否存在

根据条件进组

组合并

group2

其实我们在Spreadsheet中查看,其实就相当于添加了一个组的属性。

group

除了以上这些我比较常用的操作,它还能完成以下

Creating geometry修改创建模型

常用到一下函数:

addpoint

addprim

addvertex

removepoint

removeprim

setprimintrinsic

setattrib   用@name=val这种方式直接赋值属性会比较快,效率会更高,但是当你需要创 建不同类型的属性的时候可以用这个。

还有一点我们需要知道就是上面这些函数都是并发的,也就是说支持cpu多核并发处理。所以vex还是非常强大的。

创建primitive需要注意的是,要为每个point再创建一个相对应的vertex,否则houdini会崩溃。

转载请注明作者和出处,谢谢。http://ymuhua.com/2016/01/25/vex-103/
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/