【DiretX】3Dの座標からピクセル単位の座標へ変換
-
奥兵
【DiretX】3Dの座標からピクセル単位の座標へ変換
DirectXでのプログラミングにおいて板ポリゴンを表示する際の座標についての質問です。
DirectXで板ポリゴンを表示する際、DXライブラリで2Dを表示する時のようにウィンドウの左上を0.0としてピクセル単位で表示したいと思い
自分でいろいろ調べては見たのですがさっぱりでした。どなたかアドバイスお願いします。
ちなみにDirectXは10です。
DirectXで板ポリゴンを表示する際、DXライブラリで2Dを表示する時のようにウィンドウの左上を0.0としてピクセル単位で表示したいと思い
自分でいろいろ調べては見たのですがさっぱりでした。どなたかアドバイスお願いします。
ちなみにDirectXは10です。
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
3D空間からディスプレイ座標への変換は、基本的にカメラによって行われます。カメラはカメラの位置とカメラの角度、それからカメラの視野角により、3D空間のオブジェクトをディスプレイ座標に変換します。
実際にはカメラの位置、角度、視野角を設定すると「プロジェクション行列」という行列が生成されて、その行列と3D座標の積により座標の変換が行われます。
普通はカメラを設定してやれば3D座標からディスプレイ座標になりますが、手動でやりたいときはプロジェクション行列(投影行列)を自分で生成して、板ポリゴンの角の3D座標に乗じて、その結果を2D座標として描画すればいいのではないでしょうか。
実際にはカメラの位置、角度、視野角を設定すると「プロジェクション行列」という行列が生成されて、その行列と3D座標の積により座標の変換が行われます。
普通はカメラを設定してやれば3D座標からディスプレイ座標になりますが、手動でやりたいときはプロジェクション行列(投影行列)を自分で生成して、板ポリゴンの角の3D座標に乗じて、その結果を2D座標として描画すればいいのではないでしょうか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
単に表示するだけなら3D空間に2Dを混ぜて表示したほうが早いです。
[補足] すいません。DirectX10を見落としていました。
[補足] すいません。DirectX10を見落としていました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
奥兵
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
お二人ともアドバイスありがとうございます。
現在、普通に板ポリを表示することはできるのですが、2Dのゲームを作る上で画面端の座標が3D空間の座標だとわかりにくく
また画像のサイズもDXライブラリのようなピクセル単位だと考えやすいので、DXライブラリのような左上を原点としたX,Yで扱いたいと思い質問させて頂きました。
行列の計算に関してはてんで素人なので、当初はそのまま3D空間の座標でプログラミングしていこうと思ったのですが、
DirectXの3Dの座標は、DXライブラリに慣れていると画面端の座標がとても中途半端に感じ、考えづらいので出来ればピクセル単位に
変換したいです。それともやはり3Dの座標のまま計算したほうが効率的なのでしょうか?
現在、普通に板ポリを表示することはできるのですが、2Dのゲームを作る上で画面端の座標が3D空間の座標だとわかりにくく
また画像のサイズもDXライブラリのようなピクセル単位だと考えやすいので、DXライブラリのような左上を原点としたX,Yで扱いたいと思い質問させて頂きました。
行列の計算に関してはてんで素人なので、当初はそのまま3D空間の座標でプログラミングしていこうと思ったのですが、
DirectXの3Dの座標は、DXライブラリに慣れていると画面端の座標がとても中途半端に感じ、考えづらいので出来ればピクセル単位に
変換したいです。それともやはり3Dの座標のまま計算したほうが効率的なのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
使ったことが無いですが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なのでしょうか?
ただし、投射行列など苦手な行列の計算は避けれないようです。
「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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
Direct3D10は変換済み頂点座標使えませんでしたっけ?
3D格闘ゲームでも体力メーターとかは2Dで描画したほうが楽ですよね。
3D格闘ゲームでも体力メーターとかは2Dで描画したほうが楽ですよね。
-
奥兵
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
アドバイスありがとうございます。教えていただいたページを読ませて頂きました。
ページを読みながら薄々スプライトでの2Dの表示の行程は理解したのですが、最初に想像していたような2D上のX、Yに単位をピクセルとして変換するような計算の方法は出来ないのか気になってしまいます。だだこねてごめんない。
DirectXのビギナー向けの本を片手になんとかテクスチャを貼った板ポリまでは表示できたんです。
そこで、とりあえず板ポリを使って2Dのゲームを作ろうと思ったのですが、自機が画面から飛び出さないようにする処理で
画面端のX,Y座標がわからないのでいきなり困ってしまいました。
もしかして自分で板ポリ作って2Dゲームを作るのは、ナンセンスというかあまりお利口でない方法ですかね?
ページを読みながら薄々スプライトでの2Dの表示の行程は理解したのですが、最初に想像していたような2D上のX、Yに単位をピクセルとして変換するような計算の方法は出来ないのか気になってしまいます。だだこねてごめんない。
DirectXのビギナー向けの本を片手になんとかテクスチャを貼った板ポリまでは表示できたんです。
そこで、とりあえず板ポリを使って2Dのゲームを作ろうと思ったのですが、自機が画面から飛び出さないようにする処理で
画面端のX,Y座標がわからないのでいきなり困ってしまいました。
もしかして自分で板ポリ作って2Dゲームを作るのは、ナンセンスというかあまりお利口でない方法ですかね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
DirectX10でも変換済み頂点座標って使えるんでしょうか?ISLe さんが書きました:Direct3D10は変換済み頂点座標使えませんでしたっけ?
3D格闘ゲームでも体力メーターとかは2Dで描画したほうが楽ですよね。
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
私の少ない情報の知るかぎりではDirectX10以降だと2Dゲームを作るほうが面倒だと思います。奥兵 さんが書きました:DirectXのビギナー向けの本を片手になんとかテクスチャを貼った板ポリまでは表示できたんです。
そこで、とりあえず板ポリを使って2Dのゲームを作ろうと思ったのですが、自機が画面から飛び出さないようにする処理で
画面端のX,Y座標がわからないのでいきなり困ってしまいました。
もしかして自分で板ポリ作って2Dゲームを作るのは、ナンセンスというかあまりお利口でない方法ですかね?
上に紹介しているサイトのようなことをしないと出来ないと思うからです。
ただ、私はDirectX10で組んだことがないので海外サイトまで調べれば別の方法があるかも知れません。
私の提案としては素直に3Dゲームにされてはどうでしょうか?
↓ この本にも2Dの方法が書かれていません。
「ノースブレインのDirectX10/11プログラミング」
http://www.northbrain.org/shop/DX1011_Landing.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
奥兵
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
3Dのオブジェクト作るのも面倒だったので、2Dのほうが楽かと思い作り始めましたが余計に面倒そうですね。
やはり普通に3Dで勉強と制作をすることにしましたので解決とさせていただけます。
たくさんのアドバイス本当にありがとうございました。
やはり普通に3Dで勉強と制作をすることにしましたので解決とさせていただけます。
たくさんのアドバイス本当にありがとうございました。
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
FVFフラグが無くなってるので『変換済み頂点座標』という区分はありませんね。softya(ソフト屋) さんが書きました:DirectX10でも変換済み頂点座標って使えるんでしょうか?
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
リンク先のように座標変換する・しないを自前で用意した頂点シェーダーを切り替えて行うしか無いですね。
と言ってもシェーダーを切り替えるというのは特別なことではありませんけど。
Direct3D10ならVista以降なので、Direct2Dを使うこともできるのでは。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
すいません忘れてました。そっちがありましたね。ISLe さんが書きました:FVFフラグが無くなってるので『変換済み頂点座標』という区分はありませんね。softya(ソフト屋) さんが書きました:DirectX10でも変換済み頂点座標って使えるんでしょうか?
こっちでも無いように書かれてますが。
「その5 DirectX10版高速フォント表示」 ④ 左上(0, 0)にするために
http://marupeke296.com/DX10_No5_FontTexture.html
私が知らないだけなのかも知れません。
リンク先のように座標変換する・しないを自前で用意した頂点シェーダーを切り替えて行うしか無いですね。
と言ってもシェーダーを切り替えるというのは特別なことではありませんけど。
Direct3D10ならVista以降なので、Direct2Dを使うこともできるのでは。
私はDirectX9世代で止まっております。
「Direct2D 入門 » Blog Archive » Direct2D入門 スタート」
http://www.tkzdev.net/?p=12
初めて使い方を見てみましたがGDI+とDirectXの中間のような存在ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
奥兵
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
URL先のページ読ませて頂きました。とても参考になりました、ありがとうございます。
Direct2Dは今までよくわからないので無視を決め込んでいましたが、どうやらしっかり住み分けされてるみたいですね。
これは確かにDirectX10でわざわざ2Dは本格的に非効率的そうです。
実はまだ諦めずにいろいろいじっていたのですが止めます。
毎度、親切にしていただいてありがとうございます。みなさんには頭が下がるばかりです。
Direct2Dは今までよくわからないので無視を決め込んでいましたが、どうやらしっかり住み分けされてるみたいですね。
これは確かにDirectX10でわざわざ2Dは本格的に非効率的そうです。
実はまだ諦めずにいろいろいじっていたのですが止めます。
毎度、親切にしていただいてありがとうございます。みなさんには頭が下がるばかりです。
Re: 【DiretX】3Dの座標からピクセル単位の座標へ変換
Direct3D10だとふつうにポリゴン表示するのにも同じくらい手間が掛かりますよね。
あとは2D座標をどう扱うかという部分だけなのでそんなに大きな手間ではない気がしますけど。
正規化する方法はいくらでもあるのでシェーダーにピクセル座標を渡す必要ないですし。
長いのでソース全体は貼れませんけど、DirectX SDK (June 2010)のDirect3D10のC++サンプルプログラムのTutorial02は
というふうに頂点座標を指定して頂点シェーダーは座標変換せずに返してます。
これを頂点シェーダーそのままで というふうにできますけど。
あとは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 ),
};
これを頂点シェーダーそのままで というふうにできますけど。