2010/8/11
2010/8/12
2010/8/21
「Softimage Mod Toolで作成したスキンアニメモデルをXNAで動かす」に戻る
Softimage Mod Tool と XNA の連携手順
(その 2:デフォルトモデルシャドウリグなし)
Softimageから簡単に取得できるリグ(ボーンやコントローラの集合体)を利用して、XNAで人体モデルをスキンアニメする手順です。
デフォルトのリグはボーン数が76→108もある(モデルのボーン数を確認する方法はこちら)ので、XNA上限値(58)を超えてしまい、エラーが発生して動きません。 エラーを回避するために その3:デフォルトモデルシャドウリグ付き の方式でモデルを作成したのですが、構造が複雑で使いこなすのはかなり難しい(ボーン追加手順なども複雑化する)ので、シャドウリグ付きモデルはお勧めできません。
標準リグモデルをXNAで使用するには、下記のいずれかを実施する必要があります。
A案:ボーンを削除して58以下とする
B案:XNAの最大ボーン数を増やす
本稿では、B案で標準リグモデルをXNAで動かす手順を記述します。尚、A案に関しては筆者はまだ成功してません。
注意 | この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。 この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。 |
◎使用ツール
・XNA 3.1
・Softimage Mod Tool 7.5
・XNAViewer(XNA Viewerのセットアップ手順はこちら)
◎XNA用シーンの準備
以上でXNAシーンの準備が完了しました。
◎モデルの準備
以下、Animateツールバーで作業します。
手順4〜5は目の位置の補正です。目の位置は気にしないという人は、手順4〜5を飛ばしても問題ありません。
番号 | 画面イメージ | Softimage Mod Tool操作 | 詳細 |
1 | 作成>キャラクタ>二足ガイド | ・表示されたダイアログはそのままOK ・キャラクタのプロポーションに合うようにガイドのプロポーションを修正する |
|
2 | 作成>キャラクタ>二足ガイドからリグ作成 | ・表示されたダイアログはそのままOK | |
3 | 取得>プリミティブ>モデル>キャラクタ-男性 | ・取得したモデルのパラメータを適当に調整する | |
4 | (ExplorerでMan_Character→Characterをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のConstrain>すべてのコンストレイントの削除 (ExplorerでMan_Character→Characterをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のTransform>すべての変換をリセット (ExplorerでMan_Character→Characterをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のTransform>すべての変換をフリーズ |
・目のメッシュを漏らさず選択するためにマウス中ボタンを活用する ・目玉メッシュにはコンストレイント機能が設定済であるが、XNAではコンストレイント機能は無効なので削除する ・左記の操作を実施しないとXNAで両目の位置がおかしくなる(詳細はこちら) |
|
5 | (ExplorerでMan_Character→Character→right_eyeをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のTransformの「t(位置)」を修正 (ExplorerでMan_Character→Character→right_eyeをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のTransform>すべての変換を フリーズ |
・right_highlightメッシュを漏らさず選択するためにマウス中ボタンを活用する ・このままだとXNAで右目の位置が
ずれるので、右目の「t(移動)」を以下のように修正する ・左記操作を実施すると、右目がXNAで正常に表示される |
|
6 | (ExplorerでMan_Character→Characterをマウス中ボタンで選択した状態で)メインコマンドパネル(画面右)のEdit>フリーズ | ・モデルメッシュを選択する際は、モデルメッシュ以外のオブジェクト(ガイドやリグなど)を選択しないように気を付けること ・オペレータスタックによる以前の操作修正はできなくなるが、データ量は低減する ・Editメニューが画面下に消えている場合は、SelectやTransform等のメニュー文字部を数回右クリックすると現われる(一回目は表示されないことがある(バグ?)が、Select等を複数回右クリックすると出現する) |
以上でモデルの準備が完了しました。ファイル>保存でシーンを保存してください。(今後は適当なタイミングで各自保存してください)
◎XNAモデルへの変換
番号 | 画面イメージ | Softimage Mod Tool操作 | 詳細 |
1 | (ExplorerでBipedを選択した状態で)XNA Game Studio>Convert to XNA Model | ・メッシュモデル(Man_Character配下のCharacter)をBipedの階層下にドラッグ&ドロップで移動 ・不要になったMan_Characterは削除する |
以上でXNAモデルへの変換が完了しました。
◎GlobalSRT階層の修正
デフォルトで取得したリグは、XNAと相性が悪い部分があるので修正します。この作業をしないと、XNAでスキンアニメした時に表示が崩れることがあります。
以上でGlobalSRT階層の修正が完了しました。
◎envelope_groupの整理
この手順は必須ではありません。面倒(なことがキライ)な人は、読まずに飛ばしても問題ありません。
次項の「◎エンベロープの設定」では、エンベロープ(皮膚)のデフォーマ(エンベロープが動く際に基準とするノード、通常はボーンを指定する)にenvelope_groupを指定します。このグループにはデフォーマ候補ボーンが既に登録済ですが、不要なボーンも含まれている可能性があります。
例えば、手の握りが固定であれば、指のボーンは不要です。グーとパーだけ表現したい場合は、片手につき指2本分で表現可能なので、他の3本は不要です。(指1本につき3骨で構成されているので、不要ボーンが多いケースもある)
このグループに不要なボーンが存在する場合は、このグループから予め削除しておくと、エンベロープ設定時にデフォーマ対象から除外されます。また、リソースが管理しやすくなるというメリットもあります。但し、このグループからデフォーマを削除しても、XNAに渡すボーン数が減るわけではありません。(モデルのボーン数を確認する方法はこちら)
ここでは、例として両手指6本×3骨=18骨と、両足先2本×2骨=4骨を削ります。また、不要なボーンはhiddenグループに入れて非表示とします(ここに入れると常に非表示状態となり、Hキーを押しても表示されない)。
ちなみに、Softimageではボーンを1本ずつ削除することはできません。チェイン(始点/終点/ボーンの集合体)単位なら削除可能ですが、リグのチェインを無闇に削るとXNAで致命的エラーが発生する可能性があるので注意してください。
以上でenvelope_groupの整理が完了しました。
◎エンベロープの設定
以上でエンベロープの設定が完了しました。
◎サブディビジョンレベルの調整
この手順は必須ではありません。下記事項を考慮した上で、実施すべきか否か個別に検討してください。
・モデルの滑らかさが低下するので、見た目が少し悪くなります。
・頂点数、ポリゴン数、インデックス数などが減るので、ゲーム中のPC負荷が軽減され、パフォーマンスが向上します。
・デフォルトでは三角形(XNA的にはポリゴン数?)が約6万存在し、インデックス要素が32ビット必要となるため、グラボが未対応の場合はXNAで下記エラーが発生します。(シェーダのバージョンとは無関係。シェーダ3.0対応でも下記エラーが発生する環境は実在します。)
System.InvalidOperationException: This device does not support 32-bit indices. Use IndexElementSize.SixteenBits or a type that has a size of two bytes.
不特定多数に配布する場合、ユーザの環境によっては「ゲームが起動しない、エラーも何も表示されない」状態となるので注意が必要です。この手順を実施すると、この問題を回避できます。
以上でサブディビジョンレベルの調整が完了しました。
◎アニメーションの登録
以上でアニメーションの登録が終わりました。
◎マテリアルの設定
SoftimageモデルをXNAで動かすには、XNA向けマテリアル設定が必要です。実装方法は2通りあります。
A案:個々のクラスタ/マテリアル毎に、DirectXシェーダを設定する(手順はこちらの「◎マテリアル設定」を参照)
B案:XNAでマテリアルを一括設定する(手順はこちらを参照)
どちらかの手順を実施する必要があります。どちらも実施しないと、XNAでスキンアニメしません(BasicEffectで静止表示される)。
◎ライトの設定
シェーダに依存します。シェーダの内容次第ではシーンファイル(Scene_Data.xsi)のライト設定が影響しますが、デフォルトのままXNAで表示できるケースが多い ようです。(こちらの「◎マテリアルの設定」などを参考に各自研究すること)
◎ファイルの出力
以上でファイルの出力は完了しました。XNAViewerで読み込んで表示します。
◎XNAの最大ボーン数を増やす
こちらを参考に、XNAViewer及びHLSLを改修して、最大ボーン数を増やします。
デフォルトのリグはボーン数が108もあるので、この作業をやらないとエラーになります。
◎XNAViewerによる表示
以下はXNAでの操作です。
番号 | 画面イメージ | XNA操作 |
1 | − | ・予め準備したサンプルプロジェクト「XNAViewer」を開く |
2 | ・ソリューションエクスプローラのSOFTIMAGE_XNAViewer→Content→Modelsで右クリックし、追加>既存の項目 ・オブジェクトの種類を「すべてのファイル」とし、Modelsフォルダ内の先程作成した〜.xsiファイルを追加する |
|
3 | ・追加したファイルのプロパティを確認する →Content ImporterがCrosswalk Importerに、Content ProcessorがCrosswalk Model ProcessorになっていればOK |
|
4 | − | ・LoadContent()内の Models.Add(new ModelAsset("Content/Models/Robot_Articulated", content)); のアセット名を、先の名称に変更する (例:Models.Add(new ModelAsset("Content/Models/SkinModel01", content));) |
5 | − | ・ビルドしてプログラムを開始する ・パッドを操作してアニメーションを開始する |
実行結果は下記をご覧ください。
◎実行結果(メインPC)
私のメインPCでは、下記のビルドエラーが発生します。(マザーボード内臓グラボで貧弱なため)
XNA3.0:Invalid texture. Face 0 is sized 150x148, but textures using DXT compressed formats must be multiples of four.(XNA3.0)
XNA3.1:無効なテクスチャーです。面 0 のサイズは 150x148 ですが、DXT 圧縮フォーマットを使用するテクスチャーでは 4 の倍数にする必要があります。
これは「テクスチャ解像度が150×148だが、圧縮フォーマットの都合で4の倍数じゃないといけないよ」と言っているようです。他人の環境では出ないかもしれません。
eye.jpgの解像度を148×148に修正すると、このエラーは回避できます(手順はこちらの「◎マテリアルの設定」を参考にすること)。すると次のエラーが発生しました。
System.ArgumentException: Device does not support multi-level texture width and height values that are not powers of 2.
これは「テクスチャが2のn乗じゃないよエラー」です。eye.jpgの解像度を128×128に修正すると、このエラーは回避できます。
画像解像度を修正すると、XNAでスキンアニメが正常に表示されました。
「◎モデルの準備」の手順4〜5を省略した場合は、目玉が足元で動きます。
筋肉の動き方など細部が気に入らない人は、SoftimageのWait Editorなどでエンベロープウエイトを調整してください。
◎XNAでアニメが崩れる場合
Softimageで正常にアニメするのに、XNAでアニメが崩れる場合、下記の原因が考えられます。
○モデルの一部にSoftimage特有機能が使われている
例えば、コンストレイント(連動)機能やニュートラルポーズ機能、(メッシュの)センターなどの機能はXNAに存在しないので、モデルにこれらの機能が使われていると、XNAでアニメが崩れます。
その場合は、メッシュ/リグ/ボーン等に対して、下記操作を試してみましょう。(試行前の保存をお忘れなく)
1.Constrain>すべてのコンストレイントの削除
2.Transform>ニュートラルポーズの解除
3.Transform>すべての変換をリセット
4.Transform>すべての変換をフリーズ
メッシュに対して行った場合は、Edit>フリーズMやエンベロープを再設定した方が良いかもしれません。(不要?)
Softimage特有機能を全て外した上で、センター座標などのトランスフォーム値が(グローバル座標系で)スケール1、回転0、位置0となるようにしましょう。
○スケールを持つボーンアニメーションが含まれている
本稿では「XNAの最大ボーン数を増やす改修」を実施しているため、スケールを持つボーンアニメーションは非サポートです。
Softimgeでは意外と見落としやすいので注意してください。(詳細はこちらの「◎補足事項」参照)
○激しいアニメーションは破綻する可能性がある
「XNAの最大ボーン数を増やす改修」のHLSLコードの特性により、激しいアニメーションは破綻する可能性があるようです。
ほとんどの場合は大丈夫と思いますが、頭の片隅に入れておいてください。(詳細はこちらの「◎補足事項」参照)
◎モデルのボーン数を確認する方法
XNA Game Studio>Diagnose Modelsとすると、作成したモデルがXNAで動くかチェックできます。 この機能でボーン数をチェックすることも可能ですが、実はこの機能でカウントしたボーン数よりも、XNAで読み込んだ際にボーン数が増えていることがあります。
本稿の標準取得リグモデルがこのケースに該当します。チェック機能では76ボーンとカウントされますが、このモデルをXNAで読み込むと108ボーンに増えています。(このケースでは、XNAの最大ボーン数を108以上に拡張しておかないとエラーになる)
標準リグモデルにはコントローラやチェインなどSoftimage特有の機能が含まれているので、XNAに余分なノードが渡されているのではないか?と思うのですが、未確認です。いずれにせよ、Diagnose Modelsのボーン数は参考程度と考えた方が無難かもしれません。
正確なボーン数が知りたい場合は、XNAで実際に読み込んで bones.Length を参照してください。