天天看點

fbx格式研究

Part1fbx簡介

Autodesk FBX是Autodesk公司出品的一款用于跨平台的免費三維創作與交換格式的軟體,通過FBX使用者能通路大多數三維供應商的三維檔案。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軸向上 效果圖和導出格式如下:

fbx格式研究
fbx格式研究

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材質

Part3總結