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格式研究_java_02fbx格式研究_大数据_03

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 }}1.2.3.4.5.6.7.

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   }  } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

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  }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对象

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对象

材质对象通过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材质


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空