Platform SDK: DirectX

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

[C++]

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

[Visual Basic]

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

ワールド行列を作成するには、D3DMATRIXmatWorld を宣言し、それから単位行列を作成する。次に、D3DTRANSFORMSTATE_WORLD フラグがセットされた Direct3DDevice7.SetTransform メソッドを使って、ワールド ビューの行列を定義する。

' ワールド行列は、ワールド空間にあるポリゴンの位置と向きを制御する。
' 後で、三角形を回転させるために使用する。
Dim matWorld As D3DMATRIX
 
g_dx.IdentityMatrix matWorld
g_d3dDevice.SetTransform D3DTRANSFORMSTATE_WORLD, matWorld

ビュー行列を作成するには、D3DMATRIXmatView を宣言し、それから単位行列を作成する。次に、カメラ座標を 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

射影行列を作成するには、D3DMATRIXmatProj を宣言し、それから単位行列を作成する。次に、クリップ面と視野角度を 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 : ジオメトリを準備する」で説明する。