プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
ブラウザ三国志
ブラウザ三国志
基本プレイ無料の三国志戦略シミュレーションゲーム。城内建設などは他のWebゲームと同様だが、武将はカードとして表現されている。



◎ボーン数の上限について

前回コメントで、yohさんから「ボーン数制限はXNA本体ではなくエフェクトファイル」との指摘を頂いたので、ひにけにXNAの記事を読んでみました。

こちらの記事では、ボーン数を増やす手法が4つ(モデルを分割する案も含めると5つ)紹介されています。手法によって最大ボーン数が異なるようですが、そもそも幾つぐらい必要なのでしょうか?

Softimageで「キャラクタ > 二足ガイドからリグ作成」で作成したデフォルトキャラクタのボーン数を「XNA Game Studio > Diagnose Models」で調べる(詳細は後述)と、ボーン数は76っぽいです。

一番簡単な手法の最大ボーン数は79なので、デフォルトキャラクタならギリギリ足りそうですね。槍とか裾とか改造するとすぐに不足しそうですが、その時は他の手法で増やせるかもしれません。

とりあえず、一番簡単な手法を試してみましょう。上手くいけば、シャドウリグ方式をやめてリグを直接XNAに渡せるかもしれません。そうなれば「XNAで動かない~!」などと毎回試行錯誤している時間が、大幅に削減できそうです。

ちなみに、骨が増えるとXNA上の描画パフォーマンスは低下しますが、連画を取得してUVアニメで表示するので、本番ゲームのパフォーマンスには影響しません。



◎テスト環境構築

ボーン数増加テストを行う前に、テスト環境を準備します。

1.テスト用XNAViewのセットアップ
2.槍兵モデルを追加して動作確認
3.新規モデル作成

HPの記事を参考に、シャドウリグ無しでテスト用新規モデルを作成しました。簡単なモーションを作成し、マテリアル設定はDirectXシェーダに置き換えてXNAに出力。

ボーン数増加テスト01   ボーン数増加テスト02
Softimage(左図)とXNA(右図)の画面

今回は、プリミティブを取得した際に作成されたMan_Character>Characterを、意識的に移動しませんでした。このため、XNAにリグ(ボーン含む)情報は渡されず、XNAでは初期ポーズのまま動きません。

とりあえず、マテリアル設定等はOKですね。



◎前々回と同じ

今度は、ボーン情報付きでXNAに渡してみましょう。

メッシュ(Man_Character>Character)階層をBiped直下に移動し、BipedをXNAモデルにコンバートして、今後はBipedをXNAに出力します。すると、ビルドに成功してXNAViewerが起動しますが、表示モデルをこのモデルに切り替えると、下記エラーが発生しました。

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

前々回と同じエラーが同じ場所(Softimage提供XNAコード)で発生しました。…どういうことでしょうか?

今回のエラーはボーン数オーバーの可能性が高いと思うのですが、であるならば、前々回でエラーが出た時も、実はボーン数オーバーだったのでしょうか?

もしかして、旗の根元のボーンを削ったから、エラーは回避できたけど旗が動かなくなったのかも…??



◎旗が動いた!

旗手モデルのシャドウリグやエンベロープ設定をやり直してみましょう。今度は、旗の棒ボーンだけ追加します。

旗手06

おお!

スケールが反映されていないらしく、見た目はアレですが、XNAで動きました。前項の推測が正しかったようですね。



◎ところが

しばらくして気付いたのですが、Biped_Shadow直下にあるはずの旗メッシュが見当たりません。探し出すと、BipedShadow→GrobalSRT→~→RHand→FlagRoot→FlagRoot→FlagEffの下にありました。

GlobalSRT階層化のメッシュ

操作ミスか何かで無意識に移動してしまったのでしょうか?
しかしこれをBiped_Shadow直下に戻すと、XNAでアニメしなくなりました。先程の階層に戻すとアニメします。(Softimageではいずれもアニメします)。

もしかすると、CreateShadowPartsでパーツを作成した時に自動的に移動したのかもしれませんが、‘GlobalSRT階層下にメッシュがないとXNAでアニメしないケースがある’というのは初耳です。

そういえば、GlobalSRT階層下にeffを置くのは初めてかもしれません。と言っても、デフォルトではリグとシャドウリグで名称や階層が異なるのでよくわかりませんが…。

ともかく、シャドウリグは以前にも増して‘謎だらけ’ってカンジです(汗)



◎ボーン数確認方法について

Softimageの「XNA Game Studio > Diagnose Models」は、作成したSoftimageモデルがXNAで表示可能かチェックする機能です。下記のダイアログが表示されます。

DiagnoseModels

デフォルトでは「Max Number of Bones」が58なので、これをワザと0に設定すると、ボーン数が1以上のものはエラーで出力されます。

ログのサンプル(槍兵モデル)

ログの後半に
[ERROR] "Biped_Shadow.Arm1" has more than 0 bones. (20 bones)
などと書かれた行があります。これを抜粋したのが以下のテキストです。

ボーン数抜粋テキスト(槍兵モデル)

テキストのボーン数を合計すると294になってしまいますが、この槍兵モデルはXNAでスキンアニメするので、ボーン数は58以下のはずです。

恐らく、クラスタ(XNAではModelMeshPart)単位のチェックと思いますが、ルートボーンからそのクラスタの末端までのボーン数と考えると、槍(rance)が33ボーンというのも納得できます(槍のボーン数は1本ですが、右手先に付けています)。

実際、デフォルトでは各数値が58を超えない限り、エラーにはなりませんし、XNAのシェーダがModelMeshPart単位で処理されることを考えると、それが正しいと思います。

そう考えると、前々回及び今回のエラー原因は、‘ボーン数超過’ではなく‘階層構造の不正’かもしれません。



◎整理

話がゴチャゴチャしてきたので、一応整理しておきましょう。

・前々回及び今回のエラー原因は不明
 →ボーン数超過又はBiped_Shadow階層がXNAと不整合?

・旗がXNAでアニメしなかったのは、
 GlobalSRT階層下にメッシュがなかったため
 →他の方法はあるかもしれないが、今回の原因はコレ

エラーの件と、アニメしない件は別物です。混同すると原因がわかりにくくなるので注意が必要ですね。



◎次回予告

「ひょうたんから駒」ということわざがありますが、図らずも旗がXNAで動くようになりました。(それはそれで嬉しいw)

しかし旗手関連はひとまず保留にして、次回は「Softimageのボーン数上限を増やす(その2)」の予定です。成功したら、シャドウリグ方式をやめてモデルを作り直すかもしれないので。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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