プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
不完全ビルボード
ビルボード模索中の画面
カメラの角度に応じてモデルの角度も変わるが、よく見ると左右のモデルの角度がおかしい。



◎ビルボードの検証

こちらの記事によると、ビルボードを実装するには、ビュー行列の逆行列を使うらしいです。

XNAのヘルプによると、Matrix.Invertメソッドで逆行列を計算できるので、その結果を槍兵モデルのviewにセットすると、場所も向きも滅茶苦茶に(爆)

「使うのは3x3の部分だけです」というのが関係しているようですが、view行列の中身は全く理解してないので、いまいちピンときません。コード例はDirectXですが、とりあえずXNAで真似てみましょう。

// ビューの逆行列を算出する
Matrix view2 = Matrix.Invert(view);
world.M11 = view2.M11;
world.M21 = view2.M12;
world.M31 = view2.M13;
world.M12 = view2.M21;
world.M22 = view2.M22;
world.M32 = view2.M23;
world.M13 = view2.M31;
world.M23 = view2.M32;
world.M33 = view2.M33;


ビルボード01

場所は良さそうですが、スケールが豆粒のように小さくなってしまいました。スケールの値を変更しても大きさは変わりません。う~む…。



◎日本語版公式サンプル?

XNAのサンプルを探そうとしたら、ビルボードの公式サンプルを見付けました。いや、英語版は昔からあったのですが、日本語化されてる…?

今年7月からXNA CREATORS CLUB ONLINEの日本語公式サイトがスタートしたのは知ってましたが、最初に見た時は、日本語サンプルが無くてがっかりしました。いつの間にか、日本語サンプルが増えたようですね。

しかしサンプルをダウンロードすると、ソースは英語版のままでがっかり。紹介記事だけじゃなくて、コメントも日本語化してくれるとありがたいのですが…。

ちなみに、ビルボードの公式サンプルは、私のPCだとハードエラーになります。モデルを入れ替えれば動くでしょうが、どうせコメントは英語だと思うと、ちょっと気力が…(萎)

他のサンプルを探しましょう。



◎ビルさん?

こちらにビルボードのサンプルらしきものがありました。画像を一目見てニヤリ!w

しかしコードをざっと見ると、最初のDirectXの時とかなり違うようです。3x3以外を初期化してるし、逆ベクトルを2回かけてるようですが、なぜ2回?これが3x3の入れ替えに相当するのかなぁ?

…これは、ちゃんと基礎から勉強しないとダメってことですかね?とりあえず画面の様子を確認したいだけなので、どっかのコードをパクッて出来ると良かったのですが…。



◎スケールの修正

コードを眺めていたら、Matrixの掛け算は順序が影響することを思い出しました。もしかしたら、掛ける順番を変えればスケールが反映されるかも?

逆回転

とりあえず、スケールは直りました。カメラの角度と連動してモデルの角度が変わり、横から見ても平べったくなりません。

しかしカメラを左に向けたらモデルが右に回転し、カメラを右に向けたらモデルが左回転するので、モデルが寝転んでしまいます。回転が逆のようですね。



◎逆回転の修正

逆回転と言えば、ビルさんのサンプルで触れてましたね。そこでビルさんの最初のソースや最後のソースを真似てみると…逆回転は直りました。

しかしdAng1とdAng2が0のままだと、カメラに対してモデルが垂直になり、殆ど表示されません。そこで、dAng1=45とすると、表示はされましたが、位置がおかしくなりました。

空中に配置された兵士

静止画だとわかりにくいですが、空中に配置されています。dAng1で向きが変わるのはわかりますが、位置が影響されるのはおかしい気がするのですが…。

結局、ビルさんの最初のソースをベースに、ちょっと手直ししました。

float dAng1 = 45;
float dAng2 = 0;
Matrix mWang;

Matrix viewInvert = Matrix.Invert(view);
viewInvert.M14 = 0.0f;
viewInvert.M24 = 0.0f;
viewInvert.M34 = 0.0f;
viewInvert.M41 = 0.0f;
viewInvert.M42 = 0.0f;
viewInvert.M43 = 0.0f;
viewInvert.M44 = 1.0f;

mWang = Matrix.CreateRotationX(dAng1) * Matrix.CreateRotationY(dAng2);
Matrix world = Matrix.CreateScale(5.0f) * viewInvert * mWang * Matrix.CreateTranslation(pos);


スケールと位置はOKです。逆回転も直りました。
これで出来たかな?と思ったのですが、よく見ると左右のモデルの角度がカメラに平行ではありません(冒頭図参照)。

うーん、まだ不完全なようですね。



◎次回予告

ここ1週間ばかり、用事がいろいろ重なって時間が取れずにいましたが、どれも一段落したようなので次回から通常ペースに戻ります。

ビルボードはちゃんと理解しないとダメっぽいですね。カメラの向きを逆にするだけだから、パクるだけでいけるかと思っていたのですが、甘かったです。勉強し直して最後まで追及すべきか悩みどころですが、今はペースが掴めないので一旦保留とします。

次回は、マップ画像を複数化したり、ユニットの方向転換をスムーズにしたりする予定です。

スポンサーサイト

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

コメント

ビルボードって以前ウチも試していましたが
Matrix.CreateBillboardとか
CreateConstrainedBillboardを使ってましたねぇ

ちなみにクリエイターズクラブの一部サンプルは
コメントまで完全日本語版になってるのもありますよ

そうですね

私もビルボードはHOSSIEさんの仰っている
XNAのメソッドを使ってくださいねというつもりでした。 (^^;

結構、色々ありますよ。XNAの便利メソッド。

ありがとうございます!

そんな便利なものがあったのですね!
HOSSIEさん、yohさん、どうもありがとうございます!!

>コメントまで完全日本語版になってるのもありますよ
おお、そうですか!
今後はとりあえずダウンロードして中身を確認するようにします。

>結構、色々ありますよ。XNAの便利メソッド。
そのものズバリのメソッドがあるとは思いませんでした。XNAあなどりがたし!w
今後はしっかりチェックするよう心掛けます。

コメントの投稿


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

トラックバック


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



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