Platform SDK: DirectX |
C++ で記述された、次の ProjectionMatrix サンプル関数は、水平および垂直視点の角度のほかに、前方および後方クリップ面を設定する 4 つの入力パラメータを受け取る (このコードは、「射影トランスフォームとは」で示すコードと類似している)。視野はπラジアン未満にする必要がある。
D3DMATRIX ProjectionMatrix(const float near_plane, // 前方クリップ面までの距離。 const float far_plane, // 後方クリップ面までの距離。 const float fov_horiz, // 水平視野の角度 (ラジアン) const float fov_vert) // 垂直視野の角度 (ラジアン) { float h, w, Q; w = (float)1/tan(fov_horiz*0.5); // 1/tan(x) == cot(x) h = (float)1/tan(fov_vert*0.5); // 1/tan(x) == cot(x) Q = far_plane/(far_plane - near_plane); D3DMATRIX ret; ZeroMemory(&ret, sizeof(ret)); ret(0, 0) = w; ret(1, 1) = h; ret(2, 2) = Q; ret(3, 2) = -Q*near_plane; ret(2, 3) = 1; return ret; } // ProjectionMatrix() の終わり
行列を作成した場合、IDirect3DDevice7::SetTransform メソッドを呼び出してその行列を設定し、第 1 パラメータに D3DTRANSFORMSTATE_PROJECTION を指定する必要がある。詳細については、「トランスフォームの設定」を参照すること。
Visual Basic で記述されたアプリケーションでは、「射影トランスフォームとは」で説明するように、自分で射影行列を作成できる。ただし、DirectX7 オブジェクトにはこの方法の実装が含まれており、DirectX7.ProjectionMatrix メソッドによって提供される。
次の Visual Basic コードでは、この DirectX7.ProjectionMatrix の一般的な使用方法を示す。
' ' この例では、g_dx 変数に グローバル DirectX7 オブジェクトへの ' 参照が格納されている。 ' ' pi 変数は、 'πの近似値 (3.141592) が格納される Single 型の変数である。 Dim matProj As D3DMATRIX ' 行列を初期化して単位行列にする。 g_dx.IdentityMatrix matProj ' 1 と 1000 にある前方および後方クリップ面、およびπ/2 ラジアン (90°) の視点角度の ' 視錐台を表す ' 射影行列を作成する。 Call g_dx.ProjectionMatrix(matProj, 1, 1000, pi / 2)
行列を作成した場合、Direct3DDevice7::SetTransform メソッドを呼び出してその行列を設定し、第 1 パラメータに D3DTRANSFORMSTATE_PROJECTION を指定する必要がある。詳細については、「トランスフォームの設定」を参照すること。