Part1fbx簡介
Autodesk FBX是Autodesk公司出品的一款用于跨平台的免費三維創作與交換格式的軟體,通過FBX使用者能通路大多數三維供應商的三維檔案。FBX 檔案格式支援所有主要的三維資料元素以及二維、音頻和視訊媒體元素。
FBX對于三維軟體的相容性非常非常強大,幾乎所有的三維軟體或者遊戲引擎全部都支援導入FBX模型,是以FBX格式已然成為新時代的互導利器。

fbx有兩種檔案模型,一種是二進制檔案,另外一種是ASCII檔案。二進制檔案檔案大小和加載速度上面具有天然的優勢,但是在可讀性和易于內建方面不如ASCII檔案。本來主要基于ASCII檔案格式進行研究。
Part2fbx格式-ASCII
本章通過一系列示例來研究fbx的資料存儲方法。這裡在3dmax中建立一個正方體,屬性如下:
1、系統機關為米
2、長、寬、高為1米
3、場景中位置為(0,1,0)
4、材質為pbr材質,名稱為M001
5、Z軸向上 效果圖和導出格式如下:
1全局配置
全局的配置存放在GlobalSettings結構裡,通過UpAxis表示向上的坐标軸,其中Y軸向上值為1,若Z軸向上值為2。通過OriginalUnitScaleFactor存放系統機關,值為100表示機關為1米。示例如下
GlobalSettings: {
Version: 1000
Properties70: {
P: "UpAxis", "int", "Integer", "",2
P: "OriginalUnitScaleFactor", "double", "Number", "",100.00000066
}
}
2預設設定
對象的預設屬性存儲在Object definitions字段。這樣就可以不在下面的具體定義中展現預設值了,可以有效地減少存儲空間。例如網格體的部分預設屬性設定示例如下:
ObjectType: "Model" {
Count: 1
PropertyTemplate: "FbxNode" {
Properties70: {
P: "QuaternionInterpolate", "enum", "", "",0
P: "RotationStiffnessX", "double", "Number", "",0
P: "RotationStiffnessY", "double", "Number", "",0
P: "RotationStiffnessZ", "double", "Number", "",0
P: "AxisLen", "double", "Number", "",10
P: "PreRotation", "Vector3D", "Vector", "",0,0,0
P: "PostRotation", "Vector3D", "Vector", "",0,0,0
P: "RotationActive", "bool", "", "",0
}
}
}
3對象定義
對象的定義是整個fbx格式中最核心的單元,這裡定義了幾何形狀、模型、材質等組成模型的必要元素。
Geometry對象
儲存了對象的頂點、多邊形、法線、UV、材質。
頂點資料格式如下
Vertices: *24 {
a: -0.5,-0.5,0,0.5,-0.5,0,-0.5,0.5,0,0.5,0.5,0,-0.5,-0.5,1,0.5,-0.5,1,-0.5,0.5,1,0.5,0.5,1
}
這裡實際上隻有8個頂點,因為每個頂點坐标需要用(x,y,z)三個值來表示。
多邊形格式如下:
PolygonVertexIndex: *24 {
a: 0,2,3,-2,4,5,7,-7,0,1,5,-5,1,3,7,-6,3,2,6,-8,2,0,4,-7
}
這裡為了區分模型網格是三角面還是四邊面,如果資料每隔三個為負數則為三角面,每隔四個為四邊面。
如何将負數的索引值轉成有效索引資料呢?
假如n為負數索引值,m = |n|-1 。m為計算後的正确索引值。可以看到我們是每隔四個一個負數,這說明我們是四邊形。
另外法線資訊存儲在LayerElementNormal中,uv資訊存儲在LayerElementUV中,材質資訊存儲在LayerElementMaterial中。這些資訊與模型關聯通過總的Layer來進行。示例如下:
Layer: 0 {
Version: 100
LayerElement: {
Type: "LayerElementNormal"
TypedIndex: 0
}
LayerElement: {
Type: "LayerElementMaterial"
TypedIndex: 0
}
LayerElement: {
Type: "LayerElementUV"
TypedIndex: 0
}
}
Model對象
Model對象主要用來存儲我們模型的平移、旋轉、縮放資訊。如我們模型在場景中坐标為(0,1,0)通過Lcl Translation字段來存儲,示例如下
Model: 2358487033216, "Model::Box001", "Mesh" {
Version: 232
Properties70: {
P: "InheritType", "enum", "", "",1
P: "ScalingMax", "Vector3D", "Vector", "",0,0,0
P: "DefaultAttributeIndex", "int", "Integer", "",0
P: "Lcl Translation", "Lcl Translation", "", "A",0,1,0
P: "MaxHandle", "int", "Integer", "UH",15
}
Shading: T
Culling: "CullingOff"
}
Material對象
材質對象通過Material來辨別,這裡我們存儲的是pbr此安置,定義示例如下:
Material: 2356630663440, "Material::M001", "" {
Version: 102
ShadingModel: "unknown"
MultiLayer: 0
Properties70: {
P: "SpecularColor", "ColorRGB", "Color", "",1,1,1
P: "SpecularFactor", "double", "Number", "",2
P: "ShininessExponent", "double", "Number", "",1024
P: "TransparencyFactor", "double", "Number", "",0
P: "EmissiveColor", "ColorRGB", "Color", "",0,0,0
P: "EmissiveFactor", "double", "Number", "",0
P: "3dsMax", "Compound", "", ""
P: "3dsMax|ClassIDa", "int", "Integer", "",2121471519
}
}
對象關聯
通過Connections字段來實作Geometry對象、Model對象、Material對象以及父子節點的關聯。示例如下:
Connections: {
;Model::Box001, Model::RootNode
C: "OO",2358487033216,0
;Geometry::, Model::Box001
C: "OO",2358344616656,2358487033216
;Material::M001, Model::Box001
C: "OO",2356630663440,2358487033216
}
對象的關聯分為四種類型:
● OO: Object (source) to Object (destination).
● OP: Object (source) to Property (destination).
● PO: Property (source) to Object (destination).
● PP: Property (source) to Property (destination).
子節點往往通過source來表示。材質和幾何體也通過source來表示,我們這裡有3個連接配接,分别代表:
1 、Box001的父節點是RootNode
2 、Box001的幾何體是id為2358344616656的幾何體
3 、Box001的材質是M001材質