いつの時代の3DCGだよって絵柄ではあるが、ありあわせの背景と自作のモデル(中央の女の子)をXNAで表示してみた。
メッシュの表示までは簡単にできた。
そう、メッシュの表示までは…
XNAによる3Dモデルの表示の肝は、独自のコンテンツパイプラインである。
これは、3Dモデルの元となるXファイルやFBXファイルをビルド時に独自の形式のアセットに変換して、プログラム内では共通の構造を持ったモデルとして扱うという仕組み。
なので、上記画像の背景はXファイルで、女の子はFBXで作成されているのだけれども、コンテンツパイプラインから読み込んだ時点で、どちらもModelという汎用的なクラスで扱えるようになり、表示するロジックはほぼ同じである。
Modelの中には、分割されたメッシュ、マテリアルごとのエフェクト(シェーダのこと)、ボーンなど、3Dモデルのあらゆる情報が詰まっている。
うむ、理想はわかる。
しかし、このコンテンツパイプラインが結構曲者で、どんなXファイルやFBXファイルでもOKかというと、そうは問屋がおろしてくれないのである。
Unityでは問題なく表示できたFBXの女の子は、この中にボーンも入れてあるんだけれども、XNAのコンテンツパイプラインから読み込んだら、メッシュとボーン(BlenderでいうArmature)がお互いに関係のない二つのオブジェクトとして読み込まれているような感じで、ボーンを操作してもメッシュが反応してくれない。
つまり、スキンメッシュが出来ていないのである。
おそらく、コンテンツパイプラインの機嫌をそこねないような礼儀正しいFBXファイルしかうまく扱えないのではないかと危惧している。
手元にあるXファイルや、他のFBXでも試してみたけれども、いくつかは読み込むことすら出来なかったりする。
XNA用に慎重にモデリングするか、コンテンツパイプラインを独自に拡張するか(コンテンツパイプラインはカスタマイズが可能)、どちらかのアプローチが必要になる。
スキンメッシュの表示はまだ時間がかかりそうだ。