【DiretX】3Dの座標からピクセル単位の座標へ変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
奥兵

【DiretX】3Dの座標からピクセル単位の座標へ変換

#1

投稿記事 by 奥兵 » 14年前

DirectXでのプログラミングにおいて板ポリゴンを表示する際の座標についての質問です。
DirectXで板ポリゴンを表示する際、DXライブラリで2Dを表示する時のようにウィンドウの左上を0.0としてピクセル単位で表示したいと思い
自分でいろいろ調べては見たのですがさっぱりでした。どなたかアドバイスお願いします。
ちなみにDirectXは10です。

   

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#2

投稿記事 by beatle » 14年前

3D空間からディスプレイ座標への変換は、基本的にカメラによって行われます。カメラはカメラの位置とカメラの角度、それからカメラの視野角により、3D空間のオブジェクトをディスプレイ座標に変換します。
実際にはカメラの位置、角度、視野角を設定すると「プロジェクション行列」という行列が生成されて、その行列と3D座標の積により座標の変換が行われます。

普通はカメラを設定してやれば3D座標からディスプレイ座標になりますが、手動でやりたいときはプロジェクション行列(投影行列)を自分で生成して、板ポリゴンの角の3D座標に乗じて、その結果を2D座標として描画すればいいのではないでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#3

投稿記事 by softya(ソフト屋) » 14年前

単に表示するだけなら3D空間に2Dを混ぜて表示したほうが早いです。
[補足] すいません。DirectX10を見落としていました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#4

投稿記事 by 奥兵 » 14年前

お二人ともアドバイスありがとうございます。
現在、普通に板ポリを表示することはできるのですが、2Dのゲームを作る上で画面端の座標が3D空間の座標だとわかりにくく
また画像のサイズもDXライブラリのようなピクセル単位だと考えやすいので、DXライブラリのような左上を原点としたX,Yで扱いたいと思い質問させて頂きました。
行列の計算に関してはてんで素人なので、当初はそのまま3D空間の座標でプログラミングしていこうと思ったのですが、
DirectXの3Dの座標は、DXライブラリに慣れていると画面端の座標がとても中途半端に感じ、考えづらいので出来ればピクセル単位に
変換したいです。それともやはり3Dの座標のまま計算したほうが効率的なのでしょうか?
 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#5

投稿記事 by softya(ソフト屋) » 14年前

使ったことが無いですがID3DX10Spriteが有るようです。
ただし、投射行列など苦手な行列の計算は避けれないようです。

「ID3DX10Sprite インターフェイス」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx

「その41 ID3DXSpriteで簡単2D表示」
http://marupeke296.com/DXG_No41_ID3DXSprite.html

まぁ、ピクセル座標系スプライトの廃止はDirectX10/11のコンセプトですので受け入れるしか無いでしょう。[誤解が起きそうなので修正]
ただ、せっかくのDirectX10で組むのに何故2Dなのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#6

投稿記事 by ISLe » 14年前

Direct3D10は変換済み頂点座標使えませんでしたっけ?

3D格闘ゲームでも体力メーターとかは2Dで描画したほうが楽ですよね。

奥兵

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#7

投稿記事 by 奥兵 » 14年前

アドバイスありがとうございます。教えていただいたページを読ませて頂きました。
ページを読みながら薄々スプライトでの2Dの表示の行程は理解したのですが、最初に想像していたような2D上のX、Yに単位をピクセルとして変換するような計算の方法は出来ないのか気になってしまいます。だだこねてごめんない。

DirectXのビギナー向けの本を片手になんとかテクスチャを貼った板ポリまでは表示できたんです。
そこで、とりあえず板ポリを使って2Dのゲームを作ろうと思ったのですが、自機が画面から飛び出さないようにする処理で
画面端のX,Y座標がわからないのでいきなり困ってしまいました。
もしかして自分で板ポリ作って2Dゲームを作るのは、ナンセンスというかあまりお利口でない方法ですかね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#8

投稿記事 by softya(ソフト屋) » 14年前

ISLe さんが書きました:Direct3D10は変換済み頂点座標使えませんでしたっけ?

3D格闘ゲームでも体力メーターとかは2Dで描画したほうが楽ですよね。
DirectX10でも変換済み頂点座標って使えるんでしょうか?
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
奥兵 さんが書きました:DirectXのビギナー向けの本を片手になんとかテクスチャを貼った板ポリまでは表示できたんです。
そこで、とりあえず板ポリを使って2Dのゲームを作ろうと思ったのですが、自機が画面から飛び出さないようにする処理で
画面端のX,Y座標がわからないのでいきなり困ってしまいました。
もしかして自分で板ポリ作って2Dゲームを作るのは、ナンセンスというかあまりお利口でない方法ですかね?
私の少ない情報の知るかぎりではDirectX10以降だと2Dゲームを作るほうが面倒だと思います。
上に紹介しているサイトのようなことをしないと出来ないと思うからです。
ただ、私はDirectX10で組んだことがないので海外サイトまで調べれば別の方法があるかも知れません。
私の提案としては素直に3Dゲームにされてはどうでしょうか?

↓ この本にも2Dの方法が書かれていません。
「ノースブレインのDirectX10/11プログラミング」
http://www.northbrain.org/shop/DX1011_Landing.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#9

投稿記事 by 奥兵 » 14年前

3Dのオブジェクト作るのも面倒だったので、2Dのほうが楽かと思い作り始めましたが余計に面倒そうですね。
やはり普通に3Dで勉強と制作をすることにしましたので解決とさせていただけます。
たくさんのアドバイス本当にありがとうございました。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#10

投稿記事 by ISLe » 14年前

softya(ソフト屋) さんが書きました:DirectX10でも変換済み頂点座標って使えるんでしょうか?
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
FVFフラグが無くなってるので『変換済み頂点座標』という区分はありませんね。
リンク先のように座標変換する・しないを自前で用意した頂点シェーダーを切り替えて行うしか無いですね。
と言ってもシェーダーを切り替えるというのは特別なことではありませんけど。

Direct3D10ならVista以降なので、Direct2Dを使うこともできるのでは。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#11

投稿記事 by softya(ソフト屋) » 14年前

ISLe さんが書きました:
softya(ソフト屋) さんが書きました:DirectX10でも変換済み頂点座標って使えるんでしょうか?
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
FVFフラグが無くなってるので『変換済み頂点座標』という区分はありませんね。
リンク先のように座標変換する・しないを自前で用意した頂点シェーダーを切り替えて行うしか無いですね。
と言ってもシェーダーを切り替えるというのは特別なことではありませんけど。

Direct3D10ならVista以降なので、Direct2Dを使うこともできるのでは。
すいません忘れてました。そっちがありましたね。
私はDirectX9世代で止まっております。

「Direct2D 入門 » Blog Archive » Direct2D入門 スタート」
http://www.tkzdev.net/?p=12
初めて使い方を見てみましたがGDI+とDirectXの中間のような存在ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#12

投稿記事 by 奥兵 » 14年前

URL先のページ読ませて頂きました。とても参考になりました、ありがとうございます。
Direct2Dは今までよくわからないので無視を決め込んでいましたが、どうやらしっかり住み分けされてるみたいですね。
これは確かにDirectX10でわざわざ2Dは本格的に非効率的そうです。
実はまだ諦めずにいろいろいじっていたのですが止めます。
毎度、親切にしていただいてありがとうございます。みなさんには頭が下がるばかりです。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#13

投稿記事 by ISLe » 14年前

Direct3D10だとふつうにポリゴン表示するのにも同じくらい手間が掛かりますよね。
あとは2D座標をどう扱うかという部分だけなのでそんなに大きな手間ではない気がしますけど。
正規化する方法はいくらでもあるのでシェーダーにピクセル座標を渡す必要ないですし。

長いのでソース全体は貼れませんけど、DirectX SDK (June 2010)のDirect3D10のC++サンプルプログラムのTutorial02は

コード:

    SimpleVertex vertices[] =
    {
        D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
        D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
        D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
    };
というふうに頂点座標を指定して頂点シェーダーは座標変換せずに返してます。
これを頂点シェーダーそのままで

コード:

	int w = 640; // 画面の縦のサイズ(ピクセル単位)
	int h = 480; // 画面の横のサイズ(ピクセル単位)
// とりあえずのピクセル座標を正規化するマクロ
#define PIXELPOS(x,y) D3DXVECTOR3( x/(w/2.0f)-1.0f, -y/(h/2.0f)+1.0f, 1.0f )
    SimpleVertex vertices[] =
    {
		// ピクセル座標で指定
		PIXELPOS( 320, 120 ),
		PIXELPOS( 480, 360 ),
		PIXELPOS( 160, 360 ),
    };
というふうにできますけど。

奥兵

Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換

#14

投稿記事 by 奥兵 » 14年前

ありがとうございます。ピクセル単位の表示できました!
こんなふうに計算できるんですね。とっても勉強になりました。
 

閉鎖

“C言語何でも質問掲示板” へ戻る