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

概要

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

FBX SDKでFBXファイルをインポートする方法について書いた記事です。
主に次の項目に該当する方に向けて書いています。

サンプル

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

開発環境
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_importer = 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_scene->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_scene->Destroy();
	fbx_manager->Destroy();

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

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

FBX SDKを終わらせる

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

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

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

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

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