3D学習帳 2
ワールド座標変換(つづき)
前回のワールド変換行列をDirectXを使ってつくってみる。
拡大縮小
DirectXではD3DXMatrixScaling()なる関数が提供されているのでそれを使います。
D3DXMATRIX* D3DXMatrixScaling( D3DXMATRIX *pOut, // 演算結果である D3DXMATRIX 構造体へのポインタ。 FLOAT sx, // x方向の拡大率 FLOAT sy, // y方向の拡大率 FLOAT sz // z方向の拡大率 );
回転
D3DXMatrixRotationX()
D3DXMatrixRotationY()
D3DXMatrixRotationZ()
の3つの関数が用意されてます。
D3DXMATRIX *D3DXMatrixRotationX( D3DXMATRIX *pOut, // 演算結果である D3DXMATRIX 構造体へのポインタ。 FLOAT AngleX // x軸を回転軸としたときの回転角[rad] ); D3DXMATRIX *D3DXMatrixRotationY( D3DXMATRIX *pOut, // 演算結果である D3DXMATRIX 構造体へのポインタ。 FLOAT AngleY // y軸を回転軸としたときの回転角[rad] ); D3DXMATRIX *D3DXMatrixRotationZ( D3DXMATRIX *pOut, // 演算結果である D3DXMATRIX 構造体へのポインタ。 FLOAT AngleZ // z軸を回転軸としたときの回転角[rad] );
平行移動
D3DXMatrixTranslation()関数が提供されてます。
D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, // 演算結果である D3DXMATRIX 構造体へのポインタ。 FLOAT x, // x方向の移動 FLOAT y, // y方向の移動 FLOAT z // z方向の移動 );
作る
全体を0.8倍してx軸周りに90度、z軸周りに30度回転した後にx方向に150移動するようなワールド変換行列をつくってみます。
行列を掛ける順番に注意。
D3DXMATRIX matWorld; // ワールド変換行列 // まずは平行移動 D3DXMatrixTranslation(&matWorld, 150.0f, 0.0f, 0.0f); // z軸回転 D3DXMatrixRotationZ(&matWorld, D3DX_PI/6.0f); // x軸回転 D3DXMatrixRotationZ(&matWorld, D3DX_PI/2.0f); // 最後にスケーリング D3DXMatrixRotationX(&matWorld, 0.8f, 0.8f, 0.8f);
これでワールド変換行列matWorldが出来上がるので、こいつをデバイスに結び付けてやればいい模様。