FBX 二进制数据解析
前言
最近遇到了一个比较难搞的需求,好不容易解决了,在这里记录一下。
需求是这样的,公司有大佬在 motionbuilder 写了插件,利用 mobu API 做了一个自定义的节点并在里面通过 FBXStore API 存入了自定义数据。
我需要将这些操作通过 Python FBXSDK 来完成这些数据的写入。
主要原因是 motionbuilder 的稳定性不可靠,如果可以利用纯外部调用 FBXSDK 的形式解决问题,就不需要依赖 mobu 了。
用 FBXSDK 来还原自定义节点操作都好说。
主要蛋疼的地方在于需要解决 FBXStore API 调用背后怎么转换成二进制的问题。
motion builder C++ 插件编译
在 motion builder 的安装路径有
OpenRealitySDK文件夹,里面的 samples 有很多开发 mobu 的参考代码。
其中比较具有代表性的脚本就是OpenRealitySDK\samples\devices\devicecamera\ordevicecamera_device.cxx
这个脚本就定义怎么将自定义数据存入 FBX 当中,并且利用FbxRetrieve方法将功能读取回来。
我们可以把这个东西编译出来作为我们这次测试的内容。
默认 motionbuilder 的 samples 里面提供了 sln 工程,可以直接用 VS 打开。

打开之后需要将平台工具集升级到最新的 VS 版支持的工具集,默认是 2012 工具集太过古老了。
改完之后本想着愉快地编译,然而这样会报错。

这个问题只能归结为新的平台工具集已经去掉了支持,但是头文件依旧引入相应的文件,解决也很简单,将报错的那一行注释即可。
编译完成会默认去到
bin\x64\plugins的目录,这样只要重启 motion builder 就能加载到这个 dll 了。

这样将这个图标拖拽到场景就可以创建一个 device.
将这场景以 ascii 的格式保存。
检查保存的 FBX 文件,可以看到 FBXStore 的写入逻辑,会将信息写入到节点的MoBuAttrBlindData属性上

存储出来可以看到相应的信息。
这里官方的插件将信息转成了 KString 所以里面的信息也是以 FBX ASCII 的形式存在。
但如果将 FBX 存成 Binary 模式,然后再用 Python FBXSDK 来转存成 ASCII 的话,这些 FBXStore 的数据会转成 base64 的二进制数据。

如果用 base64 解码,可以看到里面存储的二进制数据。
1  | import... |