FBX 6000 文件格式规范

问题描述 投票:0回答:1

我在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
)都无法打开它。我如何以编程方式阅读它们?

谢谢(自己回答进来😀)

binary deserialization fbx
1个回答
0
投票
  1. 如果您是艺术家,或者文件很少,只需获取 Autodesk FBX 转换器。它支持所有 FBX 版本(afaik)。

  2. 如果您可以访问 C++,并且可以轻松使用它,并且对 OpenSource 软件没有硬性要求,或者没有 exe 文件大小限制,请使用 官方 FBX SDK。它支持所有 FBX 版本(afaik),并且应该很容易绑定。

  3. 如果你在第三阵营,只是想消除别人的所有麻烦,并且你正在开发自己的工具或引擎,或类似的东西,像我一样,准备好迎接我的发现😃。它不完整,但它是对二进制数据结构的描述。

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 找到有关它的信息,其他所有内容都非常可读,所以现在应该更容易解码 :).

如果您需要帮助了解细节或确切的算法,您可以访问我在雷姆引擎中的实现

© www.soinside.com 2019 - 2024. All rights reserved.