DirectX简单的FBX文件加载(网格MESH)
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)相关推荐
- Html监听Fbx文件加载,FBX格式mesh解析与加载(一)
FBX格式mesh解析与加载(一) FBX格式mesh解析与加载(一) ** 理解FBX格式中Mesh数据结构** fbx文件是现在许多建模动画软件和游戏引擎之间共用的模型文件格式.fbx文件分为两种 ...
- Html监听Fbx文件加载,Three.js 导入fbx
其实可以先看看官方案例 你想要的东西 官方里面都有,就看你找不找得到了.... 话不多说 我们先看看这个例子吧 three.js webgl - FBX loader body { font-fami ...
- ajax如何请求json文件,简单的ajax请求加载外部json文件
我在学习ajax ....我试图从json文件发出一个基本请求,它与我的index.html位于同一个文件夹中,但由于某种原因它说未定义:(我可以看到错误是可变的人,但我不能赶上为什么它未定义.... ...
- Three.js(十四)—— 模型文件加载
文章目录 14.Three.js 加载外部模型文件 14.1 Three.js 数据结构.导入导出 Threejs导出模型信息 自定义模型加载器文件 加载Three.js导出的模型数据 14.2 加载 ...
- Cocos2d之Texture2D类详解之将文件加载成Texture2D对象
一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...
- DjangoHTML页面加载和静态文件加载
一.加载HTML页面 1.找到HTM L文件加载目录的位置 settings.py里 这句话的意思是 2.创建HTML目录 3.在settings进行配置 在第57行,找到'DIRS'=[] 将其修改 ...
- extjs 文件加载、解析流程
extjs版本:4.2.1 在html中添加应用的启动脚本,如下: <script src="app.js"></script> 2. 用户访问html的时 ...
- linux中人脸识别不了,虹软人脸识别在 linux中so文件加载不到的问题
其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkError ...
- java class文件 代码_java_基础——用代码编译.java文件+加载class文件
java_基础--用代码编译.java文件+加载class文件 java_基础--用代码编译.java文件+加载class文件 [简单编译的流程] package com.zjm.www.test; ...
- 虹软人脸识别在 linux中so文件加载不到的问题
其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkEr ...
最新文章
- WinCE5.0移动平台开发笔记(c#中使用多线程访问winform中控件的若干问题(zt))
- 高校开学需要重新分配宿舍!国家卫健委和教育部发布重要通知
- IBMX60笔记本装LINUX,《如何安装Storage Manager管理软件客户端并调IBM DS系列存储.doc...
- 数据中心液体冷却方案正在兴起的五大原因
- python使用tomorrow实现多线程
- 第二阶段冲刺10天 第五天
- 【LeetCode笔记】263. 丑数(Java、迭代)
- 微擎后端/知识付费阅读店铺小程序 V5.1.0 全套源码
- 进击的程序媛:从 Google 第一位程序媛到硅谷女王进化史
- 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
- R语言作图之ggplot2作图2
- Retrofit源码解析之请求流程概述
- android 音频文件下载
- nRF51822 官方 Blinky 工程(多彩 LED)
- 算法分析与设计 作业1
- Linux使用crond定时任务详解,定期同步服务器时间。
- 用树莓派做电视盒子,安装Android TV系统
- 重启服务器上的MYSQL
- anki server 错误与解决
- 死亡搁浅系统服务器,《死亡搁浅》车辆获取及制造方法