結果だけでなく過程も見てください

たい焼きさんの日々の奮闘を綴る日記です。

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
誰かわかる人いたら教えてくださーい><