ゲームプログラムのメモ書き

DirectX

回転 〜 掛ける順番に気を付けろ! 〜

準備するもの

FLOAT      fRotX = 0.0f, fRotY = 0.5f, fRotZ = 0.3f;   //回転用変数

■使い方

D3DXMATRIXA16    matWorld;      //ワールド行列
D3DXMATRIXA16    matRotation;   //回転行列
D3DXMatrixIdentity(&matWorld);  //初期化

/* 回転行列を作成する */
//X軸
D3DXMatrixRotationX(&matRotation, fRotX);
D3DXMatrixMultiply(&matWorld, &matWorld, &matRotation);

//Y軸
D3DXMatrixRotationY(&matRotation, fRotY);
D3DXMatrixMultiply(&matWorld, &matWorld, &matRotation);

//Z軸
D3DXMatrixRotationZ(&matRotation, fRotZ);
D3DXMatrixMultiply(&matWorld, &matWorld, &matRotation);

//ワールドへセット
m_pDevice->SetTransform(D3DTS_WORLD, &matWorld);

D3DXMatrixRotation関数の第二引数はラジアンです。そこを間違えない様に・・・。 また、D3DXには角度をラジアンに変換してくれる関数D3DXToRadian()があるので

D3DXMatrixRotationX(&matRotation, D3DXToRadian(fRotX));

という風に渡すことも出来ます。また、前回の移動と回転の両方を適応させたい場合は

D3DXMatrixMultiply(&matWorld, &matWorld, &matRotation);
D3DXMatrixMultiply(&matWorld, &matWorld, &matPosition);
m_pDevice->SetTransform(D3DTS_WORLD, &matWorld);

とします。これは「回転した後に移動」させています。この積順が逆になると結果も全く 別物になってしまいます。ワールドに複数の行列を適用する際は順番に気を付けましょう。