FBX SDK简单使用(一)
简介
FBX是Autodesk的一个常用的跨平台的三维数据格式,应用很广泛,这里是官方API,这里是官方例子。FBX的安装可以参照这里,基本介绍可以参考这里。
查看FBX文件数据
这是在整个使用过程中个人认为帮助很大的一个功能,3ds MAX中可以直接设置,在导出的时候可以选择二进制的格式或者ASCII的格式,如下图:
在FBX SDK中通过对FbxExporter设置可以得到一样的效果。
1 | // FBX设置输出ASCII格式文件 |
在VS Code中查看输出的文件显示如下:这样可以方便查看FBX文件是否包含需要的数据,导入到引擎的时候,也方便验证数据。
文件结构
FBX文件是以树(SceneTree)的形式进行存储的,以RootNode作为起始,在官方的例子中可以看出
通过遍历Node可以得到相应Node存储的数据,每个Node有对应的在FbxNodeAttribute枚举中的类型。例如eMesh,eSkeleton等。
常见概念
Control Point 和 Polygon Vertex
以3dsMax中最简单的Cube为例子,在正常格式下输出对应的Fbx得到的control point数量是8,polygon vertex数量是36,polygon数量是12。对应到Cube上,可以看到正常见到的Cube拥有8个顶点对应Control Point的数量,而正常box有6个面,在实际输出的时候,被分成了12个三角面,每个三角面对应一个polygon,而每个三角面三个顶点,因此polygon vertex的数量是12 * 3 = 36。每个polygon vertex可能拥有同一个位置,这时候是索引到同一个control point。
在Fbx SDK中通过以下代码获取
1 | // 顶点序号 |
Fbx Layer
在FBX的结构中,法线,切线,颜色,uv等都是通过layer进行添加,挂载在对应的mesh上。我们可以看到如下类似的代码,在GetElementNormal(0)括号中0代表第一层,例如uv等可能有好几套,通过这里可以指定第几套。特别需要注意的是,在3dsMax中
1 | // 获取法线 |
需要注意的是:
- 通过maxscript指令box()创建的盒子和直接在max场景中创建的盒子数据是不一样的,box()指令直接创建的盒子不带uv,没法通过代码生成tangent。
- 在Unity中导入切线数据,需要同时生成副法线数据,Unity中才可见。
Mapping Mode
eByControlPoint
在这个模式下Layer的数据是通过控制点去添加的,每个顶点的数据和对应的控制点的数据相同,在这里用顶点和控制点的法线进行尝试,得到的结果如下,可以看到整个Cube的边缘显得十分的柔和。
对应效果:
eByPolygonVertex
在这个模式下Layer的数据是通过顶点去添加的,在这里用顶点和控制点的法线进行尝试,得到的结果如下,可以看到整个Cube的边缘显得很锐利。
对应效果:
Reference Mode
这是一种选择是否使用优化存储的模式,eDirect表示直接通过索引来获取相应的信息,对应数量与control point或者vertex相同,eIndexToDirect则会将相同数据合并,并通过control point或者vertex的二级索引指向需要的数据,这样重复数据能够指向同一个位置节省存储空间。
在eIndexToDirect中需要通过如下代码获取索引
1 | int index = vertexNormal->GetIndexArray().GetAt(vertexIdx); |
eDirect在FBX文件中显示如下
eIndexToDirect在FBX文件中显示如下