Platform SDK: DirectX

射影行列の設定

[C++]

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]

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 を指定する必要がある。詳細については、「トランスフォームの設定」を参照すること。