プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:Softimage Mod Tool
虞翻
虞翻
呉の文官。易学、儒学、医術に長けていた。荊州の戦いでは傅士仁に降伏勧告を行い説得に成功した。相手が誰であろうと構わず意見する剛直な性格。



◎問題点と対策方針

モデルインスタンスの中のボーンデータは、固定値ではなくモーション関連データでした。しかし同一モデルを複数回読み込む場合、モデルインスタンスは複製されず、参照値のみ返します。このままだと、同一モデルを複数表示することは可能ですが、ばらばらに動かすことはできません。

ここはやはりボーンデータを複製するのが理想的と思いますが、今の私のスキルレベルでは難しそうなので、まずはモデルインスタンスを丸ごと複製する方式を試みます。



◎Modelクラスのメソッド

まずModelクラスを確認すると、ボーン関連のコピーメソッドが3つありますが、CopyAbsoluteBoneTransformsTo()とCopyBoneTransformsTo()は今回の目的に合わなさそうです。

CopyBoneTransformsFromはトランスフォームのコピーに使えるかもしれませんが、トランスフォームの他にもボーンデータは存在するので、単独で使用しても目的は達成できないでしょう。

他にMemberwiseCloneという保護メソッドがあるのですが、「そもそも保護メソッドって何?」と思ってこちら(注:java)を参照すると…なんだ、protectedのことだったんですか(^^;

クラスから呼び出せないのに何でマニュアルに記載されているのか疑問だったのですが、オーバーライドやサブクラスなどのためだったんですね。

Modelクラスにコピーorクローン作成メソッドがあると楽だったのですが、そんな便利なものは無さそうです。



◎案1:Listのコピー

次に考えたのは、Listクラスのオブジェクトをコピーorクローン作成するという方法ですが…どうやるんでしょうか?(爆)

XNAではGCを問題視する記事をよく見かけたので、Listは敬遠してきました。お陰でいまだに使えません(^^;

これを機に勉強するのも良いかと思い、適当な記事を軽く流し読みしたのですが…今回はディープコピーに該当し、値か参照かを気にしつつ各要素を1つ1つコピーしなきゃいけないのかな?ConvertAllが使えるかもわからないし、先にテストプロジェクトを作っていろいろ試さないといけないなぁ…。

…そこまでやるぐらいなら、素直にボーンデータを複製した方が早そうです。他に良い方法は無いでしょうか?



◎案2:アセット名の一時的変更

同一モデルを複数回読み込む場合、モデルインスタンスが複製されないことが問題となっているわけですが、同一モデルか否かの判断基準は「アセット名が同一か否か?」だと思います。ということは、アセット名を変更すればこの問題を回避できるかもしれません。

1.Content.Loadでモデルデータを読み込む(初回読込)

2.メモリ内に作成されたインスタンスのアセット名を一時的に変更する

3.Content.Loadで同一のモデルデータを読み込む(2回目読込)

4.2.で変更したアセット名を元に戻す

これを実現すべく、アセット名の格納場所を調べていたら、ContentManagerにReadAsset保護メソッドがあることに気付きました。



◎案3:Loadメソッドのオーバーライド

ContentManagerのReadAssetは、Load メソッドをオーバーライドして使用することを想定した保護メソッドです。こちらにReadAssetのサンプルコードがありました。

ContentManagerの継承クラスを作成し、Load メソッドを書き変えることで、インスタンスが必ず複製されるようにします。新たに作成したContentManagerをModels.Addの引数に指定すると…



やりました!個別制御成功です!(^^)


この手法は

・手軽に実装できる
・コンテンツのデータ構造が変わっても影響を受けない
・モデルデータ以外のコンテンツデータにも適用可能
・ACLなど他のライブラリにも適用可能(たぶん)

などの長所があるので、場合によってはこれもアリでしょう。(HPにまとめておいた方がいいのかな?)

ただし、

・メッシュデータやエフェクトデータも複製されるため、メモリを無駄に消費する

という欠点があるので、インスタンスを大量に作成する場合は不向きです。



◎おまけ

私のC言語歴は15年間空白だったので、C#においても知らないことや曖昧なことが沢山あります。(ヘルプを読んでもわからないことだらけです(^^;)

これらを一度に全て理解するのは難しいので、調査中に気になったキーワードを少しずつ勉強しています。学習方針は‘行き当たりばったり’(笑)

というわけで、今回勉強したキーワードをメモがわりに記述しておきます。

値型と参照型
スタック領域やヒープ領域の認識がずれていたり、「パフォーマンスの問題」を殆ど無視してたことに気付きました。地形描画プログラムは、殆ど全部値渡しです(爆)

デリゲート
今回の調査中にデリゲートという単語が出てきたのでついでに勉強。



◎次回予告

ACLの頃からずっと懸案だった個別制御がやっとできたので、とりあえず良かったです(^^)

いずれボーンだけコピーする手法も確立したいと思いますが、先にACLへの適用テストと性能比較テストを行います。

スポンサーサイト

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

コメント

先生、質問!

てっきり自前で用意していたボーンマトリクス行列群をCopyBoneTransformsFrom()でModelインスタンスにセットすればよいのだと思ってましたが、
>トランスフォームの他にもボーンデータは存在するので
というのはどんなデータですか?


>キャラがアップになる
それならスキンに拘るのは止むを得ないですね。:-)

閃いた!?

youさんこんにちは~

>てっきり
基本的な考え方は私も同じです(^^)

>Modelインスタンスにセットすればよい
文中の段階において、セット先のModelインスタンスは参照(非複製)状態であったため、ボーントランスフォームをModelインスタンス0番目にセットすると、他のインスタンスのボーントランスフォームも全部同じ状態になってしまうでしょう。この状態を解消するため、Modelインスタンスを複製(ゼロから構築)しようと考えていました。

>どんなデータですか?
具体的には
Models[*].CrosswalkModel.Bones[*]
Models[*].CrosswalkModel.Bones[*].Name
Models[*].CrosswalkModel.Bones[*].Parent
Models[*].CrosswalkModel.Bones[*].Children
Models[*].CrosswalkModel.Bones[*].Index
などです。(CrosswalkModel=Modelクラス)

…こうして見ると、Name以降は複製する必要はありませんね。ボーントランスフォームをCopyBoneTransformsFrom()で退避&復元すれば、Bones[*]も複製しないで済むし…ブツブツ…ハッ!(何か閃いたらしい)

ちょっと試してみます。
どうもありがとうございました~!!

今、モデリングしてました(汗)

何かきっかけになったようでよかったです。:-)

Model.Bonesプロパティに含まれる要素の殆どはあくまでボーンの階層構造(静的)であって、動的に変更する必要があるのはマトリクスだけなんでしょうね。

>Modelインスタンスは参照(非複製)状態であったため
ちなみに自分はDraw()の段階で、同一モデルのキャラクター1体を描画するごとに、それらが共有するModelインスタンスにいちいちCopyFrom()でそれぞれのアニメの行列群をセットすることを考えていました。何がベターなのかはまだまだトライ&エラーです。


ちなみにご存知かも知れませんが、日本の開発チームでインディーズゲームでの配布に至ったところもあるようですね。シューティングゲームらしいですが。

できました!

yohさんモデリングもするんですか?凄いですね~
どのようなタイプのものを作っているのでしょうか?

>何かきっかけになったようでよかったです。:-)
お陰さまで、たった今ボーンだけコピーする手法が成功しました!どうもありがとうございました!_O_

>マトリクスだけなんでしょうね。
私もそう思いますw

>Draw()の段階で
私が今やった方法は、yohさんとHOSSIEさんの方法を両方実施したようなものです。詳細は次回の記事に記述します。

>何がベターなのかはまだまだトライ&エラーです。
私もまだまだなので頑張ります。

>日本の開発チームで
XBOXの配布サービス対象国が拡大されて、日本も対象になったって話ですよね?私もいずれ参加したいです。相当先になりそうですが(^^;

コメントの投稿


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

トラックバック


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



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