本日は3Dデータの技術調査枠です。
前回記事の続きになります。
bluebirdofoz.hatenablog.com
今回は、FBX SDK で fbx 形式ファイルの読み込みを試してみます。
読み込みサンプルは前回作成した三角錐データを fbx 形式に出力して利用します。
bluebirdofoz.hatenablog.com
初めに、FbxManager クラスの初期化を行います。FbxManager はSDKのメモリマネージメントを行います。
#include<iostream> #include<fbxsdk.h>
// FBXマネージャを初期化する FbxManager* manager = FbxManager::Create(); if (manager == NULL) { // マネージャの初期化が失敗した場合 return 1; }
次に FbxImporter の初期化を行います。FbxImporter がファイルの読み込みを行います。
// FBXファイルの読み込みパスを指定 const char* filePath = "test.fbx"; // 入出力設定を作成する FbxIOSettings* ios = FbxIOSettings::Create(manager, IOSROOT); // マネージャーに入出力設定をセットする manager->SetIOSettings(ios); // FBXインポータを初期化する FbxImporter* importer = FbxImporter::Create(manager, ""); // FBXファイルの読み込みを実行する if (!importer->Initialize(filePath, -1, manager->GetIOSettings())) { // ファイルの読み込みが失敗した場合 manager->Destroy(); return 1; }
次に FbxScene を初期化し、読み込んだ FBX データをシーンにインポートします。
Scene は3D空間を構成するオブジェクト(メッシュ、ライト、カメラなど)を格納するコンテナです。
// FBXシーン(3D空間を構成するオブジェクト情報)を初期化する FbxScene* scene = FbxScene::Create(manager, ""); // シーンのインポートを実行する if(!importer->Import(scene)) { // シーンの読み込みが失敗した場合 manager->Destroy(); return 1; } // シーンの読み込みが完了すればインポータは不要なので破棄する importer->Destroy();
最後に読み込んだモデルを使い易くするため、全てのメッシュを三角ポリゴンに変換します。
FbxGeometryConverter geometryConverter(manager);
geometryConverter.Triangulate(scene, true);
これで fbx ファイルの読み込みは完了です。
全てを組み合わせた一連のコードは以下になります。
// FBXファイルの読み込みパスを指定 const char* filePath = "test.fbx"; // FBXマネージャを初期化する FbxManager* manager = FbxManager::Create(); if (manager == NULL) { // マネージャの初期化が失敗した場合 return 1; } // 入出力設定を作成する FbxIOSettings* ios = FbxIOSettings::Create(manager, IOSROOT); // マネージャーに入出力設定をセットする manager->SetIOSettings(ios); // FBXインポータを初期化する FbxImporter* importer = FbxImporter::Create(manager, ""); // FBXファイルの読み込みを実行する if (!importer->Initialize(filePath, -1, manager->GetIOSettings())) { // ファイルの読み込みが失敗した場合 manager->Destroy(); return 1; } // FBXシーン(3D空間を構成するオブジェクト情報)を初期化する FbxScene* scene = FbxScene::Create(manager, ""); // シーンのインポートを実行する if (!importer->Import(scene)) { // シーンの読み込みが失敗した場合 manager->Destroy(); return 1; } // シーンの読み込みが完了すればインポータは不要なので破棄する importer->Destroy(); // 三角ポリゴンへの変換を行う FbxGeometryConverter geometryConverter(manager); geometryConverter.Triangulate(scene, true); // ここで3Dデータへの処理を行う
参考:
・【FBX to OBJ】02 FBXファイルを開こう
http://hobbyistbox.hatenablog.com/entry/2016/02/17/033600
・その2 FBXファイルの読み込みと終了処理
http://marupeke296.com/FBX_No2_LoadAndTerminate.html
・FBX SDKのファイル読み込みとノード巡り
https://codelabo.com/886/