这是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本篇地址:
http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html
官方样例执行效果:
不知道是MFC还是.Net 。这两个我一个都不会,所以还是写个控制台的……
#include<fbxsdk.h>
#pragma comment(lib,"libfbxsdk.lib")
FbxManager *g_pFbxManager=NULL;
/*** 初始化FbxSDK ***/
bool InitializeFbxSDK()
{
bool bRet=false;
do
{
//创建FbxManager
g_pFbxManager=FbxManager::Create();
//创建FbxIOSetting
FbxIOSettings *pFbxIOSettings=FbxIOSettings::Create(g_pFbxManager,IOSROOT);
//绑定关系
g_pFbxManager->SetIOSettings(pFbxIOSettings);
bRet=true;
} while (0);
return bRet;
}
/*** 获取Fbx SDK 支持读入的格式 ***/
void GetFileCanImport()
{
int count= g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatCount();
printf("支持导入下面 %d 种文件格式:
",count);
FbxString s;
int i=0;
for (int i = 0; i <count; i++)
{
s+=g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatDescription(i); //获取描写叙述
//s+=g_pFbxManager->GetIOPluginRegistry()->GetReaderFormatExtension(i); //获取文件后缀
s="%d : "+s+"
";
printf(s.Buffer(),i);
s.Clear();
}
}
/*** 获取Fbx SDK 可以导出的格式 ***/
void GetFileCanExport()
{
int count=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatCount();
printf("支持导出下面 %d 种文件格式:
",count);
FbxString s;
int i=0;
for (int i = 0; i < count; i++)
{
s+=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatDescription(i); //获取描写叙述
//s+=g_pFbxManager->GetIOPluginRegistry()->GetWriterFormatExtension(i);//获取文件后缀
s="%d : "+s+"
";
printf(s.Buffer(),i);
s.Clear();
}
}
/*** 读入一个Fbx文件到FbxScene ***/
bool ImportFbxModel(FbxScene* scene,const char* importfilename)
{
int fileVerMajorNum,fileVerMinorNum,fileVerRevision; //文件大版本号号、小版本号号,修正版本号号
int sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision; //FBX SDK版本号号
int animStackCount; //动画的数量
bool bRet=false;
char password[1024]; //password。文件可能加密了须要输入password
//获取FBX SDK的版本号号
FbxManager::GetFileFormatVersion(sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
//创建FbxImporter
FbxImporter *pFbxImporter=FbxImporter::Create(g_pFbxManager,importfilename);
//初始化FbxImporter
const bool importret= pFbxImporter->Initialize(importfilename,-1,g_pFbxManager->GetIOSettings());
//获取Fbx文件的版本号号
pFbxImporter->GetFileVersion(fileVerMajorNum,fileVerMinorNum,fileVerRevision);
if(!importret) //导入出错
{
FbxString errorStr=pFbxImporter->GetStatus().GetErrorString();
printf("
FbxImporter初始化失败,错误原因:%s
",errorStr.Buffer());
if(pFbxImporter->GetStatus().GetCode() == FbxStatus::eInvalidFileVersion) //假设是文件版本号不对
{
printf("
FBX SDK 版本号:%d.%d.%d
",sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
printf("
FBX 文件版本号 :%d.%d.%d
",fileVerMajorNum,fileVerMinorNum,fileVerRevision);
}
return false;
}
printf("
***** 导入文件成功******
");
printf("
FBX SDK 版本号:%d.%d.%d
",sdkVerMajorNum,sdkVerMinorNum,sdkVerRevision);
if(pFbxImporter->IsFBX() ) //假设导入的文件是FBX格式
{
printf("
FBX 文件版本号 :%d.%d.%d
",fileVerMajorNum,fileVerMinorNum,fileVerRevision);
//在FBX文件里,一个Scene中可能有一个或多个 "animation stack"。一个"animation stack"里面存放一个动画数据,假设想获取"animation stack"的信息。不必要加载所有的Scene
printf("
Animation stack 信息:
");
animStackCount=pFbxImporter->GetAnimStackCount();
printf("数量:%d
",animStackCount);
printf("名称:%s
",pFbxImporter->GetActiveAnimStackName());
for (int i = 0; i < animStackCount; i++)
{
FbxTakeInfo *pFbxTakeInfo=pFbxImporter->GetTakeInfo(i);
printf("Animation Stack %d
",i);
printf(" Name: %s
",pFbxTakeInfo->mName.Buffer());
printf(" Description: %s
",pFbxTakeInfo->mDescription.Buffer());
printf(" Import Name: %s
",pFbxTakeInfo->mImportName.Buffer()); //导入进来的名字
printf(" Import State: %s
",pFbxTakeInfo->mSelect ?"true":"false");
}
//导入内容设置,默认导入所有内容
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_MATERIAL,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_TEXTURE,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_LINK,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_SHAPE,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_GOBO,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_ANIMATION,true);
g_pFbxManager->GetIOSettings()->SetBoolProp(IMP_FBX_GLOBAL_SETTINGS,true);
}
//假设导入的文件不是FBX格式,那就没有上面的逻辑
//导入Fbx到场景
bRet = pFbxImporter->Import(scene);
//假设文件导入出错,而且是返回错误Code是password错误
if(bRet==false && pFbxImporter->GetStatus().GetCode()==FbxStatus::ePasswordError)
{
printf("请输入password:
");
password[0]='