如何将Fbx格式转换成VVO格式
一、Fbx文件格式简介
1.1 KFbxSdkManage和KFbxScene
Fbx文件是Autodesk开发的文件格式,其开发目的就是为了实现Autodesk旗下软件之间的数据交换。Fbx文件格式本身是不公开的,而是通过FBX SDK实现对Fbx文件的读取以及写入。
使用FBX SDK时,最先遇到的两个对象就是KFbxSdkManage和KFbxScene。
KFbxSdkManage是sdk中的中心类,负责了整个sdk内部状态的管理,很多其他对象创建也依赖于KFbxSdkManage,程序中只需要有一个KFbxSdkManage类的实例即可。
KFbxScene如其名所示,代表了一个场景,而这里的场景就是fbx文件中包含的所有信息,fbx文件导入以后,在程序中就是一个KFbxScene对象,所以一个fbx文件只需要一个KFbxScene类的实例。
1.2 Fbx的数据组织方式
Fbx的数据组织方式是scene tree,即场景树。由KFbxScene所声明的对象可以得到该场景树的根节点,根节点包含了一系列子节点KFbxNode,每个KFbxNode又有其自己的子节点,以此往下类推。这样通过递归循环就可以遍历到每一个节点,然后获取该节点的信息。
RootNode是该Fbx文件所对应的根节点,由以下语句得到:
KFbxNode* 月光别墅pNode = pScene->GetRootNode();//获得根节点
图1是一个圆柱体的例子。该圆柱体总共有四个节点,Patch、SkeletonRoot、
SkeletonLimbNode1、SkeletonLimbNode2是这四个节点的名称。其中Patch、SkeletonRoot是RootNode的孩子,SkeletonLimbNode1是SkeletonRoot的孩子,SkeletonLimbNode2是SkeletonLimbNode1的孩子。
图 1
1.3 Fbx中节点KFbxNode说明
1.3.1 节点坐标
场景树中每个节点都是KFbxNode,KFbxNode类本身包含了坐标变换信息,例如可以用函数骨头汤的营养价值EvaluateGlobalTransform(KTime pTime)获得在pTime时刻该节点的全球变换矩阵。获得全球变换矩阵后,我们可以得到节点在该时刻的世界坐标系下的平移、旋转和缩放。同理由EvaluateLocalTransform(KTime pTime)获得在pTime时刻该节点的本地变换矩阵,进而获得该时刻本地坐标系下节点的平移、旋转和缩放。
1.3.2 节点类型
一个节点KFbxNode包含其他数据作为KFbxNodeAttribute对象,包含在其内部,这里的其他数据是指mesh,Nurbs,skeleton,camara,light等定义在KFbxNodeAttribute::EAttributeType中的枚举类型。获得一个节点的类型可用以下函数语句来实现:
KFbxNodeAttribute::EAttributeType lAttributeType;
lAttributeType = pNode->GetNodeAttribute()->GetAttributeType();
1.3.3 节点中层次Layer
层次Layer:法线、纹理坐标等是存储在层次Layer中的,每个月兔怎么画节点可以有多个层次,然后在每个层次中包含一套纹理,法线等。但是,通常我们只会用到一个层次,很多建模软件也只支持一个层次。比如在一个节点类型为eMESH的结点中层次概念如下所示:
mesh -------layer 0{ KFbxLayerElementNormal,行政人事部KFbxLayerElementUV……}
|
|------layer 1{ KFbxLayerElementNormal,KFbxLayerElementUV………}
|
|-- ………………..剥皮鱼
|
|------layer n{ KFbxLayerElementNormal,KFbxLayerElementUV………}
关于层次的常用函数:
/
/求pMesh中包含UV的层次数
pMesh->GetElementUVCount();
//获得第i层中的UV对象
KFbxGeometryElementUV* leUV = pMesh->GetElementUV(i);
每种保存在Layer中的元素(如上面提到的UV)都继承于KFbxLayerElement,比如KFbxLayerElementNormal对应normal数据,KFbxLayerElementUV对应的UV数据,可以通过KFbxLayer中定义的各种Get函数得到,如GetElementNormal()和GetElementUV,返回需要的KFbxLayerElement课堂教学目标,如果为空,则说明当前layer中没有这种元素。下面是关于KFbxLayerElement的类的大概的继承图。
KFbxLayerElement还中包含了两个非常重要的属性EMappingMode和EReferenceMode。
孔雀简笔画
typedef enum
{
eNONE,
eBY_CONTROL_POINT, //对于每一个Control Point有一个贴图坐标
eBY_POLYGON_VERTEX, //对于polygon中每一个顶点有一个贴图坐标
eBY_POLYGON, //对于一个polygon有一个贴图坐标
eBY_EDGE,
eALL_SAME
} EMappingMode;
typedef enum
{
eDIRECT,
二次方程求根公式
eINDEX,