Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「Direct3D 直接モードの C/C++ チュートリアル」を参照すること。
このチュートリアルでは、ジオメトリ トランスフォームを使って、立方体の位置座標をシーン内のほかのオブジェクトとの関係で定義し、立方体を回転して、シーン内で立方体をスケールする。
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 : シーンをレンダリングする」の説明内容である。