Pluralsight - Houdini VEX Fundamentals

          3 分钟    智伤帝
出品方: Pluralsight 难度: beginner houdini 版本: houdini 16+
houdini 模块: SOP
流程: modeling
网盘链接: https://pan.baidu.com/s/1St_q-BAkNatFDMXw9n7FGQ   提取码: wiki

总结

  这个教程的前 20 集的新手教学做得很不错。
  但是20集之后开始制作科幻走廊,就开始复杂起来了。
  而且感觉教程作者的用法有点拉胯,我看不下去,于是我暂停了后续的观看。
  打算后面将 Vex 的教程再看多点再回头补完。

观看笔记

VEX & HScript 比较

@P += sin(@Frame/10);
sin($F*4)

alt

  Houdini 的 HScript 和 VEX 都能通过 sin 函数控制缩放

04 - Hello world

alt

printf("Hello World");

  VEX 可以像 C 语言一样打印出字符串,默认在 Detail 下值运行一次。

alt

printf("Hello World with Point %d\n",@ptnum);

  如果输入参数并且设置为 Points 模式下运行,则会自动遍历模型的数据。

alt

`points("../hello",0,"message")`

  Houdini 如同操作系统,输入文件路径就可以获取相应节点下的数据。

05 - Houdini Specifics

alt

  VOP 节点可 View VEX Code 打开背后生成的 VEX 代码。VOP 是用节点生产 VEX 代码。

alt

  Wrangle 节点有 VEX 代码模板。

alt

alt

  在 VEX 代码的函数下停留一小段时间可以按 F1 打开 Houdini 的帮助文档。

VEX 语法

alt

int points = npoints(0);

if(points>7){
  @cd = rand(@ptnum);
}

int var = 0;
for(int i=0;i<points;i++){
  var ++;
}

  VEX 采用 C 语言的大部分语法规则。

alt

int count = 1;

float weight = 1.5;

string str = 'A message';

int myArray[] = {1,2,3,4,5};

vector position = {1,3,0};

matrix translation = { {1,1,1,1} , {2,2,2,2} , {3,3,3,3} , {4,4,4,4} };

printf("Test %d\n",translation);

int new;

// 类型转换
new = (int)weight;

  VEX 的变量类型以及变量命名, 命名遵循 C 命名规则,首字符必须为字母,命名变量不包含特殊符号。
  vector 变量可以通过 .r .g .b .a 或者 .x .y .z .w 的方式获取相应的四个值,对应到 matrix 也同理。

alt

  使用 VEX 可以让顶点的 Y轴 大于 零的全部归零。

10 - functions

point(); // get attribute
prim();
vertex();
detial();

setpointattrib(); // set attribute

addpoint(); // make a point

npoints(); // how many are there

setpointgroup(); // put in group

alt

  常用的 VEX 函数

12 - foreach 节点

11

  16.0 以下的节点使用 foreach subnetwork 进行循环操作,到了 16.5+ 的版本就不存在这个节点了,不过实现的效果是一致的。

13 - 引用

alt

  VEX 的传参修改会改变原来的数值,这点和 Python 不一样。

alt

  VEX 的函数参数间隔使用 ;

17 - NearPoints

alt

@Cd = 0;

@Cd = set(0);

@Cd = {0};

@Cd = {0,0,0};

  设置 Vector 变量有不同的方式可以做到。

案例分析

Y轴归零 - 11

  使用 VEX 语言的三种操作让 Y轴大于零的 部分归零。

if(@P.y > 0)@P.y=0;
vector pos_all[];
vector pos;

// 获取顶点的位置
for (int i = 0; i < npoints(0); i++)
{
    pos = point(0,"P",i);
    append(pos_all,pos);
}

// 设置顶点的位置
foreach(int index;vector posi;pos_all){
    if(posi.y>0){
        posi.y = 0;
        setpointattrib(0, "P", index, posi, "set");
    }
}
int pt_num[] = primpoints(0, @primnum);
vector pos;

foreach(int pt;pt_num){
    pos = point(0,"P",pt);
    if(pos.y>0){
        pos.y = 0;
        setpointattrib(0, "P", pt, pos, "set");
    }
}

VEX 构建模型 - 13 & 15

alt

  addpoint addprim addvertex 结合这几个命令可以在 Houdini 构建几何体。
  addvertex 的顺序影响 prim 的法线方向。

  通过 for 循环批量创建几何体。

寻找临近的点生成线 - 16

alt

  nearpoints 找到每个点临近的顶点序号。
  addprim 给临近的点添加线段。

根据外部模型距离生成颜色值 - 19

  利用 pcloud 点云计算模型的距离

int origin = chi("source");
float distance = ch("dist");
int amount = chi("amount");
int target;

vector pos = point(1,"P",origin);
int pcloud = pcopen(0,"P",pos,distance,amount);

if(pcnumfound(pcloud)>0){
    while(pciterate(pcloud)){
        pcimport(pcloud, "point.number", target);
        setpointattrib(0, "Cd", target, {1,0,0}, "set");
    }
}

point cloud 模型偏移 - 20

  教程使用 wrangle 遍历 points ,然后每个 @P 获取到 外部顶点的 pcloud
  如果查询得到则计算出距离和方向,然后将方向叠加到顶点的位置上。
  上面的操作会导致顶点位置偏移了很多。

alt

  方向进行 normalize 归一化。
  通过 distance 提取出距离
  将距离作为衰变映射,乘到归一化的方向上。

alt