【Houdini Tut】HDK vex 后续

在之前的视频的评论区里,有人提到了HDK没有开放vex读写的功能,也无法通过wrangle的输入端口号来获取上游的geometry。举个例子来说明就是我没有办法用HDK写一个类似addpoint,addattrib, setpointattrib的函数,输入geo handle(0,1,2,3), 获得对应的上游的geometry,修改geometry以及属性等等。
第一个想到的方法是:
使用头文件

先用HDK写一个输入路径string参数的VEX函数,然后在头文件内写一个同名的输入geo handle的函数,将handle的数字转为路径后,调用刚才写的HDK vex函数。
但是,在使用的时候,还需要额外写个#include “xxx.h”, 实在有些麻烦。
那么,houdini自己是怎么做的呢?
在houdini安装目录的houdini/vex/intrinsics文件夹下,可以看到很多的vex文件

打开其中一个文件gvexopinput.vex, 发现里面的东西长得很像LLVM IR......不是很像,好像就是


找到一个眼熟的构造简单的函数npoints,这个int npoints(int) 函数实际上调用了
int npoints(string), 输入的string 参数就是@0=“opinput:%d”
在gvexfunctions.vex中可以找到更多类似这样的东西:

浏览一遍这个文件,发现所有的setpointattrib、setdetailattrib、setprimattrib、setvertexattrib函数,都来源于setattib函数。猜测houdini自己只用HDK实现了一个setattrib的VEX函数,其他设置点线面属性的函数都在生成IR阶段转换为这个setattrib函数。
于是,第二种方法出现了:
使用.vex文件
这里还是用视频中的悬链线的例子。

虽然用HDK写了solveCatenary和powerLine两个vex函数,但是在使用中还需要写这么一大串代码。下面演示一下,如何用vex IR的方法创建一个新的vex函数,实现上面wrangle中的功能。
step1:
新建一个后缀为.vfl的文件,在里面写上函数(照着vex语法写就行了

step2:
打开houdini的command line tools, 用vcc将这个vfl文件转成一个vex文件

step3:
如何让这个vex文件生效?我尝试了很多方法。(1)直接放在intrinsic文件夹内是没有用的
(2)必须要改名成和houdini的intrinsic下某个vex文件一样的名字才会生效,但是这样又会影响houdini原来自带的vex函数,导致一些函数无法使用。
(3)最后还是用了一个非常丑陋又粗暴的方法:先将某个vex文件比如gvexfunctions.vex从安装目录下复制到Document/houdinixxx/vex/intrinsics目录下(不要修改安装目录下的文件)。然后将step2中生成的vex文件中内容,整合进gvexfunctions.vex里(需要做一些修改)
step4:
最终效果:
