Platform SDK: DirectX

ステップ 2.2 : 3D トランスフォームを実行する

[C++]

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

[Visual Basic]

このチュートリアルでは、ジオメトリ トランスフォームを使って、立方体の位置座標をシーン内のほかのオブジェクトとの関係で定義し、立方体を回転して、シーン内で立方体をスケールする。

3D トランスフォームを実装する前に、ビューポートの高さと幅を取得する必要がある。この情報を使って、トランスフォームされた頂点をレンダリング ウィンドウに合わせてスケールする。

Private Sub TransformVertices(d3dDevice As Direct3DDevice7, vVertices() As D3DTLVERTEX, nNumVertices As Integer)
    
Dim vp As D3DVIEWPORT7
Dim nClipWidth As Integer
Dim nClipHeight As Integer
        
' ビューポートの高さと幅を取得する。この操作は、トランスフォームされた頂点をレンダリング ウィンドウに
' 合わせてスケールするために必要である。
d3dDevice.GetViewport vp
nClipWidth = vp.lWidth / 2
nClipHeight = vp.lHeight / 2

Direct3D では、行列を使ってトランスフォームを実行する。3D トランスフォームを実行するには、現在の行列設定の値を取得する必要がある。この値を取得するには、レンダリング デバイスで Direct3DDevice7.GetTransform を呼び出す。

d3dDevice.GetTransform D3DTRANSFORMSTATE_WORLD, matWorld
d3dDevice.GetTransform D3DTRANSFORMSTATE_VIEW, matView
d3dDevice.GetTransform D3DTRANSFORMSTATE_PROJECTION, matProj

行列を連結するには、行列乗算を使用する。

Dim matSet As D3DMATRIX
    
g_dx.IdentityMatrix matSet
     
' 行列を連結する。
g_dx.MatrixMultiply matSet, matWorld, matView
g_dx.MatrixMultiply matSet, matSet, matProj

上記のコードでは、合成行列 matSet を計算して、必要なトランスフォームの積を得る。連結時には、行列が処理順に乗算されるようにする。

行列連結については、「行列連結」を参照すること。

ここで、現在の行列設定によって各頂点をトランスフォームする。

For i = 0 To nNumVertices - 1
' 未トランスフォームの頂点位置を取得する。
x = vVertices(i).sx
y = vVertices(i).sy
z = vVertices(i).sz
        
xp = matSet.rc11 * x + matSet.rc21 * y + matSet.rc31 * z + matSet.rc41
yp = matSet.rc12 * x + matSet.rc22 * y + matSet.rc32 * z + matSet.rc42
zp = matSet.rc13 * x + matSet.rc23 * y + matSet.rc33 * z + matSet.rc43
wp = matSet.rc14 * x + matSet.rc24 * y + matSet.rc34 * z + matSet.rc44

最後に、スクリーン座標に合わせて頂点をスケールする。次のコードでは、最初のステップで、各座標を wp 値で除算することにより、3D 空間から 2D デバイス座標に変換する。次に、x 座標と y 座標をデバイス座標からスクリーン座標に変換する。

vVertices(i).sx = (1# + (xp / wp)) * nClipWidth
vVertices(i).sy = (1# - (yp / wp)) * nClipHeight
vVertices(i).sz = zp / wp
vVertices(i).rhw = wp
Next i

3D トランスフォームの詳細については、「3D トランスフォーム」を参照すること。

 :  デバイス座標は、ビューポートの -1 から +1 の範囲になる。また、z バッファでは sz 座標を使用する。

これで、立方体の 8 つの頂点をトランスフォームしたので、完成したシーンのフレームをレンダリングすることができる。これが、「ステップ 2.3 : シーンをレンダリングする」の説明内容である。