プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:Softimage Mod Tool
趙儼
趙儼(ちょうげん)
魏の軍政家。荊州の戦いでは徐晃と共に援軍として駆けつけ、曹仁の救出を急ぐ軍内の意見を抑えて万全の体制をとるよう主張し、さらなる援軍を迎えて関羽を破った。敗走する関羽を追撃すべしとの意見を抑え、呉と蜀の争いになる展開を予測し、水を差さないよう進言した。



◎モデルの複数表示

モデルを複数表示できるようにXNAViewerを改修しました。
槍兵、ロボット、キャプテンが同時にアニメーションします。

槍兵モデル複数表示

iキーを押す毎に槍兵を1体追加するようにしたら、増やせば増やすほどアニメーションが速くなるという不思議な状態になりました。普通逆でしょ?(^^;

○10秒あたりに突く回数
  1体:2回
  2体:4回
  3体:6回

これはプログラムの問題でしょうか?
モデルの問題でしょうか?



◎試行1:モーションを個別に割り当てる

ロボットが増えるよう改修し、いろいろ試してみました。

ロボットモデル複数表示

ロボットモデルには3種類のモーションがありますが、5体のロボットに別々のモーションを割り当てようとしても、皆同じモーションになってしまいます。

また、モーションの速度は、5体に割り当てたモーション速度の合計値に影響しているようです。これはつまり、モデルじゃなくてプログラムの問題ですね。


XNAViewerは、リスト型のModelsにAddメソッドでインスタンスを追加していますが、同一クラスのインスタンスを追加するやり方だと、実はACLでも同様の現象が発生します。3Dテストプログラムのフロントダンサーが、3人揃って同じ動作をするのはこの応用です。…って当時はわけもわからずやってました(笑)



◎試行2:別名インスタンスによる個別制御

3Dテストプログラムでは、フロントダンサーとメインダンサーで別々の動作をさせるために別々のクラスを作成しましたが、XNAViewerランタイムでもそのようにしないといけないのでしょうか?

試しに別名のインスタンスを作成してみました。
Models = new List();
Models2 = new List();

別名インスタンスによる個別制御テスト

下列3体がModels、上列3体がModels2です。上下で別々のモーションをセットしても、同じ動きになりました。途中で別のモデルを混ぜても関係ありません。

…やっぱりこうなるんですね。昔ACLでも同じ実験をして同じ結果になりました。C言語のインスタンスの概念からすると、別名でも同名でも一緒というのは理解できます。


しかしモデルが異なると個別制御できるのに、同一モデルだと個別制御できない理由はいまいち理解できません。この問題は何とかしないと「メインマップに複数の同一ユニットを表示し、バラバラに動かす」といったことができません。もう少し調べてみましょう。



◎試行3:コンテナを個別に用意する

これまでコンテナ(SASData)は共通的に使用してきましたが、もしやこれが関係してるのかと思い、試しに別名インスタンスのコンテナを作成して個別に割り当ててみました。

…しかし結果は変わりませんでした。
コンテナは関係無さそうです。



◎プログラム調査

仕方が無いので、プログラムを詳しく調査します。

まず、カレントモーション(現在動作中のモーション)番号の格納先を確認すると、ModelAssetクラスのAnimationIndexでした。動作中の値を確認すると、各インスタンス毎に異なる値(正しい値)を保持してました。ということは、この値を参照するよう改修すると、問題が解決できそうです。

…と、ここまでは順当に判明したものの、この先が難解でした。


一番怪しいのは、DrawModel()内の
XSIAnimationData l_Animations = m.Tag as XSIAnimationData;
と記述された部分です。モデルのタグからアニメーション情報を逆引き(?)してるようですが、m.Tagは(同一モデルの場合)同じインスタンスモデルを指すのかもしれません。

試しにCrosswalkModel.Tag.GetHashCode()としてハッシュコードを取得すると、同一モデルには同じ値が入ってました。

Tag = 33736294(ロボット)
Tag = 35191196(キャプテン)
Tag = 33736294(ロボット)
Tag = 33736294(ロボット)
Tag = 33736294(ロボット)

ハッシュコードがどういうものかよく知らないのではっきりとは言えませんが、前述の仮説は正しそうな気がします。



◎試行4:タグの書き換え

ModelAssetのLoadContent()を見ると、タグにはModelsインスタンスの個別参照値がセットされてもおかしくなさそうですが、実際には同じ参照値がセットされるようです。
ではどうするか?

試しに、Content.Load直後にタグを連番や新規生成ハッシュコードで強引に書き変えてみましたが、実行時に例外エラーで落ちました。タグにはモデルのインスタンスを渡しておかないとダメなのかもしれません。

よく考えると、同一モデルのインスタンスのタグに同じ参照値がセットされるのは、Content.Loadの際に重複読込をしないで(最初に読み込んだモデルの)参照値だけ返しているのかもしれません。その方がメモリを節約できますからね。

もしそうだとすると、メモリ内のモデルデータは1つしか存在しないので、タグの書き変えは不可能ということになります。



◎次回予告

というわけで目一杯ハマってますが(汗)、これは何とかしないといけない問題なので、もう少し粘ります。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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