我在Synty-Store War Pack中找到了一个FBX 6100二进制文件,Assimp(
FBX-DOM unsupported, old format version, supported are only FBX 2011, FBX 2012 and FBX 2013
)和Blender(Version 6100 unsupported, must be 7100 or newer
)都无法打开它。我如何以编程方式阅读它们?
谢谢(自己回答进来😀)
如果您是艺术家,或者文件很少,只需获取 Autodesk FBX 转换器。它支持所有 FBX 版本(afaik)。
如果您可以访问 C++,并且可以轻松使用它,并且对 OpenSource 软件没有硬性要求,或者没有 exe 文件大小限制,请使用 官方 FBX SDK。它支持所有 FBX 版本(afaik),并且应该很容易绑定。
如果你在第三阵营,只是想消除别人的所有麻烦,并且你正在开发自己的工具或引擎,或类似的东西,像我一样,准备好迎接我的发现😃。它不完整,但它是对二进制数据结构的描述。
FBX 6100 是一个很旧的版本,我相信是从 ~2010 年开始的。
文件以小端编码,并以魔法
"Kaydara FBX Binary"
开头。我不知道接下来的 5 个字节的含义。
然后版本如下 U32:6100 (0xd4,0x17)
。
接下来的一切都具有相同的底层结构,并且是一个数组或节点树:
U32 endOfBlock, I32 type, I32 dataLength, U8 keyLength, U8[keyLength] key, children or values
.
有两种类型的节点:结构(第一个或最后一个叶子,type==0),或数据(type>0)。
EndOfBlock
为每个最后一片叶子,否则为文件中节点数据末尾的绝对地址。
DataLength
为 0 当且仅当节点是结构性的。
如果节点是数据,
type
表示属于values
的key
的个数。
如果节点是结构化的,直到到达
endOfBlock
,读取它们的子节点。
否则,阅读他们的价值观:
每个值都以其类型的标记开头,然后数据紧随其后。
I = 32-bit integer, I32
D = 64-bit float, double, FP64
S = string: I32 length + U8[length] data
R = some uuid, I32 length + U8[length] data
C = character, U8
L = 64-bit integer, I64
可能还有更多,但那是我使用 HxD 发现的那些。
就是这样😃。其余的只是“普通”FBX,您可以在例如 banexdevblog.wordpress.com 找到有关它的信息,其他所有内容都非常可读,所以现在应该更容易解码 :).
如果您需要帮助了解细节或确切的算法,您可以访问我在雷姆引擎中的实现。