3D空間に2Dオブジェクトを描画するときにy座標だけ1ドット下にずれる(1)
基本的な方法は以下のサイトの通りなのですが
●スクリーンにある2D板ポリゴンを行列で操作する
http://marupeke296.com/DXG_No51_2DBillboardWithOperatingMatrix.html
今ワールド変換行列の平行移動で、どのように値を指定すれば
画面四隅ぴったりに2Dオブジェクトを描画できるのかを調査しています。
Visual Studio 2005 Pro + DirectX 9 August 2007です。
板ポリゴンの描画方法については、
まず頂点フォーマットを以下のように定義しています。
普段はHLSLを使っていますが、テストのため固定パイプラインを
使用しています。
struct CUSTOMVERTEX { float x, y, z; DWORD dwColor; }; static const DWORD FVF_CUSTOMVERTEX = ( D3DFVF_XYZ | D3DFVF_DIFFUSE );
頂点座標は以下のように指定。
ポリゴンの幅はnPolyWidth、高さはnPolyHeightです。
CUSTOMVERTEX vertices[4]= { { -nPolyWidth/2.0f, -nPolyHeight/2.0f, 0.0f, 0xFFFF0000 }, { nPolyWidth/2.0f, -nPolyHeight/2.0f, 0.0f, 0xFFFF0000 }, { -nPolyWidth/2.0f, nPolyHeight/2.0f, 0.0f, 0xFFFF0000 }, { nPolyWidth/2.0f, nPolyHeight/2.0f, 0.0f, 0xFFFF0000 } };
この状態で、スクリーンの4隅に1ドット描画したいので、
板ポリゴンの幅(nPolyWidth)と高さ(nPolyHeight)を
それぞれ1に設定します。
スクリーンサイズは幅640pix、高さ480pix、
ビュー変換行列は単位行列、
透視変換行列は上で述べたサイトの通り
スクリーンの半分のサイズで除算しています。
そこでワールド変換行列の平行移動値を指定して調べてみたところ
平行移動に指定する値 描画結果 (-320, -240) 描画されない (-320, -239) 左下隅に描画される (+320, +240) 描画されない (+319, +240) 右上隅に描画される
上記結果から何が言えるのかと言うと、
x方向については、描画範囲が-320 〜 +319 => 0 〜 639
y方向については、描画範囲が-239 〜 +240 => 1 〜 480
自分としては描画範囲は0〜639、0〜479を想定していたので、
y方向については1ドット下にズレてしまっているせいで、
(この表現で合っているかハッキリわかってないが)
+1ドット加算して描画しないと正しく描画されない。
まったく計算方法は同じなのに、なぜこのような差が出てくるのか・・・。
ここがわからずに進めずにいます。
環境の問題もあるかもなので、明日は別マシンでやってみようと思います。
あとCreateDeviceでD3DDEVTYPE_REFにしてみましたが、
結果は変わらずでした。。T_T
y方向だけ+1するなんて今後やっていきたくないしねT_T
誰かわかる人いたら教えてくださーい><