FBXファイルの読み込み1

 これまでは何か描画を行うにも、頂点座標やインデックスデータを手作業で入力を行ってきました。しかし、それではより複雑な形状を作って使いたい場合など、とても手に負えません。そこで、一般的には描画したい形状のオブジェクトはモデリングソフト等で作り、作った形状データをファイルに保存し、それを読み込みDirectXで使います。形状データの形式は色々ありますが、今回はFBX形式のファイルを利用したいと思います。理由としては、単純に形状データの保存のみならず、アニメーションを含む情報も扱うことが出来るためです。さらに、それらのデータをプログラムから利用する場合、自分でパーサを実装することはなく、専用のSDKがあり、それを使うことで簡単にデータを取り扱うことができます。

 

 まずは、FBX SDKの導入方法から説明を行います。ここからFBX SDKをダウンロードすることができるページへ飛ぶことができます(2018年3月時)。

​左の図のページへ行ったら、左下に見える「GET FBX SDK」のボタンをクリックします。すると、右の図のページへ飛ぶと思います。中から自分の環境にあったものを選んで、ダウンロードを行います。私はWindowsでVisual Studio 2017を使っているので、「FBX SDK 2018.1.1 VS2015」を選択しました。

インストーラを起動すると、上の図のような画面が出てくると思います。特別な理由がない限り、インストール場所もデフォルトの所で大丈夫です。これで、FBX SDKのインストールは完了です。

​ 続いてVisual Studio側の設定を行います。下の図のように、メニューのプロジェクトから一番下にあるプロパティを選択します。プロパティ内の「VC++ディレクトリ」を選択します(下右)。

ここでビルド時に必要なインクルードファイルやライブラリの追加を行います。まずは、インクルードディレクトリをクリックして下の図のようにFBX SDK​のインクルードファイルがあるフォルダを追加します。

同じ手順でライブラリの追加を行いたのですが、ライブラリがインストールされたフォルダを見てみると以下の4つが存在することが確認できます。

​  ・C:\Program Files\Autodesk\FBX\FBX SDK\2018.1.1\lib\vs2015\x86\debug

​  ・C:\Program Files\Autodesk\FBX\FBX SDK\2018.1.1\lib\vs2015\x86\release

​  ・C:\Program Files\Autodesk\FBX\FBX SDK\2018.1.1\lib\vs2015\x64\debug

​  ・C:\Program Files\Autodesk\FBX\FBX SDK\2018.1.1\lib\vs2015\x64\release

自身のビルド実行環境に合わせて一つ選択すれば問題ありません。そしてここからが重要です。

プロパティ内の左の「C/C++」の中の「コード生成」メニューを開きます。右の項目の中に「ランタイム ライブラリ」があると思います。その項目のパラメータがマルチスレッド(「/MT」又は「/MTd」)の場合は、左項目内の「リンカ」内の「入力」項目をクリックした時に出てくる右側の「追加の依存ファイル」欄に「libfbxsdk-mt.lib」を追加します(上の図右)。もしも、「ランタイム ライブラリ」のパラメータがマルチスレッドDLL(「/MD」又は「/MDd」)であった場合は、「追加の依存ファイル」欄に「libfbxsdk-md.lib」を追加します(上の図左)。

 以上でFBX SDKをVisual Studioで使うまでの導入から設定は終わりです。以下では、FBX SDKを使ってFBXファイルから形状データを読み込み、描画を行うまでのコードの解説です。ここで使用されているFBXファイルは、FBX SDKをインストールした際に付いてきたサンプル「...\samples\ViewScene」の中にある、「humanoid.fbx」を使っています。なので、実行する際は、この「humanoid.fbx」をプロジェクト内に追加するようにして下さい。

​コード解説

① FBXファイルの読み込み
 FBX
ファイルの読み込みを行います。読み込みに関しては、以下のコードがテンプレとなっています。

3行目で読み込むファイルの文字列を作成し、5行目で指定して読み込みを実行しています。重要なのは、FbxManagerとFbxSceneです。FbxManagerは名前の通り、FBXを取り扱うための管理を行います。FbxSceneは、FBXファイルに格納されているシーンの情報を保持します。シーンの中には、ノードと呼ばれているものが、階層構造で存在しています。それぞれのノードには、頂点データやカメラ、ライト、アニメーション等の描画に必要な情報が保存されています。

② FBXファイルから頂点データの読み込み
 頂点データが保存されているノード(この中にはインデックスデータも含まれる)の中身を、FbxMeshで読み込みます。

1行目から6行目で先頭のノード(ルートノード)直下にあるノードを順番に検索していって、頂点データの入っているノードを見つけたらFbxMeshの変数、meshに取り込んでいます。本来であるなら、ノードは階層構造であるため、ノードの子ノード以下も全て探さなければなりません。

8行目から13行目では、meshの中にある頂点座標データを取り出し、VERTEX構造体のメンバPosに代入を行っています。FBX SDKで取得したデータは、Double型が4つのため、そのうちX、Y、Zに関するそれぞれの値をFloat型にキャストし、各成分に代入しています。

サンプル​コード

< 動作確認環境 >
 ・Windows10 Pro
 ・Visual Studio Community 2017


基本的には空のプロジェクトを作ってもらい、以下のソースコードをコピペするだけでうまく実行できるかと思います。もしうまくいかない場合がありましたら、サンプルコードの実行に関する注意事項を一度参照してみてください。

③ FBXファイルからインデックスデータの読み込み
 mesh(FbxMesh)に含まれるインデックスデータを取り出します。

インデックスデータの取扱い関する部分では、コードを見ていただくと分かる通り、これまでに出てきたコードとほぼ一緒です。頂点の座標データでは、それぞれDouble型だったためにFloat型へのキャストを必要としましたが、インデックスデータは同じInt型の配列であるため、そのまま利用することが出来ます。GetPolygonVertexCount関数でインデックスデータの数を取得できます。インデックスデータそのものは、GetPolygonVertices関数で取得を行います。

ソースコード

・FBXファイル(FBX SDKをデフォルトインストールの場合)

  C:\Program Files\Autodesk\FBX\FBX SDK\2018.1.1\samples\ViewScene\humanoid.fbx

シェーダのソースコード (shader.hlsl ※必ずこの名前で保存してください)