プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:Softimage Mod Tool
董衡   董超
董衡(左図)、董超(右図)
魏の武将。ホウ徳の配下。荊州の戦いで形勢が不利になり、関羽に降伏しようとしたが、これを知ったホウ徳に殺害された。



◎トラックバック

トラックバックを頂いたのに、不覚にもしばらく気付いてなかったのですが、記事を拝見すると、私のブログは「分かりやすくてとてもいい」とありました。

自分のブログの評価を目にするのは初めてですが、まさかこのようなご好評を頂けるとは…dai.alphaさん、どうもありがとうございました!

ドイツでは参考書の入手や翻訳など大変そうですが、負けずに頑張ってください!!



◎XNAViewerプログラム解析

XNAViewerのプログラムは、以前ざっと見たことがあるのですが、プログラミングのリハビリを兼ねて、もう一度見てみましょう。


最初にModelAssetクラスを作成しています。ACLではモデルデータとアニメーションデータを別々のクラスで管理しますが、こちらはModelAssetクラスにまとめて管理するようです。

LoadContent()では、「Models = ~;」と「Models.Add(~);」でモデルデータを読み込んでいます。

Update()では、ゲームパッドの操作に応じてパラメータを変更しています。

Draw()では、「DrawModel(~);」でモデルを表示しています。


一見分かりにくいのは「Positionはカメラ座標だ」ということ。ではモデルのワールド座標はどこにあるかというと、

Models[CurrentModel].CrosswalkModel.Meshes[*].Effects[*].Parameters["World"]
(注:*は数値)

ここにあります。座標をセットする時は「~.SetValue(world);」のようにやります。


…恥ずかしい話ですが、プログラミング感覚をすっかり忘れていたため、ここまで把握する(というか思い出す)のに半日近くかかってしまいました(^_^;



◎ワールド座標のパラメータ名

DrawModel()を一見した時は、そのまま自作ゲームにコピーして流用できる部品かと思ったのですが、このままだとワールド座標が変更されないので、流用する場合は改修が必要ですね。

で、ワールド座標を渡してセットするよう改修したら、実行時にエラーとなりました。
…あれ?まだ何か忘れてるのかな?

effect.Parameters["World"].SetValue(world);

パラメータ名が違うかもしれないので、他にWORLD、world、VIEW、View、viewなどを試すと、Viewだけ正常に動作し、他はエラーとなりました。Viewパラメータが存在するのに、何故Worldがエラー?

シェーダの内容を確認すべく、Lambert.fxから呼び出されていたxsi_defaultvs.hlslの中身を確認すると、

float4x4 Model : WORLD;

とありました。Softimage添付のfxファイルはこれで統一しているようですが、ワールド座標のパラメータ名が「Model」というのは一般的なんでしょうか??

とりあえず、パラメータ名をModelに変更したら、エラーは出なくなりました。しかし、スケールや座標の値を適当に変更しても、画面に変化は見られません。

…まだ何か落とし穴が?それともやり方が根本的に間違ってる??



◎SASDataについて

プログラムを見てて気になるのが、XSISASContainerクラスのインスタンスであるSASDataです。DrawModel内に

// bind all other parameters
foreach (EffectParameter Parameter in effect.Parameters)
{
  SASData.SetEffectParameterValue(Parameter);
}

とあるので、このコードの前に

effect.Parameters["Model"].SetValue(world);

としておけばエフェクトパラメータを渡してくれると思ったのですが、違うようですね。


試しに

SASData.Model = transforms[mesh.ParentBone.Index];
SASData.Model = world; // この行を追加
SASData.ComputeModel();

このように記述してみましたが、これでも変化がありません。



◎比較用モデルを表示する

試行錯誤を続けるうちに、ある疑念が湧いてきました。コンテナのワールド座標を変更したとすると、カメラも同様に移動して、見た目が変わらないように見えるのでは?

この疑念は、ランタイムで表示したモデルと、ランタイムを使用せずに表示したモデルを、同時に画面表示すれば解明できます。

しかしXNAViewerプログラムに他のモデルを追加すると、Content Importerの選択肢に、標準インポータである「X File - XNA Framework」が存在しません。

標準インポータは「Microsoft.Xna.Framework.Content.Pipeline.XImporter」らしいので、これを参照設定で追加すると、メモリエラーなど怪しいエラーが続発。ひょっとして、ランタイムと標準インポータは相性が悪いので除外してるとか?

しかしその後XNAを再起動すると問題無く動作しました。インポータを追加したらXNAを再起動した方が無難かもしれません。

比較用モデル表示

ワールド座標を変更すると、XNA標準機能で表示したモデルは移動しますが、ランタイムで表示したモデルは移動しません。先程の疑念は晴れましたが、ランタイム表示モデルを移動する方法は謎のままです。


尚、ランタイム表示モデルは片方ずつアニメーションします。モデルを大量に表示して、同時アニメーションがどこまで耐えられるか評価テストをしたかったのですが、ワールド座標が変更できないと話になりません。



◎次回予告

ヘルプを見ても、この辺のことは全く触れられてないようなんですが、「その程度のことにいちいち説明はいらんだろう」ってことなんでしょうか?

…その程度のことが出来ずに詰まってる自分が情けなさすぎ(>_<)

できればさっさとクリアして、性能テストやACLとの比較などをしたいなぁと思っています。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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