读取Fbx文件中的信息

更新时间:2023-07-29 15:34:26 阅读: 评论:0

如何将Fbx格式转换成VVO格式
一、Fbx文件格式简介
1.1  KFbxSdkManage和KFbxScene
Fbx文件是Autodesk开发的文件格式,其开发目的就是为了实现Autodesk旗下软件之间的数据交换。Fbx文件格式本身是不公开的,而是通过FBX SDK实现对Fbx文件的读取以及写入
使用FBX SDK时,最先遇到的两个对象就是KFbxSdkManageKFbxScene
KFbxSdkManagesdk中的中心类,负责了整个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是一个圆柱体的例子。该圆柱体总共有四个节点,PatchSkeletonRoot
SkeletonLimbNode1SkeletonLimbNode2是这四个节点的名称。其中PatchSkeletonRootRootNode的孩子,SkeletonLimbNode1SkeletonRoot的孩子,SkeletonLimbNode2SkeletonLimbNode1的孩子。
                                  图 1
1.3  Fbx中节点KFbxNode说明
1.3.1 节点坐标
场景树中每个节点都是KFbxNode,KFbxNode类本身包含了坐标变换信息,例如可以用函数骨头汤的营养价值EvaluateGlobalTransform(KTime pTime)获得在pTime时刻该节点的全球变换矩阵。获得全球变换矩阵后,我们可以得到节点在该时刻的世界坐标系下的平移、旋转和缩放。同理由EvaluateLocalTransform(KTime pTime)获得在pTime时刻该节点的本地变换矩阵,进而获得该时刻本地坐标系下节点的平移、旋转和缩放。
1.3.2 节点类型
一个节点KFbxNode包含其他数据作为KFbxNodeAttribute对象,包含在内部,这里的其他数据是指meshNurbsskeletoncamaralight等定义在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还中包含两个非常重要的属性EMappingModeEReferenceMode
孔雀简笔画
    typedef enum
    {
        eNONE,
        eBY_CONTROL_POINT,  //对于每一个Control Point有一个贴图坐标
        eBY_POLYGON_VERTEX, //对于polygon中每一个顶点有一个贴图坐标
        eBY_POLYGON, //对于一个polygon有一个贴图坐标
        eBY_EDGE,
        eALL_SAME
    } EMappingMode;
    typedef enum
    {
        eDIRECT,
二次方程求根公式
        eINDEX,

本文发布于:2023-07-29 15:34:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1122801.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:节点   对象   变换   获得   坐标   文件   时刻   包含
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图