大概几个月前,工作上有的个需求要给自研的引擎做一个类似HoudiniEngine的自动化管线,于是我大概看了一下houdiniengine for unreal 的结构,其中还是有不少收获。这里就当作是备忘。
如有我理解错的地方还请给位看官多多赐教~~
HAPI
什么是HAPI(“哈皮”, 对,你没听错,官方就这么读的)
SideFX 官方说 HoudiniEngine是一个houdini的无头版本, 但是看了HoudiniEngine的结构后, 我发现实际上 houdini engine 可以拆分成两个模块:一个是根据应用场景不同而变化的类似于客户端(也就是我们通常在引擎或者DCC里面看到的HoudiniEngine), 另一个模块则是在本地或者服务端实际执行HDA节点功能的无头版Houdini (HARS=Houdini-Engine API Remote Server)。而负责这两个模块之间通信的便是HAPI:
https://www.sidefx.com/docs/hengine/_h_a_p_i_8h.htmlwww.sidefx.com从HAPI的文档开始,有C++基础的小伙伴们就可以直接起飞了,毕竟直接调用HAPI的命令就能够实现Houdini里面的几乎所有操作。甚至连完整代码样例都已经提供了。具体的细节文档上面都有,我这里就不多说了。(虽然说配置C++ 环境可能会有点繁琐,特别是像我这样的C++萌新,这里就推荐一位大神的配置视频)
张家乐:Houdini Engine API配置zhuanlan.zhihu.com配置好之后我们就能够直接通过HAPI,用“传入数据-载入HDA-Cook-读取数据”这样的方法简单的实现类似于HoudiniEngine的功能了。
本来故事到这里就结束了,但是我更想通过python来调用HAPI,一是使用C++每次测试都需要build出来,我测试起来很不方便,二是有不少软件的高层脚本语言都支持python, 只是实现一些基于HAPI的简单功能的话,python调试起来也更方便(相对的,性能会有所牺牲)。
在大佬们的指引下,我终于发现,HAPI的通信似乎是通过thrift实现的?这个我不确定,但是我在houdini的安装目录下找到了HART.thrift 和 HART_Auto.thrift 这两个文件,再去下载一个thrift的执行文件。理论上就能够生成用于不同语言的HAPI接口。
thrift -r --gen py XXXX.thrift
果然,通过上面的命令就能够生成能够用于Python的HAPI。include这写生成的文件到python里面就能直接调用HAPI了。
但是光有这个调用端是不够的,我们还需要一个HARS来接受调用命令并在处理后返回信息。
https://www.sidefx.com/docs/hengine/_h_a_p_i__sessions.html#HAPI_Sessions_Thrift_Serverwww.sidefx.com../.../HARS.exe -s 1234
找到houdini安装文件夹中的HARS.exe文件, 通过上面的系统命令,便能启动一个基于1234端口的HARS服务(端口需要根据你所在的网络环境来自己决定), 这个服务程序可以是在本地,也可以在局域网中的机器上。(需要注意的是,HARS需要houdini engine 或者更高级别的license, 确保运行HARS的机器上要有可用的license)
那么现在我们就能实现通过Python来调用HAPI了!!
import
到这一步,通过python如同使用C++一样的调用HAPI了,如果想测试一下HARS是否在整成运作,可以添加以下语句:
VGeo
这样就会在HARS那台机器上的对用目录中生成一个Debug.hip文件,其中有一个命名为Validation_Geo的GEO节点。
所有的API都在HART_Auto 与HART之中能够找到,更具体的使用可以直接到HAPI文档之中找到对应的API,名字基本上都是对应的,参数会有些许不同,但不影响使用。
至此,我就能够在任何使用或者支持python作为脚本语言的应用当中直接使用HAPI并把Houdini里面的强大功能直接代入到其中~~
比如说,写个houdini engine for blender 啥的~(并不)