FBX SDKの始め方/インポートの仕方/終わらせ方

概要

最終更新日:2020/03/16
FBXSDKバージョン:FBX SDK 2020.0.1 VS2017

FBX SDKでFBXファイルをインポートする方法について書いた記事です。
主に次の項目に該当する方に向けて書いています。
  • FBX SDKの始めにやることを知りたい
  • FBX SDKで最後にやることを知りたい
  • FBXファイルを開きたい
  • FbxManagerの役割を知りたい
  • FbxImporterの役割を知りたい
  • FbxSceneの役割を知りたい

サンプル

サンプルはここからダウンロードできます。
環境については以下の内容となっています。

開発環境
VSのバージョン VisualStudio 2019


FBXファイルをインポートするまでの流れ

FBXを使用するにはFBXSDKの各クラスを使用して行います。
FBXSDKでファイルをインポートすることで、プログラム側で扱える状態にします。
インポートが完了したらメッシュデータなどの情報の取得ができるようになります。
FBXSDKでFBXファイルをインポートをする流れは以下の通りです。
  1. FbxManagerを作成する
  2. FbxImporterを作成する
  3. FbxSceneを作成する
  4. ファイルを初期化する
  5. ファイルをインポートする

FbxManagerを作成する

FBXファイルを開くにはFbxManagerを作成することから始まります。
FbxManagerとはFbxImportやFbxSceneを作成するために必要な管理クラスです。
作成はFbxManagerクラスのstaticメソッドの「Create」を使用して行います。

model_render_0052
// FbxManager作成
FbxManager* fbx_manager = FbxManager::Create();
if (fbx_manager == nullptr)
{
	// 作成失敗
	return 0;
}

FbxImporterを作成する

FbxManagerを無事に作成できたら、FbxImporterの作成をします。
FbxImporterはFbxファイルをImportするためのパーサークラスです。
このクラスでファイルの持つデータをメッシュやカメラなどの情報に分解してくれます。
作成はFbxImporterクラスのstaticメソッドの「Create」を使用して行います。

model_render_0053
// FbxImporter作成
FbxImporter* fbx_import = FbxImporter::Create(fbx_manager, "ImportTest");
if (fbx_importer == nullptr)
{
	fbx_manager->Destroy();

	// 作成失敗
	return 0;
}

FbxSceneを作成する

FbxImporterの作成も終了したら、次はFbxSceneの作成です。
FbxSceneはImporterによって、分解されたFbxのデータを保存するためのクラスです。
SceneとImporterとの関係は「ファイルをインポートする」で説明します。
FbxSceneの作成はFbxSceneクラスのstaticメソッドの「Create」を使用して行います。

model_render_0054
// FbxScene作成
FbxScene* fbx_scene = FbxScene::Create(fbx_manager, "SceneTest");
if (fbx_scene == nullptr)
{
	fbx_importer->Destroy();
	fbx_manager->Destroy();

	// 作成失敗
	return 0;
}

ファイルを初期化する

ImporterとSceneが作成出来たらFbxファイルを初期化します。
ファイルの初期化はImporterの「Initialize」を使います。
FBXSDKでは「Open」の代わりに「Initialize」でファイル名を指定することで
指定されたファイルを開いて、初期化します。

model_render_0055
// ファイルを初期化する
if (fbx_importer->Initialize("Box.fbx") == false)
{
	fbx_importer->Destroy();
	fbx_manager->Destroy();
	fbx_manager->Destroy();

	// 初期化失敗
	return 0;
}

ファイルをインポートする

ファイルを無事に開くことができたら、次はSceneにインポートします。
Importerはファイルをインポートするための分解機能などがそろっていますが、
データ自体はImporter側は分解前のデータを保存しています。
分解後のデータの保存する役割を持っているのがSceneクラスです。
ImporterからSceneにデータをインポートする際に、
データをメッシュやカメラ、ボーンデータなどに分解してSceneに渡します。

model_render_0056

Sceneにインポートする方法はImpoterの「Import」を使用します。

model_render_0057
// インポート
if (fbx_importer->Import(fbx_scene) == false)
{
	fbx_importer->Destroy();
	fbx_manager->Destroy();
	fbx_manager->Destroy();

	// インポート失敗
	return 0;
}

第一引数のFbxDocumentはFbxSceneの親クラスです。
Importは分解処理まで行われるために非常にコストが高い処理です。
その為、スレッドを作成したり、第二引数の非同期フラグをtrueにして対応します。

FBX SDKを終わらせる

インポートしたSceneからデータを取得したらFbxManager、FbxImporter、FbxSceneは
必要なくなるので、全て破棄します。
破棄のメソッドは共通で「Destroy」を使用します。

model_render_0057
if (fbx_importer != nullptr)
{
	fbx_importer->Destroy();
}

if (fbx_scene != nullptr)
{	
	fbx_scene->Destroy();
}

if (fbx_manager != nullptr)
{
	fbx_manager->Destroy();
}

各クラスの破棄を忘れるとリークなどに繋がるので必ず破棄してください。