DirectX简单的FBX文件加载(网格MESH)

FBX文件加载需要用到FBX SDK,有关配置可以自己上网或者查看官方文档进行设置(参见)
http://help.autodesk.com/view/FBX/2019/ENU/添加链接描述

这里只关注FBX文件中MESH的读取(也只是读取每个顶点的坐标而已,不进行坐标变换),十分的简单。由于FBX文件是按照节点组成的树形结构,所以这里的读取方法只能读取深度遍历下第一个mesh类型的节点。不过没有关系,可以用Blender把FBX文件的结构进行重塑(比如将mesh合并,调整左右手坐标系等),关键是原理。。。。

1.FBX初始化
先进行必要的FBX初始化然后导入
注意1:FBX不支持中文路径,Blender建模的时候节点命名也不要是中文,不然会乱码。
注意2:FBX网格基本图元有很多,四边形,三角形,五边形……,但是DirectX要三角形,所以要三角化。创建一个FbxGeometryConverter对象对整个场景进行三角化

FbxManager* m_pSdkManager;
FbxIOSettings* m_pios;
FbxImporter* m_pImporter;
m_pSdkManager=FbxManager::Create();
m_pios=FbxIOSettings::Create(m_pSdkManager,IOSROOT);
m_pSdkManager->SetIOSettings(m_pios);
m_pImporter=FbxImporter::Create(m_pSdkManager,"");
//开始导入我们需要加载的文件,这里的_filePath就是文件路径,注意FBX不支持中文路径
bool ImportStatus=m_pImporter->Initialize(_filePath,-1,m_pSdkManager->GetIOSettings());
if(!ImportStatus) return ImportStatus;
//获得根节点
FbxScene* pScene=FbxScene::Create(m_pSdkManager,"myScene");
m_pImporter->Import(pScene);
FbxNode* pRootNode=pScene->GetRootNode();
//三角化所有数据
FbxGeometryConverter converter(m_pSdkManager);
converter.Triangulate(pScene,true);
//遍历节点
ProcessNode(pRootNode);

2.ProcessNode
该函数实现了节点的遍历,传入根节点即可
FbxNodeAttribute::EType可以查看文档,发现除了FbxMesh我们需要其他暂时用不上

void FBX::ProcessNode(FbxNode* _pFbxNode){FbxNodeAttribute::EType attributeType;if(_pFbxNode->GetNodeAttribute()!=NULL){attributeType=_pFbxNode->GetNodeAttribute()->GetAttributeType();switch(attributeType){case FbxNodeAttribute::EType::eMesh://处理网格数据ProcessMesh(_pFbxNode);break;}}for(int i=0;i<=_pFbxNode->GetChildCount()-1;++i)ProcessNode(_pFbxNode->GetChild(i));
}

3.ProcessMesh
要点1:从FbxMesh中获得顶点数组
要点2:从FbxVector4中得到我们需要的x,y,z
要点3:得到索引数组int ctrlPointIndex=pMesh->GetPolygonVertex(i,j)
这里的含义是从第i个三角形中获得第j个顶点的索引

void FBX::ProcessMesh(FbxNode* _pFbxNode){if(flag!=true) return; //这里的flag是当前是否遍历到过一个MESH,如果有就不遍历了,因为懒flag=false;//遍历过了,调整flagFbxMesh* pMesh=_pFbxNode->GetMesh();if(!pMesh) return;FBX_VERTEX* pVertexArray=NULL;//FBX_VERTEX是我定义的顶点格式,只有x,y,z坐标//顶点的存储int ctrlcount=pMesh->GetControlPointsCount();m_VertexCount=ctrlcount;//就是顶点个数pVertexArray=new FBX_VERTEX[ctrlcount];D3DXVECTOR3 vertex;FbxVector4* pCtrlPoint=pMesh->GetControlPoints();//这里的控制点数组pCtrlPoint其实就是DirectX里顶点的意思,就是顶点数组for(unsigned int i=0;i<=ctrlcount-1;i++){vertex.x=pCtrlPoint[i].mData[0];//这里得到控制点(顶点)的x,y,zvertex.y=pCtrlPoint[i].mData[1];//这段数据的获得找了好多资料才知道的vertex.z=pCtrlPoint[i].mData[2];//FBX的样例真心看不懂//接下来存入我们的顶点数组中pVertexArray[i]=FBX_VERTEX(vertex);}//创建顶点缓存HRESULT hr=m_pd3dDevice->CreateVertexBuffer(ctrlcount*sizeof(FBX_VERTEX),0,FVF,D3DPOOL_MANAGED,&m_pVertexBuffer,0);if(FAILED(hr)) exit(1);//存入顶点缓存中FBX_VERTEX* lVertexArray;m_pVertexBuffer->Lock(0,0,(void**)&lVertexArray,0);memcpy(lVertexArray,pVertexArray,ctrlcount*sizeof(FBX_VERTEX));m_pVertexBuffer->Unlock();delete [] pVertexArray;//索引的存储,故技重施即可,但有一点需要注意int* pIndexArray=NULL;unsigned int triangleCount=pMesh->GetPolygonCount();//多边形图元的数量//因为已经三角化过,所以一定是三角形了m_TriangleCount=triangleCount;//三角形面片的数量pIndexArray=new int[triangleCount*3];//三角形面皮的数量*3就是索引的数量unsigned int index_count=0;for(unsigned int i=0;i<=triangleCount-1;i++){//这里一定是三角形了也可判断下/*if(pMesh->GetPolygonSize(i)!=3){return;}*/for(unsigned int j=0;j<=pMesh->GetPolygonSize(i)-1;j++){int ctrlPointIndex=pMesh->GetPolygonVertex(i,j);//这里要存入索引数组中pIndexArray[index_count]=ctrlPointIndex;index_count++;}}//创建索引数组hr=m_pd3dDevice->CreateIndexBuffer((index_count+1)*sizeof(int),0,D3DFMT_INDEX32,D3DPOOL_MANAGED,&m_pIndexBuffer,0);if(FAILED(hr)) exit(1);int* lIndexArray;m_pIndexBuffer->Lock(0,0,(void**)&lIndexArray,0);memcpy(lIndexArray,pIndexArray,(index_count+1)*sizeof(int));m_pIndexBuffer->Unlock();delete [] pIndexArray;}

4.Draw
开始绘制

void FBX::Draw(D3DXMATRIX _mat)
{//_mat暂时不知道干什么,但是有用,可以以后指定模型的位置//m_pd3dDevice->BeginScene();m_pd3dDevice->SetStreamSource(0,m_pVertexBuffer,0,sizeof(FBX_VERTEX));m_pd3dDevice->SetIndices(m_pIndexBuffer);m_pd3dDevice->SetFVF(FVF);m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,m_VertexCount,0,m_TriangleCount);//m_pd3dDevice->EndScene();
}

这里只展示了部分代码,我将这些东西写了一个FBX类,用来导入FBX文件
实验怎么导入FBX网格文件,以龙书的Camera例程为主体,可以遨游观看FBX文件
效果图:
1.FBX SDK中的humanoid.fbx,这里倒了是因为这个fbx用右手坐标系,而DirectX用左手。因为可以用Blender调整这里也不管了。话说为什么高考数学要用右手坐标系做立体几何???DirectX习惯了表示只会左手坐标系,到头来答案错了一分莫得。。。。

2.自己用Blender做的一个简单模型(还带有动画,等以后解析完了FBX的动画在看看)

DirectX简单的FBX文件加载(网格MESH)相关推荐

  1. Html监听Fbx文件加载,FBX格式mesh解析与加载(一)

    FBX格式mesh解析与加载(一) FBX格式mesh解析与加载(一) ** 理解FBX格式中Mesh数据结构** fbx文件是现在许多建模动画软件和游戏引擎之间共用的模型文件格式.fbx文件分为两种 ...

  2. Html监听Fbx文件加载,Three.js 导入fbx

    其实可以先看看官方案例 你想要的东西 官方里面都有,就看你找不找得到了.... 话不多说 我们先看看这个例子吧 three.js webgl - FBX loader body { font-fami ...

  3. ajax如何请求json文件,简单的ajax请求加载外部json文件

    我在学习ajax ....我试图从json文件发出一个基本请求,它与我的index.html位于同一个文件夹中,但由于某种原因它说未定义:(我可以看到错误是可变的人,但我不能赶上为什么它未定义.... ...

  4. Three.js(十四)—— 模型文件加载

    文章目录 14.Three.js 加载外部模型文件 14.1 Three.js 数据结构.导入导出 Threejs导出模型信息 自定义模型加载器文件 加载Three.js导出的模型数据 14.2 加载 ...

  5. Cocos2d之Texture2D类详解之将文件加载成Texture2D对象

    一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...

  6. DjangoHTML页面加载和静态文件加载

    一.加载HTML页面 1.找到HTM L文件加载目录的位置 settings.py里 这句话的意思是 2.创建HTML目录 3.在settings进行配置 在第57行,找到'DIRS'=[] 将其修改 ...

  7. extjs 文件加载、解析流程

    extjs版本:4.2.1 在html中添加应用的启动脚本,如下: <script src="app.js"></script> 2. 用户访问html的时 ...

  8. linux中人脸识别不了,虹软人脸识别在 linux中so文件加载不到的问题

    其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkError ...

  9. java class文件 代码_java_基础——用代码编译.java文件+加载class文件

    java_基础--用代码编译.java文件+加载class文件 java_基础--用代码编译.java文件+加载class文件 [简单编译的流程] package com.zjm.www.test; ...

  10. 虹软人脸识别在 linux中so文件加载不到的问题

    其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误:    .lang.UnsatisfiedLinkEr ...

最新文章

  1. WinCE5.0移动平台开发笔记(c#中使用多线程访问winform中控件的若干问题(zt))
  2. 高校开学需要重新分配宿舍!国家卫健委和教育部发布重要通知
  3. IBMX60笔记本装LINUX,《如何安装Storage Manager管理软件客户端并调IBM DS系列存储.doc...
  4. 数据中心液体冷却方案正在兴起的五大原因
  5. python使用tomorrow实现多线程
  6. 第二阶段冲刺10天 第五天
  7. 【LeetCode笔记】263. 丑数(Java、迭代)
  8. 微擎后端/知识付费阅读店铺小程序 V5.1.0 全套源码
  9. 进击的程序媛:从 Google 第一位程序媛到硅谷女王进化史
  10. 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
  11. R语言作图之ggplot2作图2
  12. Retrofit源码解析之请求流程概述
  13. android 音频文件下载
  14. nRF51822 官方 Blinky 工程(多彩 LED)
  15. 算法分析与设计 作业1
  16. Linux使用crond定时任务详解,定期同步服务器时间。
  17. 用树莓派做电视盒子,安装Android TV系统
  18. 重启服务器上的MYSQL
  19. anki server 错误与解决
  20. 死亡搁浅系统服务器,《死亡搁浅》车辆获取及制造方法

热门文章

  1. towe/ jira / tapd / 禅道 协作平台对比
  2. 【Docker】 for Mac 配置镜像加速器,加快镜像下载速度
  3. python实现最长公共子串
  4. FireEye 网络攻击危害红队安全工具
  5. JAVA-消息队列及分布式消息队列原理
  6. 决策树分析例题经典案例_分析模型案例解析:决策树分析法
  7. 漫画C语言 做个聊天软件你不懂也得懂
  8. java实现中文语音朗读
  9. 计算机考研408每日一题 day158
  10. 【牛客网刷题】(第二弹)中等难度题型来了.这些题你都会做吗?