Autodesk FBX是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件,通过FBX用户能访问大多数三维供应商的三维文件。FBX 文件格式支持所有主要的三维数据元素以及二维、音频和视频媒体元素。
FBX对于三维软件的兼容性非常非常强大,几乎所有的三维软件或者游戏引擎全部都支持导入FBX模型,所以FBX格式已然成为新时代的互导利器。
fbx有两种文件模型,一种是二进制文件,另外一种是ASCII文件。二进制文件文件大小和加载速度上面具有天然的优势,但是在可读性和易于集成方面不如ASCII文件。本来主要基于ASCII文件格式进行研究。
本章通过一系列示例来研究fbx的数据存储方法。这里在3dmax中新建一个正方体,属性如下:
1、系统单位为米
2、长、宽、高为1米
3、场景中位置为(0,1,0)
4、材质为pbr材质,名称为M001
5、Z轴向上 效果图和导出格式如下:
全局的配置存放在GlobalSettings结构里,通过UpAxis表示向上的坐标轴,其中Y轴向上值为1,若Z轴向上值为2。通过OriginalUnitScaleFactor存放系统单位,值为100表示单位为1米。示例如下
登录后复制
GlobalSettings: { Version: 1000 Properties70: { P: "UpAxis", "int", "Integer", "",2 P: "OriginalUnitScaleFactor", "double", "Number", "",100.00000066 }}1.2.3.4.5.6.7.
对象的默认属性存储在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 } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
对象的定义是整个fbx格式中最核心的单元,这里定义了几何形状、模型、材质等组成模型的必要元素。
保存了对象的顶点、多边形、法线、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 }1.2.3.
这里实际上只有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 }1.2.3.
这里为了区分模型网格是三角面还是四边面,如果数据每隔三个为负数则为三角面,每隔四个为四边面。
如何将负数的索引值转成有效索引数据呢?
假如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 } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
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" }1.2.3.4.5.6.7.8.9.10.11.12.
材质对象通过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 } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
通过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 }1.2.3.4.5.6.7.8.9.10.11.12.
对象的关联分为四种类型:
登录后复制
● OO: Object (source) to Object (destination).● OP: Object (source) to Property (destination).● PO: Property (source) to Object (destination).● PP: Property (source) to Property (destination).1.2.3.4.
子节点往往通过source来表示。材质和几何体也通过source来表示,我们这里有3个连接,分别代表:
1 、Box001的父节点是RootNode
2 、Box001的几何体是id为2358344616656的几何体
3 、Box001的材质是M001材质
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删