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 ユーティリティ ライブラリには、射影行列を設定する次の関数が用意されている。