FBXファイルフォーマットのエクスポート活用について

FBXファイルフォーマットについて

FBXファイルは Autodesk社がサポートを行っている3Dモデルフォーマットです。

世の中には様々なモデルフォーマットがありますが、ボーンやマテリアル等が
サポートされて、ビューワやSDKのメンテナンスが行われているものは多くありません。

その中でも高機能でよく使用されるのがFBXファイルです。
ここではFBXファイルの特徴とSDKについて説明します。

自己紹介

こんにちは。私、下野と申します。

ガジェット好きなエンジニアです。

よろしくお願いします。

FBXファイルの特徴

FBXファイルフォーマットには次の特徴があります。

  • 1モデル中に複数メッシュを持つ事が可能。
  • スキンメッシュ,ウェイト付きボーンをサポート。
  • ポリゴン単位のマルチレイヤー,マルチマテリアルをサポート。
  • Windows/Mac/Linux/iOS各プラットフォームで、
    C++やPythonをサポートしたSDKが用意されている。
  • Autodesk社CGツール Mayaなど、サポートしているツールが多い。
  • Autodesk社から専用ビューワが用意されている。
  • テクスチャフォーマットも.jpg,.pngなどに対応している。
  • アニメーションもファイル内部に持つことが出来る。

FBXビューワスクリーンショット。黄色く見えているのはスケルトン。

SDKについて

sdkの入手方法

現在 SDKはAutodesk社の以下の場所から手に入れる事ができます。

http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=25408427

WindowsプラットホームではVisualStudio2012/2013/2015をサポートしています。

インポート/エクスポート

FBXファイルファイルを読み込んで使われているデータを読み出す事をインポート、
3DモデルをFBXファイルへ出力する事をエクスポートといいます。

インポートについての説明を行っているサイトは比較的多いですが、
エクスポートについて日本語の説明を行っているサイトはあまり例がありません。

ここでは、エクスポートについて説明を行います。

サンプルについて

SDKの使い方については、サンプルが用意されています。
これらのサンプル,オフィシャルのドキュメントが最も参考になります。

エクスポートサンプルは以下の物があります。

  • ExportScene01~ExportScene05

エクスポート

基本モデル

基本的なエクスポート手順は以下の通りです。

  • CreateSceneを行う。
  • Meshを作成する。
  • Vertex(ControlPoint)を作成する。
  • Polygonを作成する。
  • SceneをFBXファイルとして出力する。

法線やマテリアルなどは特に定義しなくても、形状だけであればこれで問題ありません。
Vertexを作成するタイミングはPolygonを作成後でも大丈夫です。

テクスチャモデル

次に、テクスチャを貼ったモデルのエクスポート手順は以下の通りです。

テクスチャを使用したモデルは、テクスチャを割当てたマテリアルを用意して、
ポリゴン生成時にマテリアルを指定します。

  • CreateSceneを行う。
  • Meshを作成する。
  • Vertex(ControlPoint)を作成
  • Materialを作成する。
  • Polygonを作成する。
  • SceneをFBXファイルとして出力する。

・注意点

Polygonを出力する際にMaterialIndexを指定する事ができますが、
頂点や法線,UVと違って、Materialはすでに作成していないと正常に出力されません。
(FBXファイルを出力する際にも特にエラーにはなりません)

Polygon作成前に Materialの作成を行って、そのIndexを指定する必要があります。

マルチマテリアルモデル

Meshに対して複数マテリアル(テクスチャ)を割り当てたい場合は、
以下の様に、MeshNodeに対して Materialを追加します。

FbxNode* lNode = pMesh->GetNode();
lMaterial = lNode->GetSrcObject<FbxSurfacePhong>( material_index );
FbxLayer* lLayer = pMesh->GetLayer(0);
FbxLayerElementMaterial* lLayerElementMaterial =
FbxLayerElementMaterial::Create(pMesh, "MaterialName" );
lLayer->SetMaterials(lLayerElementMaterial);

// ポリゴン単位でマテリアルを変更するため、マッピングモードを FbxLayerElement::eByPolygonにする。
lLayerElementMaterial->SetMappingMode(FbxLayerElement::eByPolygon);
lLayerElementMaterial->SetReferenceMode(FbxLayerElement::eIndexToDirect);
lNode->AddMaterial(lMaterial);

マテリアル単位にMeshを作る方法もあり、Mayaの階層エディタでもマテリアル単位で
見る事ができるので整理はしやすくなります。

しかし、次のスキンモデルの様に、Mesh単位でしかウェイトの割当てが出来ないため、
マルチマテリアルになっている方が扱いやすいです。

もちろん、マテリアルが1種類しかない Meshであれば
マッピングモードの変更は必要ありません。

スキンモデル

スキンモデル作成手順は以下の通りです。

  • CreateSceneを行う。
  • Meshを作成する。
  • Skinを作成する。
  • Vertex(ControlPoint)を作成する。
  • Skeletonを作成する。
  • 各SkeletonにControlPoint登録用のClusterを作成する。
  • Polygonを作成する。
  • SkinにClusterを追加する。
  • MeshとMeshが属しているNodeに対してBindする。
  • SceneをFBXファイルとして出力する。

・注意点

Clusterにはウェイトを設定する ControlPointを指定しますが、
ワンスキンモデルの場合、ControlPointは一意の必要があります。

そして、Mesh単位でControlPointを割り当てるため、
ワンスキンモデルの場合は、割り当てられるMeshは一つだけになります。

そのため、複数マテリアルを使用したい時は、先ほどの様に
マルチマテリアルをMeshに割り当てる必要があります。

まとめ

FBXファイルは可用性の高いフォーマットなので、データ交換に非常に有効です。

今回は、その際に利用する事が多いエクスポート処理にスポットをあててみました。