射影トランスフォームProjection transform

"射影変換" はカメラの内部を制御します。これは、カメラのレンズを選択することと似ています。A projection transformation controls the camera's internals, like choosing a lens for a camera. このトランスフォームは、3 種類のトランスフォームの中で最も複雑です。This is the most complicated of the three transformation types.

射影行列とは、通常、スケーリングおよび遠近法による射影です。The projection matrix is typically a scale and perspective projection. 射影トランスフォームでは、視錐台を立方体に変換します。The projection transformation converts the viewing frustum into a cuboid shape. 視錐台の近くの端は遠くの端よりも小さいので、このトランスフォームにはカメラの近くのオブジェクトを拡大するという効果があり、これによってシーンに遠近感が生まれます。Because the near end of the viewing frustum is smaller than the far end, this has the effect of expanding objects that are near to the camera; this is how perspective is applied to the scene.

視錘台では、ビュー トランスフォーム空間の原点とカメラの間の距離が任意の値 D として定義され、射影行列は次のようになります。In the viewing frustum, the distance between the camera and the origin of the viewing transform space is defined arbitrarily as D, so the projection matrix looks like the following illustration.


ビュー行列は、z 方向に - D だけ平行移動することによって、カメラを原点に平行移動します。平行移動行列は、次のようになります。The viewing matrix translates the camera to the origin by translating in the z direction by - D. The translation matrix is like the following illustration.


射影行列の平行移動行列を乗算すること (T*P)、複合投影マトリックスは、次の図に示すようにします。Multiplying the translation matrix by the projection matrix (T*P) gives the composite projection matrix, as shown in the following illustration.


次の図は、パースペクティブ (遠近投影) トランスフォームで視錐台を新しい座標空間に変換する方法を示しています。The perspective transform converts a viewing frustum into a new coordinate space. 視錐台が立方体になること、およびシーンの右上角にあった原点が中心に移動することに注目してください。Notice that the frustum becomes cuboid and also that the origin moves from the upper-right corner of the scene to the center, as shown in the following diagram.

パースペクティブ トランスフォームで視錐台を新しい座標空間に変更する方法の図

パースペクティブ トランスフォームでは、x 方向と y 方向の限界は -1 と 1 です。In the perspective transform, the limits of the x- and y-directions are -1 and 1. z 方向の限界は、前方面については 0 で、後方面については 1 です。The limits of the z-direction are 0 for the front plane and 1 for the back plane.

この行列は、カメラから付近のクリップ面まで、指定された距離に基づいてオブジェクトを平行移動およびスケーリングします。しかし、この行列は視野 (fov) を考慮せず、遠くのオブジェクトに対して生成する z 値はほとんど同じになる可能性があるので、深度比較が困難になります。This matrix translates and scales objects based on a specified distance from the camera to the near clipping plane, but it doesn't consider the field of view (fov), and the z-values that it produces for objects in the distance can be nearly identical, making depth comparisons difficult. この問題を解決するために、次の行列は、ビューポートのアスペクト比を考慮して頂点を調整し、アスペクト比をパースペクティブ射影に合わせます。The following matrix addresses these issues, and it adjusts vertices to account for the aspect ratio of the viewport, making it a good choice for the perspective projection.


この行列では、Zₙ は付近のクリップ面の z 値です。In this matrix, Zₙ is the z-value of the near clipping plane. 変数 w、h、および Q には、次のような意味があります。The variables w, h, and Q have the following meanings. fovw および fovₖ は、ビューポートの水平方向および垂直方向の視野を表します (ラジアン単位)。Note that fovw and fovₖ represent the viewport's horizontal and vertical fields of view, in radians.


アプリケーションでは、視野角度を使って x と y のスケール係数を定義することは、ビューポートの水平寸法と垂直寸法 (カメラ空間の) を使用するのに比べて不便な場合があります。For your application, using field-of-view angles to define the x- and y-scaling coefficients might not be as convenient as using the viewport's horizontal and vertical dimensions (in camera space). 数値演算として、次に示す w と h の 2 つの式ではビューポートの寸法を使用します。これらの式は上の公式と同等です。As the math works out, the following two equations for w and h use the viewport's dimensions, and are equivalent to the preceding equations.

w および h 変数の意味の公式

これらの式では、Zₙ は付近のクリップ面の位置を表し、変数 Vw と Vₕ はカメラ空間でのビューポートの幅と高さを表しています。In these formulas, Zₙ represents the position of the near clipping plane, and the Vw and Vₕ variables represent the width and height of the viewport, in camera space.

どの式を使用する場合でも、必ず、Zₙ をできるだけ大きな値に設定します。カメラに極端に近い z 値は大幅には変化しないからです。Whatever formula you decide to use, be sure to set Zₙ to as large a value as possible, because z-values extremely close to the camera don't vary by much. これにより、16 ビットの z バッファーを使う深度比較は多少複雑になります。This makes depth comparisons using 16-bit z-buffers somewhat complicated.

W な射影行列A w-friendly projection matrix

Direct3D では、ワールド行列、ビュー行列、および射影行列によって変換された頂点の w 成分を利用して、深度バッファーまたはフォグ エフェクトの計算を深度をベースに実行できます。Direct3D can use the w-component of a vertex that has been transformed by the world, view, and projection matrices to perform depth-based calculations in depth-buffer or fog effects. このような計算では、射影行列で w を正規化して、ワールド空間の z と等価にする必要があります。Computations such as these require that your projection matrix normalize w to be equivalent to world-space z. つまり、射影行列に 1 ではない (3,4) 係数が含まれる場合、(3,4) 係数の逆数を使ってすべての係数をスケーリングすることで、適切な行列を作成しなければなりません。In short, if your projection matrix includes a (3,4) coefficient that is not 1, you must scale all the coefficients by the inverse of the (3,4) coefficient to make a proper matrix. 対応していない行列を使用すると、フォグ エフェクトと深度バッファーが正しく適用されません。If you don't provide a compliant matrix, fog effects and depth buffering are not applied correctly.

次の図は、対応していない射影行列、および同じ行列をスケーリングして視点との相対フォグが有効になるようにした行列を示しています。The following illustration shows a noncompliant projection matrix, and the same matrix scaled so that eye-relative fog will be enabled.


上の図では、すべての変数がゼロ以外の値であるとします。In the preceding matrices, all variables are assumed to be nonzero. w ベースの深度バッファリングについて詳しくは、「深度バッファー」を参照してください。For information about w-based depth buffering, see Depth buffers.

Direct3D では、現在設定されている射影行列を使って w ベース深度の計算を実行します。Direct3D uses the currently set projection matrix in its w-based depth calculations. したがって、トランスフォームで Direct3D を使用しない場合であっても、アプリケーションでは、目的の w ベース機能を取得するために適切な射影行列を設定しておく必要があります。As a result, applications must set a compliant projection matrix to receive the desired w-based features, even if they do not use Direct3D for transforms.

関連トピックRelated topics