【Csharp】XNAでFBXのスキンメッシュアニメーション実装

単純なものからはじめて、徐々に複雑なものへ進むという感じで。

まずは、ボーンが三つしかない砲台のアニメーションをBlenderで作ってFBXに出力し、XNAで再生させてみた。

動画を貼り付けておく。

たったこれだけのことなんだけれども、いくつか苦労した問題があって、結局ほぼ1日がかりの作業になった。

スキンメッシュアニメーションをXNAで実現するためには、コンテンツパイプラインを独自拡張しなければならない。

それには、エフェクト(FXファイル=シェーダーのこと)もビルトインのベーシックエフェクトじゃなくて、自作のエフェクトを使うように差し替える作業も含まれる。

つまり、スキンメッシュアニメーションをするための頂点計算を行うシェーダを自前で用意しなければならない。

コンテンツパイプラインの拡張ライブラリの作成とスキンメッシュ用のシェーダファイルの作成、これら含めて今日一日で作ったのかというと、そんな訳はない。

この二つについては、書籍『XNA 3D-CGプログラミング』(I・O BOOKS)の付録のサンプルプログラムから拝借して、若干手を加えた程度。

コンテンツパイプラインの拡張部分のソースについてはおいおい中を解析して行く予定。

とりあえず、ここまでの苦労を忘れないうちにメモしておく。

【トラブルシュート】
出くわしたトラブルが以下となる。

・そもそも独自拡張のコンテンツパイプラインってどうやって使うの?
・自前コンテンツパイプラインの指定には成功したけど、シェーダーのコンパイルでエラーが出てるんだけど。
・シェーダのコンパイルも成功して、うまく起動できたんだけど、メッシュが上下さかさまになってんじゃん。
・こんな単純な形状なのに、一部メッシュがつぶれてるんだけど、それは。

では、ひとつずつ。
・そもそも独自拡張のコンテンツパイプラインってどうやって使うの?

プロジェクトにfbxやxファイルなどのアセット追加すると、プロパティでコンテンツパイプラインを指定できる。
ところが、ここに出るはずの自前のコンテンツパイプラインがでてこない。どういうことか。

答えは単純で、XNAのプロジェクトは、ソース用のプロジェクトとコンテンツ用のプロジェクトの二つのプロジェクトから成り立っている。
コンテンツパイプラインを追加したい場合は、ソース用のプロジェクトに参照を追加するだけじゃダメで、コンテンツ用のプロジェクトにも参照を追加する。

ということで、なんとか解決。

次。
・自前コンテンツパイプラインの指定には成功したけど、シェーダーのコンパイルでエラーが出てるんだけど。

サンプルのFXファイルで、頂点シェーダとピクセルシェーダの関数名に、VertexShader、PixelShaderというそのまんまな名前を使っていたのが問題だった模様。
それぞれ、MyVertexShader、MyPixelShaderに名前を変更したら、なんか動いた、わはは。

次。
・シェーダのコンパイルも成功して、うまく起動できたんだけど、メッシュが上下さかさまになってんじゃん。

これは、結局根本的な原因がわかっていない。ひょっとすると次の問題と関連があるんじゃないかと推測される。
とりあえず抜本的な解決は保留にしておいて、プログラム側で反転させた。

最後。
・こんな単純な形状なのに、一部メッシュがつぶれてるんだけど、それは。

これも、根本的な問題が解明したわけじゃないけれども、Blender側でボーンを作成するときに、ボーンの軸の初期回転が影響していることが原因だと思われる。

今回使った砲台のボーンは、砲身のボーンが初期状態でX軸で90度曲がっている。

こうした形状のボーンをXNAが解釈するときに、なんか内部で独自ルールがあるようだ。

ためしに、Blender側で該当ボーンの初期回転(BoneプロパティのRoll)を180度にして出力してみたところ、メッシュの潰れが解消された。

つまり、ボーンがねじれた状態で解釈されたため、メッシュがねじれて潰れていたのだ。

というわけで、所感としてXNAでスキンメッシュを実装するためには、コンテンツパイプライン側の実装を熟知していないと、リソース作成時やメインのゲームロジック側で帳尻を合わせなければならなくなる。

つまり、どちらにせよ、コンテンツパイプラインの熟知が必須だということだ。

4年前

コメントを残す

メールアドレスが公開されることはありません。