ページ 11

【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 19:19
by シエル
いつもお世話になっております。シエルです。

DirectXにて現在ゲームを作成しており、3D背景を実装しようとしているのですが、
どうも思ったとおりの大きさに描画されず苦戦しています。

まず、
D3DFVF_DIFFUSE,D3DFVF_XYZ,D3DFVF_TEX1の頂点フォーマットを設定し、下記の頂点構造体を作っています。

typedef struct {
D3DXVECTOR3 v;
DWORD color;
D3DXVECTOR2 tex;
}VERTEX;

これを四つくっつけたポリゴン構造体が以下のものです。

typedef struct{
VERTEX v[4];
int flag;
}PORIGON;

これを使って、縦横3.0のポリゴンを作成し、テクスチャマッピングを行って描画したのですが、
イメージとは違う大きさで描画されてしまいます。(約80倍ぐらい。)

おそらくカメラの設定等が関係してくるとは思うのですが、どの部分に問題があるかご指摘願えますでしょうか?
添付したソースで、test.pngという名前のファイルをプロジェクトファイルと同じフォルダに
放り込んで、実行していただければ実行できます。
方向キー上下でZ座標が変化するようにしておりますが、起動直後の最初の画像の大きさに
注目してください。実際にしていした座標より大きくなってますので。

あと、もう一つ質問なんですが、Direct3Dの描画で原点(0,0,0)は必ずウィンドウの中央に自動的に
設定されているのでしょうか?


ソースがかなり長いので、添付させていただきます^^;

それでは、ご教授のほどよろしくお願い致します。

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:01
by softya
DirectXを真面目にいじったことがない私ですが、3Dの基本事項の問題だと思いますので回答してみます。

3Dの基本として透視変換は理解されていますか?
3Dの座標系はピクセルではありません。どちらかというとメートルとか単位があるわけでは無いですが距離や大きさを表す単位です。画面に表示される大きさは、カメラの画角とカメラとの距離で決定されます。
すごく現実の世界に近いワケでデジカメで撮影するときに3mの物をちゃんとカメラに収めるには何メートル離しますか?って感覚に近いです。
望む大きさに表示したい場合は、カメラの画角と距離、表示するポリゴンの大きさを元に計算しないといけません。

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:15
by シエル
そんな気がしてたんですけど、やはりそうですか・・・。

難しいですね。何か計算式があればいいんですが。。。
何回も実行して経験を積んで、慣れていくしかなさそうですね。

まあ、ソースに問題があるというわけではなさそうですので、一旦解決にしておきます。 画像

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:23
by softya
ちなみに、ちゃんと勉強すれば計算できます。
ここら辺りが参考になるんじゃないでしょうか?
http://marupeke296.com/DXG_No59_TakeModelsInCamera.html
直接的な答えではないですが。 画像

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:24
by ふぉ
//視野角をラジアン単位に変換
FLOAT fovy = 45.0f*D3DX_PI/180.0f;
//基準値の高さ640を視野角を利用して、視点からの距離を求める
FLOAT z = (640.0f*0.5f)/(FLOAT)tan(fovy/2.0f)-10.0f;
//ポリゴン座標セット
PorigonSet(&pr1,-320.0f,320.0f,z,640.0f,640.0f);

視野角が45度で、基準になっているスクリーンサイズを640とすると、
視点とスクリーンサイズを底辺とした二等辺三角形を作ることが出来ます。
さらにその二等辺三角形を分割(視野角を半分に)して直角三角形にすると、
スクリーンサイズ/2を底辺に持つ三角形が出来ます。
これを利用して直角の点から視点までの距離を求めると、
スクリーンのサイズとちょうど一致した距離になります。
最後に-10しているのは、視点と注視点の距離がすでに10ある為です。

それとZが1000を超えてしまうので、射影行列を作るときに、
D3DXMatrixPerspectiveFovLH(&proj,D3DXToRadian(45.0f),
aspect,1.0f,10000.0f);
遠平面のZを上のように適当に大きな数を指定する必要があります。

>あと、もう一つ質問なんですが、Direct3Dの描画で原点(0,0,0)は必ずウィンドウの中央に自動的に
設定されているのでしょうか?
これに関してですが、ビュー行列の視点の位置を変更すれば変わります。

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:25
by シエル
うお!ここでいつも勉強してるのにこんなページありましたか^^;
ありがとうございます!ちょっと見てやってみます!

Re:【DirectXプログラミング】描画されるオブジェクトの大きさについて

Posted: 2010年9月01日(水) 21:31
by シエル
>> ふぉさん

回答ありがとうございます!

非常に分かりやすい説明ありがとうございます!
私の関数を使って説明していただいて、すごいわかりやすいです!
ちょっと実際にやってみます!

あと原点の件もありがとうございます。
ビュー行列の視点の位置がそのまま原点になっていたんですね!
かなりすっきりしました!

あ~本当にやる気出てきました。ありがとうございました!