2017-04

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

3D座標をスクリーン座標に変換する

最近はスプライト周りの整備をやっています。おおまかな仕組みはできたので、いろいろ実験したりしています。先日のインターフェースデザインでも描いたように敵にダメージを与えたときにダメージ値を画面にだしたいと思っています。ダメージ値は2次元のスプライトなのでスクリーン座標で指定します。つまり左上が0で右下が画面解像度と同じという感じです。ですが、敵は3次元座標上にいるので、3次元座標をスクリーン座標に変換しないといけません。今回はこの辺の実装をやってみました。
090212_2Don3D.jpg
どのゲームでも当たり前に使われている技術なので、XNAでも簡単にできるんだろうと思っていたのですが、意外にも機能としてはないようです。といってもちゃんと調べてはいないですが…。まぁ、そんなに大変ではないだろうと思い、ネットで調べながらやってみたのですが…。うまくいかない…。
ビュー行列と射影行列を掛けるとこまではわかるのですが、それでできる数値は-20から20前後という謎な値しか帰ってきません。確かに移動に合わせて数値は変わるのですが…!?
どうやらさらにスクリーン座標変換をしないといけないようです。確かに射影行列には解像度に関する情報をまったく渡していないのですから、当然といえば当然ですよね。というわけで、こんな感じにしました。最後にWで割るというのが大事なようですね。う~ん、なぜ?

Matrix World = Matrix.CreateTranslation(PlayerPos);
Matrix Screen = Matrix.Identity;
Screen.M11 = (float)ScreenWidth * 0.5f;
Screen.M41 = (float)ScreenWidth * 0.5ff;
Screen.M22 = (float)ScreenHeight * -0.5f;
Screen.M42 = (float)ScreenHeight * 0.5f;
Matrix OutMatrix = World * View * Projection * Screen;
Vector2 SpritePos = new Vector2( OutMatrix.M41 / OutMatrix.M44, OutMatrix.M42 / OutMatrix.M44);

ScreenWidthとScreenHeightは画面解像度の縦と横幅がintで入っています。
ViewとProjectionはMatrixで、それぞれビュー行列と射影行列が入っています。
PlayerPosは主人公の立ち位置が入っているVector3です。

● COMMENT FORM ●

こんばんわ~。

 私の場合は360で動かした事がない上に、ウィンドウサイズを変更できる仕様にしているので、Karu_gamoさんの話のように私もスプライト表示にスクリーン座標変換をしています。
 描画自体はSpriteBatchとかで簡単に描画できますが、スクリーン座標変換とかメンドイですよね。
 決め打ちで「ここの座標」とかにしてしまえば、いいのかもしれませんが、後で「スクリーンサイズを変えたい」とかなると、やっぱり変換する仕組みは作っておかないといけないですよね。

お邪魔します。
ずばり Viewport.Project というメソッドがあります。
XNA のドキュメントにもサンプルがありますよ。

Re: タイトルなし

>> OKIさん
ウィンドウサイズ可変ってスゴイですね~!
Winは解像度が決め打ちしにくいからどうしようか検討しています。4:3か16:9も決められないし…。

>> Juneさん
始めまして~!
Viewportの情報ありがとうございます。やっぱりあったのですね…。Viewportでしたか~。ずっとVector3とかMatrixをあたりを探していましたよ…。ドキュメントも一通り目は通しましたが、そろそろ脳内から記憶が薄れてきた感じがします。3.0用も出たことですし、もっかい読むかな~。

こんにちは~(^^)

>ウィンドウサイズ可変ってスゴイですね~!

昨月お渡しした、Sample Action Game 3Dの起動オプションに、

 SCREEN_XY=X座標,Y座標 SCREEN_WH=幅,高さ

を渡して起動すると、起動時のウィンドウの表示座標と、大きさを設定できますw
実行時のウィンドウサイズは変えられないのですが、内部では毎回スケーリング処理を行っているので、UIが実装されていないだけという感じです。
ウィンドウの位置(XY)は、Windows APIをC#から呼びだしてしまっているので、少し反則技かもしれないです(^^ゞ
…といっても、先月ファミレスで話したとおり、「今はまだ360で動かす事を考えていない…」というのと、「もしかしたら、XNAじゃない言語にポーティングするかもしれない」という思惑があるので、実装は結構アナーキーでやっています。

それでは~♪

Re: タイトルなし

こんばんわ~。

さすがですね!細かいところまで行き届いている!
いろいろとイジってみたいと思いますwwww


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

トラックバック

http://karuduck.blog50.fc2.com/tb.php/98-9965a8bd
この記事にトラックバックする(FC2ブログユーザー)

NEW ENTRY «  | BLOG TOP |  » OLD ENTRY

プロフィール

Karu_gamo

Author:Karu_gamo
<メールアドレス>
karu_gamo#hotmail.co.jp
#を@に置き換えてえてください。

<自分リンク>
かるがも研究所【新】
YouTubeチャンネル
公開素材置き場
仕様書
旧ブログ(見るとこないです)
管理者ページ

リンク

YouTube動画

FC2カウンター

カテゴリー

Twitter

 

月別アーカイブ

RSSフィード

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。