#include #include #include #include #include // FBXファイルインポート用 #include #include #include void Import(KFbxSdkManager* pSdkManager, KFbxScene* pScene, const char* file); int main(int argc, char**argv) { // ライブラリが日本語対応してない模様 // インポートファイルディレクトリは日本語ディレクトリを含むと読めないorz // setlocale(LC_ALL, "jpn"); KFbxSdkManager *pSdkManager = NULL; KFbxScene *pScene = NULL; pSdkManager = KFbxSdkManager::Create(); pScene = KFbxScene::Create(pSdkManager, ""); if(!pSdkManager) { puts("FBX SDK 2009.1が正常にインストールされていない可能性があります"); _getch(); exit(-1); } if(!pScene) { puts("シーンの作成に失敗しました"); _getch(); exit(-1); } Import(pSdkManager, pScene, "C:\\FBXtoX\\humanoid.fbx"); puts("何かキーを押してください"); pSdkManager->Destroy(); pSdkManager = NULL; _getch(); return 0; } void Import(KFbxSdkManager* pSdkManager, KFbxScene* pScene, const char* file) { int iFileFormat = -1; int iFileMajor, iFileMinor, iFileRevision; int iSdkMajor, iSdkMinor, iSdkRevision; int i, iTakeCount; bool bStatus; // FBXってパスワードかかるの? char Password[1024]; // バージョンがあがったらこの関数もあるかどうかわからないけど・・・ KFbxIO::GetCurrentVersion(iSdkMajor, iSdkMinor, iSdkRevision); // インポータ作成 KFbxImporter* pImporter = KFbxImporter::Create(pSdkManager, ""); // インポートする情報を設定するオプション KFbxStreamOptionsFbxReader* lImportOptions=KFbxStreamOptionsFbxReader::Create(pSdkManager, ""); if(!pSdkManager->GetIOPluginRegistry()->DetectFileFormat(file, iFileFormat)) { // ファイルフォーマット取得に失敗した場合 iFileFormat = pSdkManager->GetIOPluginRegistry()->GetNativeReaderFormat(); } // インポータにファイルフォーマットを設定 pImporter->SetFileFormat(iFileFormat); const bool bImportStatus = pImporter->Initialize(file); // ファイルバージョンを取得 pImporter->GetFileVersion(iFileMajor, iFileMinor, iFileRevision); if(!bImportStatus) { // インポータ初期化失敗の場合エラーを表示してリターン puts("FBXImporterの初期化に失敗しました\n"); printf("エラー内容: %s\n\n", pImporter->GetLastErrorString()); if(pImporter->GetLastErrorID() == KFbxIO::eFILE_VERSION_NOT_SUPPORTED_YET || pImporter->GetLastErrorID() == KFbxIO::eFILE_VERSION_NOT_SUPPORTED_ANYMORE) { puts("FBX SDK 2009.1がサポートしていないバージョンのファイルです\n"); } return; } // FBXファイルであれば処理を行う if(pImporter->IsFBX()) { printf("ファイル名 %s バージョン %d.%d.%d\n\n", file, iFileMajor, iFileMinor, iFileRevision); // 情報取得 // 撮影とかでよくあるテイク1とかテイク2とかそういうノリ(・・・なんじゃないかな) puts("このファイル情報は以下の通りです"); iTakeCount = pImporter->GetTakeCount(); printf(" アニメーション情報数 : %d\n", iTakeCount); printf(" カレントアニメーション情報 : \"%s\", \n", pImporter->GetCurrentTakeName()); puts("\n"); for(i=0; iGetTakeInfo(i); printf(" Take %d\n", i); printf(" Name: \"%s\"\n", lTakeInfo->mName.Buffer()); printf(" Description: \"%s\"\n", lTakeInfo->mDescription.Buffer()); // 異なった名前でインポートしたい場合、下を変更してくれーらしい printf(" Import Name: \"%s\"\n", lTakeInfo->mImportName.Buffer()); // インポートする必要がない場合、下をfalseにしてくださいだそうです。 printf(" Import State: %s\n", lTakeInfo->mSelect ? "true" : "false"); printf("\n"); } // インポートする情報を設定 // とりあえずパースしたいので全てtrueで必要情報は全部読み込みます lImportOptions->SetOption(KFBXSTREAMOPT_FBX_MATERIAL, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_TEXTURE, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_LINK, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_SHAPE, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_GOBO, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_ANIMATION, true); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_GLOBAL_SETTINGS, true); } // ファイルをインポート bStatus = pImporter->Import(pScene, lImportOptions); // パスワードが掛っていた場合 if(bStatus == false && pImporter->GetLastErrorID() == KFbxIO::ePASSWORD_ERROR) { printf("パスワードを入力してください: "); Password[0] = '\0'; scanf("%s", Password); KString lString(Password); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_PASSWORD, lString); lImportOptions->SetOption(KFBXSTREAMOPT_FBX_PASSWORD_ENABLE, true); bStatus = pImporter->Import(pScene, lImportOptions); if(bStatus == false && pImporter->GetLastErrorID() == KFbxIO::ePASSWORD_ERROR) { printf("パスワードが一致しないようです。\n"); } } // 後片付け if(lImportOptions) lImportOptions->Destroy(); lImportOptions = NULL; pImporter->Destroy(); return; }