プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
LastConquer
Last Conquer
基本プレイ無料の三国志戦略シミュレーションゲーム。Webゲームとしては珍しく、行軍中に敵部隊と遭遇すると戦闘が発生する。名将は世界に一人しか存在しない。



◎エラー原因調査

前回発生したエラー

指定されたキャストは有効ではありません。

が、SoftimageとXNAの階層不整合によって生じたのであれば、ボーン数上限を増やしても、エラーは回避できません。そこで、エラー原因をもう少し詳しく調べることにします。



◎煩悩の数だけ骨がある

実際にエラーが発生したのは以下の行です。
(Softimage提供XNAコード)

effect.Parameters["Bones"].SetValue(bones);

エフェクトパラメータでボーン情報をエフェクトファイルに渡しています。

ちなみに、このパラメータはxsi_defaultvs.hlslの中で
#define MaxBones 58
float4x4 Bones[MaxBones];
として配列に格納されます


エラー発生時は、bones.Length=108でした。

えっ?108?
76じゃないの?

前回作成したシャドウリグ無しモデルを「Diagnose Models」でチェックすると、

[ERROR] "Biped.Character" has more than 58 bones. (76 bones)

上記のように76と記録されるのに、XNA動作時は何故108なのでしょうか?



◎他のモデルは?

他のモデルのボーンデータ数を確認すると以下の通り。

ロボット:40(サンプルデータ)
キャプテン:25(サンプルデータ)
槍兵:48(自作データ)

問題は、槍兵モデルのボーンデータ数が48ということです。前回の「ボーン数抜粋テキスト(槍兵モデル)」にあるように、Diagnose Modelsでは20、32、9、33と記録されますが、4つの数字をどう組み合わせても48になりません。

何かアヤシイので、ロボットとキャプテンのオリジナルシーンファイルを開いてDiagnose Modelsで確認すると、

ロボット:40(サンプルデータ)
キャプテン:24(サンプルデータ)

でした。ロボットは同じですが、キャプテン/槍兵/前回作成モデルはDiagnose Modelsの数値よりもXNA実行時のボーンデータ量が増加しています。



◎推測

何故このような現象が発生するのでしょうか?

推測A:
Diagnose Modelsのバグ

推測B:
Diagnose ModelsはXNAで必要最小限のデータのみカウントしているが、.xsi出力時に階層上のゴミデータも含んでしまう

推測C:
XNAのbonesは、他のデータも含むためボリュームが増える


推測Aの補足:
.xsi出力機能はSoftimageチーム、Diagnose Models機能はXNAチームが開発したものと推測しますが、だとすると認識の食い違いから仕様バグが発生した可能性は十分考えられます(もしDiagnose Models機能もSoftimageチームが開発したとしたら、同チームがXNA仕様を十分理解していなかった可能性が考えられます)。

推測Bの補足:
.xsi出力機能とDiagnose Models機能が両方ともバグではなく正しい仕様だとすると、階層データがXNA的に正しくない、ということです。
ただ、標準添付されたサンプルデータすら‘数値の食い違い’が発生しているので、XNA的に正しい階層を作ることは容易ではなさそうです。

推測Cの補足:
もしこの通りであれば「Diagnose Models機能によるボーン数チェックは実質役に立たない」ということになりますし、また、XNAやシェーダのプログラムから考えても、この可能性は低いと思います。


いずれにせよ、このままではボーン数上限を79に改善できたとしてもエラーは解消されないでしょう。

さて、どうしたものやら…。



◎対策検討

ひにけにXNAの記事の1番目の手法では、骨が足りないことが判明しました。2番目の手法なら最大ボーン数:118なので、骨が足ります。

しかし現テストモデルの階層構造は多分XNA的に正しくない(しかし何が悪いか自分ではわからない)状態で、2番目の改造を成功させる自信は全くありません。

まずは「このモデルの階層構造はXNA的に正しい(これが表示できなければプログラムがおかしい)」という確信を得たいのですが、そのためには一度XNAで表示しないと…って、それが出来れば改造不要じゃないですか!(爆)



◎メインPCの特性

…いや待てよ?

メインPCは特殊仕様で、定数レジスタ数は6万超だったはず。もしかすると、シェーダのMAX数を変えただけで動いたりして…?

ボーン数増加テスト03

おお!本当に表示できるとは!
しかも、左手がグーにできました!

これはリグの標準アクションデータです。シャドウリグを使うとXNAでは動かなかったのですが、これがXNAで動いたのは初めてかもしれません。

…これまで何度も苦労させられましたが、初めて「このPCで良かった」と思いました(笑)


但し、自作アクションは動きません。
やはり何か階層上の問題があるんですかね~?



◎次回予告

これではっきりしましたが、エラーの直接原因は「ボーン数超過」ですね。

これとは別に階層の問題があるので、まずはXNA的に正しい階層に修正して、その後2番目の改造にチャレンジする予定です。

何か本当に出来そうな気がしてきましたよ!

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

関係があるかどうか自信が持てないのですが、可能性があるので…。そちらでボーンの数がどうも一致しないということですが、次のようなことが原因だったりしないでしょうか?

私は自作のモデルとアニメーションをMetasequoia&KeynoteプラグインでXファイルに出力しています。その時、XファイルにおいてFRAMEというノードが階層構造を持っています。FRAMEの下には子FRAMEの他に、MESHノードなどが来ることもあります。

さて、じつはこのFRAMEがそのままアニメーション用のボーンに当たるのかというと、どうもそうではなさそうです。Keynoteプラグインの出力したXファイルには、FRAMEの階層構造とは別にいくつかのANIMATIONSETノード(1つ1つが一繋がりのアニメーションを意味する)があって、その下に複数のANIMATIONノードがあります。

このANIMATIONノードは1つ1つがFRAMEへの参照を持っていて、ボーンに対応しています。この他に、そのボーンについての一繋がりのアニメーションデータを持っています。つまりこのANIMATIONノードで指定されることのあるFRAMEだけが、“アニメーションに用いられる”ボーンなのです(ちなみに私のモデルの場合、ANIMATIONが参照するFRAMEは直下にMESHを持ちません。 Keynoteプラグインはスキンモデル専用なのでメッシュとボーンが独立しているのは当然です)。

…ところが! じつはXNA標準プロセッサでこのファイルを解析し、XNA標準のModelクラスとしてLoad<Model>()すると、Model.Bonesにはなんと“アニメーションには直接関係のない、ただMESHを持っているだけのFRAMEも全てボーンとして含まれて”しまっています。その分、Model.Bones.Countがアニメーションデータを持つボーンの個数より大きくなっています。

なので私の書いたコードでは、Model.Bonesを用いずアニメーションを持つボーンだけを自力で抽出しています。

あるいは全てのFRAMEをボーンと見なすが、アニメーションは対応するボーンにのみ適用し、アニメのない空のボーンには単位行列なりを設定しておくという手もあります。ただしCPU上の計算はそれでよいとして、エフェクトファイルに渡す時は結局アニメーション用のボーンだけを抽出する必要があります(レジスタの無駄なので)。

コメントありがとうございます

>ただMESHを持っているだけのFRAMEも全てボーンとして含まれてしまっています。
Keynoteプラグインの使用経験はありませんが、XNA標準のプロセッサやModelクラスがそのような動きをするということは、XNAではそれが標準仕様なのでしょうね。

Softimageの場合は、殆どオリジナル(.xsiファイル、独自インポーター/プロセッサ/ライブラリ、拡張Modelクラス)なので一概には言えませんが、少なくともXNA標準Modelクラスを内包しているのは間違いないので、同じような状態になっている可能性は高いと思います。
(そう考えると、Softimageのボーン数チェック機能とXNAでのボーン数が合わない状況が説明できます)

何故そんな状態になっているのでしょうね?アニメの有無に関わらず、そのMESHデータにアクセスするためとか??

理由はわかりませんが、それがXNAの仕様であるならば、ボーン数チェック機能もXNA仕様に合わせてくれないと意味がないなぁ…(ブツブツ)。

>アニメーションを持つボーンだけを自力で抽出しています。
階層構造の仕様を理解していないと出来ませんね。今の私にはちょっと難しそうです(汗)

>全てのFRAMEをボーンと見なす
こちらも実装は難しそうですね。

>結局アニメーション用のボーンだけを抽出する必要があります
そうなると、こちらの手法は、あまり意味がないですね^^;


Keynoteプラグインの話は、XNA標準仕様を理解する上でも参考になりました。ありがとうございました。

ボーン数制限をクリアしてもXNAで動かないことと関係あるかわかりませんが、とりあえず、もう少し試してみます。

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。