Microsoft DirectX 8.0 (C++) |
C++ で記述された、次の ProjectionMatrix サンプル関数は、水平および垂直視野の角度のほかに、前方および後方クリップ面を設定する 4 つの入力パラメータを受け取る。このコードは、「射影トランスフォームとは」で示すコードと類似している。視野は pi ラジアン未満にする必要がある。
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 の最後。
行列を作成した後は、IDirect3DDevice8::SetTransform メソッドを呼び出してその行列を設定し、第 1 パラメータに D3DTRANSFORMSTATE_PROJECTION を指定する必要がある。詳細については、「トランスフォームの設定」を参照すること。
ただし、Direct3DX ユーティリティ ライブラリには、射影行列を設定する次の関数が用意されている。