欢迎光临散文网 会员登陆 & 注册

【Houdini Tut】HDK vex 后续

2023-08-28 13:12 作者:玄武国卖牛杂  | 我要投稿


在之前的视频的评论区里,有人提到了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:

最终效果:


【Houdini Tut】HDK vex 后续的评论 (共 条)

分享到微博请遵守国家法律