Platform SDK: DirectX

ステップ 3.3 : 座標トランスフォーム行列を準備、設定する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

単純なシーンをセット アップするもう 1 つのステップは、ワールド行列、ビュー行列、および射影行列の設定に関係するものである。システムによってこれらの行列がジオメトリに適用されることで、そのジオメトリがシーンに配置され、カメラの位置と向きが調整され、遠くにあるオブジェクトが近くにあるオブジェクトよりも小さく見えるように頂点データがスケーリングされる。(概要については、「ジオメトリ パイプライン」を参照すること)。

サンプル Triangle では、まず、D3DMATRIX 構造体で単位行列を作成した後、行列を操作し、目的の座標トランスフォームを生成する。行列を準備した後、このコードでは、D3DTRANSFORMSTATE_WORLD、D3DTRANSFORMSTATE_VIEW、または D3DTRANSFORMSTATE_PROJECTION 値を指定して IDirect3DDevice7::SetTransform メソッドを呼び出し、行列をデバイスに割り当てる。

    // まず、単位行列をセット アップする。
    D3DMATRIX mat;
    mat._11 = mat._22 = mat._33 = mat._44 = 1.0f;
    mat._12 = mat._13 = mat._14 = mat._41 = 0.0f;
    mat._21 = mat._23 = mat._24 = mat._42 = 0.0f;
    mat._31 = mat._32 = mat._34 = mat._43 = 0.0f;
    
    // ワールド行列は、ワールド空間にあるポリゴンの
    // 位置と向きを制御する。後でこれを使用して
    // 三角形を回転する。
    D3DMATRIX matWorld = mat;
    pd3dDevice->SetTransform( D3DTRANSFORMSTATE_WORLD, &matWorld );
 
    // ビュー行列は、
    // カメラの位置と向きを定義する。ここでは、カメラを z 軸に沿って 10 単位後ろに
    // 動かすだけである。
    D3DMATRIX matView = mat;
    matView._43 = 10.0f;
    pd3dDevice->SetTransform( D3DTRANSFORMSTATE_VIEW, &matView );
 
    // 射影行列は、2D レンダリング ターゲット サーフェス上に、
    // 3D シーンをどのように「射影」するかを定義する。
    // 詳細については、「射影トランスフォームとは」を参照すること。
 
    // x と y を 2 倍し、z を -1.0 だけ平行移動する、
    // 非常に単純な射影行列をセット アップする。
    D3DMATRIX matProj = mat;
    matProj._11 =  2.0f;
    matProj._22 =  2.0f;
    matProj._34 =  1.0f;
    matProj._43 = -1.0f;
    matProj._44 =  0.0f;
    pd3dDevice->SetTransform( D3DTRANSFORMSTATE_PROJECTION, &matProj );

座標トランスフォームを設定すると、Triangle は、シーンのセット アップを終了したことになる。アプリケーション定義関数 App_InitDeviceObjects が、呼び出し側のアプリケーション定義関数 Initialize3DEnvironment に S_OK を返す。さらに、Initialize3DEnvironment 関数がこの値を WinMain に返す。これにより、WinMain は「ステップ 4 : システム メッセージを監視する」で説明するシステム メッセージの処理に移る。