Win10 Rotate

Windows10 DirectX3D でモデルを回転します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

カラーキューブの回転軸

  1. Visual Studio 2015 を起動して Win10 Template から DirectX 11 アプリ(ユニバーサル Windows) を構築して下さい。
    コンパイル&実行するとカラーキューブがY軸を中心に回転しながら描画されます。
  2. カラーキューブの回転軸を変えてみましょう。
    Sample3DSceneRenderer.cpp の Rotate() 関数を表示して下さい。
    現在のソースコードは次のようになっています。
    //3D キューブ モデルを、ラジアン単位で設定された大きさだけ回転させます。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        //更新されたモデル マトリックスをシェーダーに渡す準備をします
        XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationY(radians)));
    }
    
    X軸を中心に回転するときは、次のように修正して下さい。
        XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationX(radians)));
    
    Z軸を中心に回転するときは、次のように修正して下さい。
        XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationZ(radians)));
    
  3. m_constantBufferData.model に変換行列を設定するのですが、型は XMFLOAT4X4 です。
    XMFLOAT4X4 はシェーダーに渡す型で、演算には向いていないようです。
    Y軸を中心に回転するコードは次のように書き替えることが出来ます。
        XMFLOAT4X4  f4x4;
        XMStoreFloat4x4(&f4x4, XMMatrixTranspose(XMMatrixRotationY(radians)));
        m_constantBufferData.model = f4x4;
    
  4. RotationY などで得られる型は XMMATRIX です。
    XMMATRIX を使うと次の例のように変換行列の演算を行うことが出来ます。
    XMMATRIX は XMFLOAT4X4 に変換して設定します。
    	XMMATRIX	ry,rz,mat;
    	XMFLOAT4X4	f4x4;
    	ry = XMMatrixRotationY(radians);
    	rz = XMMatrixRotationZ(radians);
    	mat = ry * rz;
    	XMStoreFloat4x4(&f4x4, mat);
    	m_constantBufferData.model = f4x4;
    
  5. XMMatrixRotationView() 関数を使うと「ロール, ピッチ, ヨー」で変換行列を作成することが出来ます。
    Roll, Pitch, Yaw の説明は Windows Guid から「変換行列, オイラー角, クォータニオン」を参照して下さい。
    ここで定義されている XMMatrixRotationView() 関数は若干勝手が違うようで、次の2行は同じ値になります。
    	XMMATRIX	mat;
    	mat = XMMatrixRotationX(rx) * XMMatrixRotationY(ry) * XMMatrixRotationZ(rz);
    	mat = XMMatrixRotationView(rx, ry, rz);
    
    この関数で作成される型も XMMATRIX なので XMFLOAT4X4 に変換して設定します。
        XMFLOAT4X4  f4x4;
        XMMATRIX    mat;
        mat = XMMatrixRotationView(radians, radians, 0.0f);
        XMStoreFloat4x4(&f4x4, mat);
        m_constantBufferData.model = f4x4;
    

超初心者のプログラム入門(DirectX Store)