ことはじめ

にほんごのれんしゅうにっき

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が出来上がるので、こいつをデバイスに結び付けてやればいい模様。