智伤帝的个人博客

智伤帝

马上订阅 智伤帝的个人博客 RSS 更新: https://blog.l0v0.com/atom.xml

FBX 二进制数据解析

2022年11月6日 16:38

前言

  最近遇到了一个比较难搞的需求,好不容易解决了,在这里记录一下。
  需求是这样的,公司有大佬在 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 打开。

image

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

image

  这个问题只能归结为新的平台工具集已经去掉了支持,但是头文件依旧引入相应的文件,解决也很简单,将报错的那一行注释即可。

image

  编译完成会默认去到 bin\x64\plugins 的目录,这样只要重启 motion builder 就能加载到这个 dll 了。

image

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

image

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

image

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

1
2
3
4
5
6
7
8
import...

剩余内容已隐藏

查看完整文章以阅读更多