欢迎来到天天文库
浏览记录
ID:33058654
大小:158.72 KB
页数:14页
时间:2019-02-19
《读取fbx文件中的信息》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何将Fbx格式转换成VVO格式Fbx文件格式简介1.1KFbxSdkManage和KFbxSceneFbx文件是Autodesk开发的文件格式,其开发目的就是为了实现Autodesk旗下软件之间的数据交换。Fbx文件格式木身是不公开的,而是通过FBXSDK实现对Fbx文件的读取以及写入。使用FBXSDK时,最先遇到的两个对象就是KFbxSdkManage和KFbxScene。KFbxSdkManage是sdk中的中心类,负责了整个sdk内部状态的管理,很多其他对象创建也依赖于KFbxSdkManage
2、,程序中只需要有一个KFbxSdkManage类的实例即可。KFbxScene如其名所示,代表了一个场景,而这里的场景就是fbx文件中包含的所有信息,fbx文件导入以后,在程序中就是一个KFbxScene对象,所以一个fbx文件只需要一个KFbxScene类的实例。1.2Fbx的数据组织方式Fbx的数据组织方式是scenetree,即场景树。由KFbxScene所声明的对象可以得到该场景树的根节点,根节点包含了一系列子节点KFbxNode,每个KFbxNode又有其自己的子节点,以此往下类推。这样通过递
3、归循环就可以遍历到每一个节点,然后获取该节点的信息。RootNode是该Fbx文件所对应的根节点,由以下语句得到:KFbxNode*pNode=pScene->GetRootNode();//获得根节点图1是一个圆柱体的例子。该圆柱体总共有四个节点,Patch.SkeletonRoot.SkeletonLimbNodel>SkeletonLimbNode2是这四个节点的名称。其中Patch>SkeletonRoot是RootNode的孩子,SkeletonLimbNodel是SkeletonRoot的孩
4、子,SkeletonLimbNode2是SkeletonLimbNodel的孩子。图i1.3Fbx中节点KFbxNode说明1.3.1节点坐标场景树中每个节点都是KFbxNode,KFbxNode类本身包含了坐标变换信息,例如可以用函数EvaluateGlobalTransform(KTimepTimc)获得在pTimc时刻该节点的全球变换矩阵。获得全球变换矩阵后,我们可以得到节点在该时刻的世界坐标系下的平移、旋转和缩放。同理由EvaluateLocalTransform(KTimepTime)获得在p
5、Time时刻该节点的本地变换矩阵,进而获得该时刻本地坐标系下节点的平移、旋转和缩放。1.3.2节点类型一个节点KFbxNode包含其他数据作为KFbxNodeAttribute对象,包含在其内部,这里的其他数据是指mesh,Nurbs,skeleton,camara,light等定义在KFbxNodeAttribute::EAttributeType中的枚举类型。获得一个节点的类型可用以下函数语句来实现:KFbxNodeAttribute::EAttributeTypelAttributeType;lA
6、ttributeType=pNode->GetNodeAttribute()->GetAttributeType();1.3.3节点中层次Layer层次Layer:法线、纹理坐标等是存储在层次Layer中的,每个节点可以有多个层次,然后在每个层次中包含一套纹理,法线等。但是,通常我们只会用到一个层次,很多建模软件也只支持一个层次。比如在一个节点类型为cMESII的结点中层次概念如下所示:meshlayer0{KFbxLayerElementNormal,KFbxLayerElementUV}IIlaye
7、r1{KFbxLayerElementNormal,KFbxLayerElementUV}Ilayern{KFbxLayerElementNormal,KFbxLayerElementUV}关于层次的常用函数:〃求pMesh屮包含UV的层次数pMesh->GetElementUVCount();〃获得第i层中的UV对象KFbxGeometryElementUV*leUV=pMesh->GetElementUV(i);每种保存在Layer中的元素(如上面提到的UV)都继承于KFbxLayerElement
8、,比女口KFbxLayerElementNormal对应normal数据,KFbxLayerElementUV对应的UV数据,可以通过KFbxLayer中定义的各种Get函数得到,如GetElementNormal()^nGetElementUV,返回需要的KFbxLayerElement,如果为空,则说明当前layer中没有这种元素。下面是关于KFbxLayerElement的类的大概的继承图。KFbxLayerElementTempla
此文档下载收益归作者所有