ページ 11

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

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

   

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

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

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

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

Posted: 2012年4月15日(日) 10:40
by softya(ソフト屋)
単に表示するだけなら3D空間に2Dを混ぜて表示したほうが早いです。
[補足] すいません。DirectX10を見落としていました。

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

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

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

Posted: 2012年4月15日(日) 16:32
by softya(ソフト屋)
使ったことが無いですが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なのでしょうか?

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

Posted: 2012年4月15日(日) 18:55
by ISLe
Direct3D10は変換済み頂点座標使えませんでしたっけ?

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

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

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

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

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

Posted: 2012年4月16日(月) 08:50
by softya(ソフト屋)
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

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

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

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

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

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

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

Posted: 2012年4月16日(月) 18:19
by softya(ソフト屋)
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の中間のような存在ですね。

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

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

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

Posted: 2012年4月20日(金) 03:34
by ISLe
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の座標からピクセル単位の座標へ変換

Posted: 2012年4月21日(土) 18:43
by 奥兵
ありがとうございます。ピクセル単位の表示できました!
こんなふうに計算できるんですね。とっても勉強になりました。