プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
槍兵再作成21
再作成中の槍兵モデル
画像が乱れまくっていたが、サイズと階層の問題をクリアして、ようやくXNAでまともにアニメするようになったらしい。



◎ボーン追加

槍と着物の裾のボーンを追加します。

1.AnimationManagerでDefaultPoseを選択

2.2Dチェインを描いてボーンを作成する
  →サイズ調整不可のため、ボーンの長さに注意すること

3.作成したボーン階層をGlobalSRT階層下の
  最適な位置に移動する

4.移動したボーン階層の各ノードの名称と座標を調整する

5.移動したボーン階層のうち、ルートとEffを除くボーンを
  envelope_group直下にドラッグ&ドロップする

6.エンベロープを再設定する
  →コントローラをデフォーマに含めないよう注意すべき?

7.必要に応じてアクションを作成しPublishする

シャドウリグ方式をやめたので、手順は以前より少しシンプルになりました。



◎槍中継ボーンのサイズ

XNAではボーンはルートからツリー状に連結する必要があるため、槍ボーンは中継ボーンを含めて2本使用します。
この状態で槍を持つ位置を変える場合、中継ボーンのサイズ変更が自動的に発生します。

槍の下方を持つ場合   槍の中間を持つ場合

しかし、ボーン数増加改修に伴いサイズ変更機能が無くなったため、XNAでは表示がおかしくなってしまいます。スケール変更機能は不要と思っていたのですが、こんな所で無意識に使っていたのですね…。

槍のトランスフォーム座標を変えるだけで表現できないかと試してみたのですが、このボーン構造の場合、どうしてもスケール変更が発生するようです。どうしたものかなぁ…。

槍などの武器を兵士とは別モデルとして扱うようにすれば、武器の位置をプログラムで自在に制御できますが、手の位置や回転を把握しながら武器モデルを連動させるプログラムを組むのは面倒です。RPGのように武器を換装するゲームならともかく、今回は連画を取得したいだけなので、面倒なプログラムはなるべく避けたいものです。

待てよ?Softimage上で2つのモデルを連携動作させて、XNAで2つのモデルを同時再生すれば、改修せずとも武器の座標が連動するのでは?それでダメなら、槍を持つ位置をずらすアニメシーンをカット(削除)するとか(爆)

Softimageで一度追加したボーンは削除不可能なので、やり直しができません。どうしたものかなぁ…。



◎メッシュが消えた!?

よく考えたら、着物の裾ボーンやウエイト設定などの兵士共通事項を先に行った方が、他のモデルに流用しやすいですね。というわけで、先に着物の裾ボーンをやります。

着物の裾ボーンで難しいのは、階層上の配置場所とコンストレイン(連動)設定です。最初は腰の下に配置してコンストレインを設定したのですが、ボーンが動きません。左右それぞれの腿の下に配置したら動いたのですが、これだと階層下のボーンが自動的に連動しただけっぽいなぁ…。

コンストレインは一旦保留とし、ここでエンベロープを再設定してXNAで動きを確認すると…描画が乱れまくって見るに堪えない状態でした。

槍兵再作成14

いくら何でも崩れすぎなので原因を調べると、いつの間にかSoftimageの階層からkimono2のメッシュノードが無くなってました。

はや?メイン画面にメッシュは存在するのに、階層上にノード不在なんてことがあるのでしょうか?それともどこか深い階層に存在するのか?はたまたピンポイントで表示消去されたのか?

階層内を検索する方法がよくわからないので状況が掴めないのですが、メイン画面でメッシュ選択後にSelect>選択ボタンを押すと、Biped.kimono2階層が表示されたので、このメッシュノード階層をエクスプローラ上の全体階層にドラッグ&ドロップしたら元通りになりました。

ちなみに、Softimageエクスプローラで検索する際は「*kimono2*」みたいに記述しないとヒットしません(後で気付いた)。



◎envelope_groupの整理

階層構造は元通りになりましたが、以前から画像の乱れが気になっていたので、個々のメッシュ毎にエンベロープを再設定することにしました。

しかしenvelope_groupの下のボーンが多すぎて個別選択がやりにくいです。グループを新規作成して階層的にまとめられないか試してみましたが、グループ作成機能=リンク作成機能らしくて(?)、いまいち思い通りに整理できません。

ですが、試しているうちに「グループから削除」で不要なボーンをenvelope_groupから削除すれば良いことに気付きました。親指&中指以外は不要なので、不要指3本×指1本につき3ボーン×両手=18本をenvelope_groupから削除。

envelope_groupの中がすっきりした上に、XNA使用ボーン数も節約できました。



◎腕がおかしい

個々のメッシュ毎にエンベロープを再設定し、途中でXNAで表示確認すると画像が凄く乱れます。どうやらルートボーンから順番に設定しないと回転がうまく引き継がれない模様。

そこでルートボーンに近いメッシュから1つ1つ個別に設定していくと、腕以外は上手くできたのですが、腕のエンベロープを設定すると画像が乱れます。

槍兵再作成15

コントローラをデフォーマに含めたりenvelope_groupに入れると表示状態は変わりますが、SoftimageとXNAで腕の方向が正反対だったりしてなかなか上手くいきません。

結局、Arm1(腕メッシュ)は

1.腕コントローラのキーを全て削除する
2.DefaultPoseに戻す
3.腕ボーンに「ニュートラルポーズの設定」
  「すべての変換をフリーズ」
4.腕コントローラのキーを付け直す(モーション再作成)

上記のようにしてクリアな状態からモーションを再作成したら直りました。しかしArm2(手首メッシュ)はこれでも直らず、デフォーマからLHand(左手ボーン)を除いたら直りました。ちなみに、RHand(右手ボーン)はデフォーマに指定しても崩れません。謎すぎる…。



◎作り直し

一部のボーンをデフォーマから削除すると、今後のモーション作成に支障を来します。そもそも、XNAで表示が崩れるのは何故でしょうか?

ニュートラルポーズを使用したから?
リグをクォータニオンHLSLで動かしたから?

考えても結論が出ないので、思いきって1から作り直すことにしました。本来はメッシュに合わせてガイドを修正すべきですが、今回はガイドに合わせてメッシュを修正し、ニュートラルポーズは一切使用しません。

槍兵再作成16   槍兵再作成17

結論から言いますと、見ての通りXNAで動かすと崩れました。足元が少しだけ動いて、腕など上部に行くほど本来より大きく動きすぎるので、可動時の移動量にサイズが加味されていない気がします。

ちなみに、手はSoftimage上でオブジェクトのセンターを上にずらしてから回転させたのですが、XNAでは綺麗に反映されないようです。



◎原因はサイズ

試しにエンベロープを外してみると、(当然動きませんが)手も含めて綺麗に表示されます。つまり、メッシュの頂点データはきちんと渡されているが、ボーンアニメの座標計算は失敗した、ということです。

では何故失敗したのか?

槍兵モデルとSoftimageのガイドは大きさが異なるので、ガイド又はメッシュの全体サイズを変更する必要があります。以前はガイド、今回はメッシュの全体サイズを変更したのですが、クォータニオンHLSLは、サイズはサポート対象外です。

つまり‘モデルとガイドの大きさが異なること’が原因だったのです!

…それで延々と試行錯誤してたかと思うと、てめーのバカさ加減に愛想が尽きますね(>_<)



◎サイズの座標系

Softimageの座標系は、選択対称によって自動的に切り替わります。例えば、

・オブジェクト選択時:ビュー座標系
・s(サイズ)選択時:ローカル座標系
・r(回転)選択時:グローバル座標系

といった具合です。

01:オブジェクト選択時:ビュー座標系   02:s(サイズ)選択時はローカル座標系   03:r(回転)選択時はグローバル座標系

s(サイズ)を選択すると常に1と表示されるので、クォータニオンHLSLでも問題無いと思っていたのですが、r(回転)を選択してサイズの値を確認するとグローバル座標はルートのサイズ値を引き継いでました。

XNAのクォータニオンHLSLで動作させるためには、グローバル座標系でサイズを1にする必要があるので、全メッシュを選択して「すべての変換をフリーズ」とします。

槍兵再作成18   槍兵再作成19

サイズの問題は解消しました。しかし手首から先はおかしいですね。これは別の問題のようです。



◎GlobalSRT階層の修正

手首の位置にコントローラがあって、その先のボーンの位置情報が伝わっていないようです。コントローラをenvelope_groupに追加してエンベロープを再設定したりしましたが、どうにも上手くいきません。

GlobalSRT階層を見ると、手首から先のボーンは手首コントローラの下にありますが、そもそも手首コントローラが肘ボーンの先ではなく肩先に付いてます。これはXNA的には正しくない気がするのですが…でも、その肘ボーンは肩とは別の所から伸びてます。う~ん…。

これで何故腕がきちんと動くのか分かりませんが、とりあえず手首から先のボーンを肘の下に移動してエンベロープの再設定&アニメ再設定を行いました。

槍兵再作成20   槍兵再作成21

おお、直った!

デフォルトのリグ階層はXNAと合わない部分がある、ということですね。



◎次回予告

サイズと階層の2つの問題が重なっていたため、原因究明に時間かかってしまいました。シャドウリグ方式をやめたら試行錯誤時間減ると思ったのに、相変わらずです。トホホ…。

8月になったので、次回は「7月の総括と8月の目標」です。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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