Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「Direct3D 直接モードの C/C++ チュートリアル」を参照すること。
単純なシーンをセット アップするもう 1 つのステップは、ワールド行列、ビュー行列、および射影行列の設定に関係するものである。システムは、モデルをシーンの中に置くため、カメラの位置と向きを調節するため、および頂点データをスケールして遠くのオブジェクトを近くのオブジェクトよりも小さく見せるために、行列をモデルのジオメトリに適用する (概念的な概要については、「ジオメトリ パイプライン」を参照すること)。
ワールド行列を作成するには、D3DMATRIX 型 matWorld を宣言し、それから単位行列を作成する。次に、D3DTRANSFORMSTATE_WORLD フラグがセットされた Direct3DDevice7.SetTransform メソッドを使って、ワールド ビューの行列を定義する。
' ワールド行列は、ワールド空間にあるポリゴンの位置と向きを制御する。 ' 後で、三角形を回転させるために使用する。 Dim matWorld As D3DMATRIX g_dx.IdentityMatrix matWorld g_d3dDevice.SetTransform D3DTRANSFORMSTATE_WORLD, matWorld
ビュー行列を作成するには、D3DMATRIX 型 matView を宣言し、それから単位行列を作成する。次に、カメラ座標を DirectX7.ViewMatrix メソッドに渡し、ビュー行列を作成する。レンダリング デバイスのビュー行列を定義するには、SetTransform メソッドを使用する。
' ビュー行列は、カメラの位置と向きを定義する。 ' ここでは、カメラを z 軸に沿って 15 単位後ろに動かすだけである。 Dim matView As D3DMATRIX g_dx.IdentityMatrix matView Call g_dx.ViewMatrix(matView, MakeVector(0, 0, -15), MakeVector(0, 0, 0), _ MakeVector(0, 1, 0), 0) g_d3dDevice.SetTransform D3DTRANSFORMSTATE_VIEW, matView
上記のコードでは、プライベートのアプリケーション定義関数 MakeVector を使って、3 頂点を D3DVECTOR 型にトランスフォームする。
Private Function MakeVector(a As Double, b As Double, c As Double) As D3DVECTOR Dim vecOut As D3DVECTOR With vecOut .x = a .y = b .z = c End With MakeVector = vecOut End Function
射影行列を作成するには、D3DMATRIX 型 matProj を宣言し、それから単位行列を作成する。次に、クリップ面と視野角度を DirectX7.ProjectionMatrix メソッドに渡して、射影行列を作成する。レンダリング デバイスの射影行列を定義するには、SetTransform メソッドを使用する。
' 射影行列は、2D レンダリング ターゲット サーフェス (バックバッファ サーフェス) 上に、 ' 3D シーンをどのように「射影」するかを定義する。詳細については、 ' 射影行列の説明を参照すること。 Dim matProj As D3DMATRIX g_dx.IdentityMatrix matProj Call g_dx.ProjectionMatrix(matProj, 1, 1000, pi / 2) g_d3dDevice.SetTransform D3DTRANSFORMSTATE_PROJECTION, matProj
上記のコードでは、ProjectionMatrix に渡される 2 番目のパラメータが前方クリッピング平面までの距離を、3 番目のパラメータが後方クリッピング平面までの距離を、アプリケーション指定の単位で示す。4 番目のパラメータは、視野角度をラジアンで表す。
マテリアルの準備とトランスフォーム行列の設定が完了したら、シーンのジオメトリをセット アップすることができる。これについては、「ステップ 3.3 : ジオメトリを準備する」で説明する。