Microsoft DirectX 8.0 (Visual Basic) |
射影行列とは、一般に、スケーリング パースペクティブ射影である。射影トランスフォームでは視錐台を立方体にトランスフォームする。視錐台の近くの端は遠くの端よりも小さいので、このトランスフォームにはカメラの近くのオブジェクトを拡大するという効果があり、これによってシーンに遠近感が生まれる。
視錐台では、射影トランスフォームに必要なカメラとビュー トランスフォームによって定義される空間の原点の間の距離が、D として定義される。パースペクティブ射影を定義する行列では、次のように、最初にこの変数 D を使用する。
ビュー行列は、カメラをシーンの原点に配置する。射影行列では (0, 0, -D) にカメラを配置する必要があるので、射影行列は次の行列を使用してベクトルを z 方向に -D だけ平行移動する。
これら 2 つの行列を乗算すると、次のような合成行列ができる。
次の図は、パースペクティブ トランスフォームが視錐台を新しい座標空間に変換する方法を示している。視錐台が立方体になること、およびシーンの右上角にあった原点が中心に移動することに注目する。
パースペクティブ トランスフォームでは、x 方向と y 方向の限界は -1 と 1 である。z 方向の限界は、前方面ついては 0 で、後方面については 1 である。
この行列は、カメラから前方のクリップ面までの距離に基づいてオブジェクトを平行移動およびスケーリングする。しかし、この行列は視野 (FOV) を考慮せず、遠くのオブジェクトに対して生成する z 値はほとんど同じなので、深度比較が困難になる。この問題を解決するために、次の行列は、ビューポートのアスペクト比を考慮して頂点を調整し、アスペクト比をパースペクティブ射影に合わせる。
この行列では、Zn は前方のクリップ面の z 値である。変数 w、h、および Q の意味は、次のとおりである。FOVw および FOVh は、ビューポートの水平方向および垂直方向の視野を表す (ラジアン単位)。
アプリケーションでは、視野角度を使用して x と y の倍率を定義することは、ビューポートの水平寸法と垂直寸法 (カメラ空間の) を使用するのに比べて不便な場合がある。数学の練習問題として、次に示す w と h 用の 2 つの式ではビューポートの寸法を使用している。これらの式は上の公式と同等である。
これらの式では、Zn は前方のクリップ面の位置座標を表し、変数 Vw と Vh はカメラ空間でのビューポートの幅と高さを表している。
Microsoft® Visual Basic® アプリケーションでは、幅と高さの寸法は、D3DVIEWPORT8 型の Width および Height メンバに直接対応する。
どの式を使用する場合でも、Zn をできるだけ大きな値に設定することが重要である。理由は、カメラに極端に近い z 値は大幅には変化しないため、16 ビットの z バッファを使用する深度比較が困難になるからである。
ワールド トランスフォームおよびビュー トランスフォームと同様、Direct3DDevice8.SetTransform メソッドを使用して射影トランスフォームを設定する。詳細については、「トランスフォームの設定」を参照すること。