2009年4月14日火曜日

3Dオブジェクト



 ようやく当初の目的である、背景3Dな2DSTGっぽいことが出来るようになってきた。
前はMesh使わないとオブジェクトを設置できなかったけど、なんとか自力で描画できるようになった。
頂点情報をプログラムで算出してるから、複雑な形状は不可能。
外からデータを取ってこれるようにすればそれっぽいのかな。




D3DXMatrixPerspectiveFovLH(
  &proj,
  Math::degToRad(120.f),
  800.f/600.f,
  0,
  5000
);

 プロジェクション設定を上記のように間違えてて、
Zバッファがうまく動かねえってしばらく詰まってた。正しくは、

D3DXMatrixPerspectiveFovLH(
  &proj,
  Math::degToRad(120.f),
  800.f/600.f,
  1,
  5000
);

のように、パラメータを0→1にする。0ではうまく動かないらしい。
このミス、前もした気がする。


 頂点座標の計算は

D3DXMATRIXA16 mat, calc;
// 拡大
D3DXMatrixScaling( &mat, 省略 );
// 回転
D3DXMatrixRotationYawPitchRoll( &calc, 省略 );
mat *= calc;
// 平行移動
mat._41 += moveX;
mat._42 += moveY;
mat._43 += moveZ;

 とかやると、拡大回転移動成分でできた行列が出来るので、

D3DXMATRIXA16 tmp;
D3DXMatrixIdentity( &tmp );
tmp._41 = 元データの頂点位置X;
tmp._42 = 元データの頂点位置Y;
tmp._43 = 元データの頂点位置Z;
tmp *= mat;

 のように、行列に3Dモデルの頂点座標をセットしてから掛けてやると、
回転や移動後の座標が得られる。
 動かしてみたらうまく動いたからこのようにしてるけど、
論理的に正しいのかどうかは分からん。
 行列って数ⅢAかなんかだったっけ。まったく覚えてないね!
*090420追記
 数ⅠA、ⅡB、ⅢCって区分だと後からわかった。何よⅢAって。
いかにわかってないかがわかる。俺の背中。俺スタイル。

0 件のコメント: