MRが楽しい

MRやVRについて学習したことを書き残す

FBX SDKで3Dファイルを読み込む

本日は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/