这是Autodesk FBX SDK学习笔记第二篇。下面部分汉字翻译自Autodesk FBX SDK Program。翻译人:有道翻译。

上一篇讲了一些FBX SDK的基本操作。创建FbxManager这些,也写了我们第一个FBX SDK 的样例。

今天是FBX SDK指南的第二篇。创建一个FBX文件转换器,有什么用?

把FBX转换成DAE、Obj这些格式啦!

把FBX 二进制转换成文本格式啦。

这一篇的知识点:

1、FbxManager的创建与销毁

2、FbxImporter的创建与使用

3、FbxExporter的使用

4、Fbx SDK支持的文件格式

Autodesk FBX SDK document本篇地址:

  1. http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html

官方样例执行效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHV1dHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

不知道是MFC还是.Net 。这两个我一个都不会,所以还是写个控制台的……

  1. #include<fbxsdk.h>
  2.  
  3. #pragma comment(lib,"libfbxsdk.lib")
  4.  
  5. FbxManager *g_pFbxManager=NULL;
  6.  
  7. /*** 初始化FbxSDK ***/
  8. bool InitializeFbxSDK()
  9. {
  10. bool bRet=false;
  11.  
  12. do
  13. {
  14. //创建FbxManager
  15. g_pFbxManager=FbxManager::Create();
  16.  
  17. //创建FbxIOSetting
  18. FbxIOSettings *pFbxIOSettings=FbxIOSettings::Create(g_pFbxManager,IOSROOT);
  19.  
  20. //绑定关系
  21. g_pFbxManager->SetIOSettings(pFbxIOSettings);
  22.  
  23. bRet=true;
  24.  
  25. } while (0);
  26. return bRet;
  27. }
  28.  
  29. /*** 获取Fbx SDK 支持读入的格式 ***/
  30. void GetFileCanImport()
  31. {
  32. int count= g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatCount();
  33.  
  34. printf("支持导入下面 %d 种文件格式:\n",count);
  35.  
  36. FbxString s;
  37. int i=0;
  38. for (int i = 0; i <count; i++)
  39. {
  40. s+=g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatDescription(i); //获取描写叙述
  41. //s+=g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatExtension(i); //获取文件后缀
  42. s="%d : "+s+" \n";
  43. printf(s.Buffer(),i);
  44. s.Clear();
  45. }
  46. }
  47.  
  48. /*** 获取Fbx SDK 可以导出的格式 ***/
  49. void GetFileCanExport()
  50. {
  51. int count=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatCount();
  52. printf("支持导出下面 %d 种文件格式:\n",count);
  53.  
  54. FbxString s;
  55. int i=0;
  56. for (int i = 0; i < count; i++)
  57. {
  58. s+=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatDescription(i); //获取描写叙述
  59. //s+=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatExtension(i);//获取文件后缀
  60. s="%d : "+s+" \n";
  61. printf(s.Buffer(),i);
  62. s.Clear();
  63. }
  64. }
  65.  
  66. /*** 读入一个Fbx文件到FbxScene ***/
  67. bool ImportFbxModel(FbxScene* scene,const char* importfilename)
  68. {
  69. int fileVerMajorNum,fileVerMinorNum,fileVerRevision; //文件大版本号号、小版本号号,修正版本号号
  70. int sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision; //FBX SDK版本号号
  71. int animStackCount; //动画的数量
  72. bool bRet=false;
  73. char password[1024]; //password。文件可能加密了须要输入password
  74.  
  75. //获取FBX SDK的版本号号
  76. FbxManager::GetFileFormatVersion(sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
  77.  
  78. //创建FbxImporter
  79. FbxImporter *pFbxImporter=FbxImporter::Create(g_pFbxManager,importfilename);
  80.  
  81. //初始化FbxImporter
  82. const bool importret= pFbxImporter->Initialize(importfilename,-1,g_pFbxManager->GetIOSettings());
  83.  
  84. //获取Fbx文件的版本号号
  85. pFbxImporter->GetFileVersion(fileVerMajorNum,fileVerMinorNum,fileVerRevision);
  86.  
  87. if(!importret) //导入出错
  88. {
  89. FbxString errorStr=pFbxImporter->GetStatus().GetErrorString();
  90. printf("\nFbxImporter初始化失败,错误原因:%s\n",errorStr.Buffer());
  91.  
  92. if(pFbxImporter->GetStatus().GetCode() == FbxStatus::eInvalidFileVersion) //假设是文件版本号不对
  93. {
  94. printf("\n FBX SDK 版本号:%d.%d.%d\n",sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
  95. printf("\nFBX 文件版本号 :%d.%d.%d\n",fileVerMajorNum,fileVerMinorNum,fileVerRevision);
  96. }
  97. return false;
  98. }
  99.  
  100. printf("\n ***** 导入文件成功****** \n");
  101.  
  102. printf("\n FBX SDK 版本号:%d.%d.%d \n",sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
  103.  
  104. if(pFbxImporter->IsFBX() ) //假设导入的文件是FBX格式
  105. {
  106. printf("\n FBX 文件版本号 :%d.%d.%d \n",fileVerMajorNum,fileVerMinorNum,fileVerRevision);
  107.  
  108. //在FBX文件里,一个Scene中可能有一个或多个 "animation stack"。一个"animation stack"里面存放一个动画数据,假设想获取"animation stack"的信息。不必要加载所有的Scene
  109.  
  110. printf("\n Animation stack 信息:\n");
  111. animStackCount=pFbxImporter->GetAnimStackCount();
  112.  
  113. printf("数量:%d\n ",animStackCount);
  114. printf("名称:%s\n ",pFbxImporter->GetActiveAnimStackName());
  115.  
  116. for (int i = 0; i < animStackCount; i++)
  117. {
  118. FbxTakeInfo *pFbxTakeInfo=pFbxImporter->GetTakeInfo(i);
  119. printf("Animation Stack %d\n",i);
  120. printf(" Name: %s\n",pFbxTakeInfo->mName.Buffer());
  121. printf(" Description: %s\n",pFbxTakeInfo->mDescription.Buffer());
  122.  
  123. printf(" Import Name: %s\n",pFbxTakeInfo->mImportName.Buffer()); //导入进来的名字
  124. printf(" Import State: %s\n",pFbxTakeInfo->mSelect ?"true":"false");
  125. }
  126.  
  127. //导入内容设置,默认导入所有内容
  128. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_MATERIAL,true);
  129. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_TEXTURE,true);
  130. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_LINK,true);
  131. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_SHAPE,true);
  132. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_GOBO,true);
  133. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_ANIMATION,true);
  134. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_GLOBAL_SETTINGS,true);
  135. }
  136.  
  137. //假设导入的文件不是FBX格式,那就没有上面的逻辑
  138.  
  139. //导入Fbx到场景
  140. bRet = pFbxImporter->Import(scene);
  141.  
  142. //假设文件导入出错,而且是返回错误Code是password错误
  143. if(bRet==false && pFbxImporter->GetStatus().GetCode()==FbxStatus::ePasswordError)
  144. {
  145. printf("请输入password:\n");
  146. password[0]='\0';
  147. FBXSDK_CRT_SECURE_NO_WARNING_BEGIN//这个宏是用来关闭4996警告。相似scanf strcpy strcat在vs下都会有警告
  148. scanf("%s",password);
  149. FBXSDK_CRT_SECURE_NO_WARNING_END
  150. FbxString passwdStr(password);
  151.  
  152. g_pFbxManager->GetIOSettings()->SetStringProp(IMP_FBX_PASSWORD,passwdStr);//对FbxIOSetting设置StringProp,即字符串属性,Prop这里指property
  153. g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_PASSWORD_ENABLE,true);//设置Bool属性,是否使用password
  154.  
  155. bRet=pFbxImporter->Import(scene); //输入password后又一次Import
  156. if(bRet==false && pFbxImporter->GetStatus().GetCode()==FbxStatus::ePasswordError)
  157. {
  158. printf("文件导入错误。password错误!
  159.  
  160. ");
  161. }
  162.  
  163. }
  164. pFbxImporter->Destroy();
  165. return bRet;
  166. }
  167.  
  168. /*** 导出FbxScene到模型文件 ***/
  169. bool ExportFbxSceneToModel(FbxScene* scene,const char* exportfilename,int exportformat,bool pexportmedia)
  170. {
  171. bool bRet=false;
  172.  
  173. //创建FbxExporter
  174. FbxExporter *pFbxExport = FbxExporter::Create(g_pFbxManager,"");
  175.  
  176. if(exportformat<0 || exportformat>=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatCount())
  177. {
  178. //假设选择导出的文件格式不支持
  179. printf(" 不支持导出该种格式!! \n");
  180. return false;
  181.  
  182. exportformat=g_pFbxManager->GetIOPluginRegistry()->GetNativeWriterFormat();
  183. printf(" 尝试默认的格式(FBX)导出:%d ",exportformat);
  184.  
  185. if(!pexportmedia) //假设不导出多媒体
  186. {
  187. int formatcount=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatCount();
  188.  
  189. //尝试导出FBX的 ascii文件,即能看到内容可以的
  190. for (int i = 0; i < formatcount; i++)
  191. {
  192. if(g_pFbxManager->GetIOPluginRegistry()->WriterIsFBX(i))
  193. {
  194. FbxString desStr=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatDescription(i);
  195. if(desStr.Find("ascii")>=0)
  196. {
  197. exportformat=i;
  198. break;
  199. }
  200. }
  201. }
  202.  
  203. }
  204.  
  205. }
  206.  
  207. //选择导出格式正确的话就没有上面的逻辑
  208. if(!pFbxExport->Initialize(exportfilename,-1,g_pFbxManager->GetIOSettings()))
  209. {
  210. printf("FbxExport->Initialize Faild \n");
  211. printf("FbxExport 初始化失败原因:%s",pFbxExport->GetStatus().GetErrorString());
  212. return false;
  213. }
  214.  
  215. if(g_pFbxManager->GetIOPluginRegistry()->WriterIsFBX(exportformat))
  216. {
  217. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_MATERIAL,true);
  218. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_TEXTURE,true);
  219. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_EMBEDDED,pexportmedia);
  220. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_SHAPE,true);
  221. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_GOBO,true);
  222. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_ANIMATION,true);
  223. g_pFbxManager->GetIOSettings()->SetBoolProp(EXP_FBX_GLOBAL_SETTINGS,true);
  224. }
  225.  
  226. bRet=pFbxExport->Export(scene);
  227.  
  228. pFbxExport->Destroy();
  229.  
  230. return bRet;
  231. }
  232.  
  233. /*** 转换一个模型文件 ***/
  234. void ConvertModelFile(const char *importfilename,const char *exportfilename,int writefileformat)
  235. {
  236. printf("导入文件路径:%s\n 导出文件路径:%s \n 导出文件格式:%d\n",importfilename,exportfilename,writefileformat);
  237.  
  238. //创建FbxScene,名字就叫做宝箱吧 Baoxiang
  239. FbxScene *pFbxScene=FbxScene::Create(g_pFbxManager,"Baoxiang");
  240.  
  241. printf("\n ****** 转换開始 ****** \n");
  242.  
  243. bool b=ImportFbxModel(pFbxScene,importfilename);
  244.  
  245. if(b)
  246. {
  247. printf("\n** 模型文件加载成功 ****\n");
  248. }
  249. else
  250. {
  251. printf("\n** 模型文件加载失败 ****\n");
  252. pFbxScene->Destroy();
  253. return;
  254. }
  255.  
  256. printf("\n** 開始导出 ****\n");
  257.  
  258. b=ExportFbxSceneToModel(pFbxScene,exportfilename,writefileformat,false);
  259.  
  260. if(b)
  261. {
  262. printf("\n** 导出模型文件成功 ****\n");
  263. }
  264. else
  265. {
  266. printf("\n** 导出模型文件失败 ****\n");
  267. pFbxScene->Destroy();
  268. return;
  269. }
  270.  
  271. }
  272.  
  273. int main(int argc,char **argv)
  274. {
  275.  
  276. InitializeFbxSDK();
  277.  
  278. GetFileCanImport();
  279.  
  280. GetFileCanExport();
  281.  
  282. char importfilename[1024];
  283. int exportformat=0;
  284. char exportfilename[1024];
  285.  
  286. printf("\n请输入导入文件路径:");
  287. scanf("%s",importfilename);
  288.  
  289. printf("\n请输入导出格式:");
  290. scanf("%d",&exportformat);
  291.  
  292. printf("\n请输入导出文件路径:");
  293. scanf("%s",exportfilename);
  294.  
  295. ConvertModelFile(importfilename,exportfilename,exportformat);
  296.  
  297. system("pause");
  298.  
  299. return 0;
  300.  
  301. }

项目打包下载:

  1. http://code.taobao.org/svn/xgameengine/trunk/OtherProject/FbxDemo

Autodesk FBX SDK Program 中文 (二)的更多相关文章

  1. Autodesk FBX SDK Program 中文 (一)

    这是我的FBX SDK学习笔记.如文有错误.麻烦各位大大指出 为什么要使用FBX SDK? 由于3D建模软件都被AutoDesk收购了.FBX能够在各个建模软件之间互相导入导出,在非常多游戏引擎中也用 ...

  2. autodesk fbx sdk sample里面的工程无法调试解决方法

    1.项目属性->常规中的目标文件名改为1 2.链接器->调试中的生成程序数据库文件改成:$(OutDir)1.pdb 3.连接器->常规中的输出文件改成:$(OutDir)1.exe ...

  3. FBX SDK 从2012.1 到 2013.3 变化

    ==================================================== ============================== 译文               ...

  4. 基于FBX SDK的FBX模型解析与加载 -(四)

    8. 骨骼蒙皮动画 骨骼蒙皮动画是当前游戏引擎中最常用的一种动画方式,关于其基本原理网络上的资料较多,关于到涉及的其它较复杂操作,如插值.融合等在这里也就先不再讨论了,而且其实现方式也与具体引擎的动作 ...

  5. mingw fbx sdk /浮点数精度

    接下来要做一个linux下的程序了. 下载linux version     fbx sdk tar zxvf ...gz 按照安装说明 提升权限并没什么用 还是,cannot execute bin ...

  6. 基于FBX SDK的FBX模型解析与加载 -(一)

    http://blog.csdn.net/bugrunner/article/details/7210511 1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由A ...

  7. Windows Mobile 6.0 SDK和中文模拟器下载

    [转] Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器 2010年12月06日 星期一 07:48 转载自 zhangyanle86 终于编 ...

  8. FBX SDK在vs 2010下面的配置

    1.下载FBS SDK.地址.因为我是vs2010,所以我下载的是FBX SDK 2016.1.2 VS2010.如果没有了,你可以找博主直接要,QQ1240957820. 2.下载下来的是一个exe ...

  9. js生成中文二维码

    http://www.cnblogs.com/xcsn/archive/2013/08/14/3258035.html http://www.jb51.net/article/64928.htm 使用 ...

随机推荐

  1. The usage of V$PGA_TARGET_ADVICE

    Oracle 10g 给出了一系列的自动优化的建议,告诉我们PGA分配多大能给系统带来最大的性能?V$PGA_TARGET_ADVICE视图给出了很好的“预测”! 看一下这个视图能给我们带来什么样的信 ...

  2. C#之自己定义的implicit和explicit转换

    在类型转换时常会遇到隐式转换和显式转换.那我们自己定义的类型要怎样去定义隐式转换和显式转换?我们来看一段代码 public class Rational { private Int32 _inner_ ...

  3. spring-bean属性配置解析

    autowire属性值有 byName 根据Bean定义时的“id"属性上指定的别名与Setter名称是否一致进行自动装配 byType 根据PoJo的setXXX()方法所接受的类型判断b ...

  4. OpenStack25

    OpenStack(25) API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组 ...

  5. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. hadoop每个家庭成员

    本文没有提到的原则.谈论hadoop项目周边,它的作用. hadoop这个词已经流行了很多年.大数据的记载会认为hadoop,然后hadoop的作用是什么呢? 官方定义:hadoop是一个开发和执行处 ...

  7. PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

    PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.Pos ...

  8. 那些年踩过的坑之:first-child伪类选择器

    原文:那些年踩过的坑之:first-child伪类选择器 :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w3school 嗯,乍一看好像说的不是很明白,因此这个选择 ...

  9. SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试

    SynchronousQueue.LinkedBlockingQueue.ArrayBlockingQueue性能测试 JDK6对SynchronousQueue做了性能优化,避免对竞争资源加锁,所以 ...

  10. NEU月赛Segment Balls(线段树)

    问题 D: Segment Balls 时间限制: 1 Sec  内存限制: 128 MB 提交: 253  解决: 37 题目描述 Small K has recently earn money i ...