Share via


射影トランスフォームとは

射影トランスフォームとは

射影行列とは、一般に、スケーリングと遠近法による射影である。射影トランスフォームでは視錐台を立方体にトランスフォームする。視錐台の近くの端は遠くの端よりも小さいので、このトランスフォームにはカメラの近くのオブジェクトを拡大するという効果があり、これによってシーンに遠近感が生まれる。

視錐台では、ビュー トランスフォーム空間の原点とカメラの間の距離が任意の値 D として定義され、射影行列は次のようになる。

数学的な式

ビュー行列は、z 方向に D だけ平行移動することによって、カメラを原点に平行移動する。平行移動行列は、次のようになる。

数学的な式

平行移動行列に射影行列を乗算 (T*P) すると、それらを合成した射影行列ができる。これは次のようになる。

数学的な式

次の図は、パースペクティブ トランスフォームが視錐台を新しい座標空間に変換する方法を示している。視錐台が立方体になること、およびシーンの右上角にあった原点が中心に移動することに注目する。

立方体の図

パースペクティブ トランスフォームでは、x 方向と y 方向の限界は -1 と 1 である。z 方向の限界は、前方面ついては 0 で、後方面については 1 である。

この行列は、カメラから前方のクリップ面までの距離に基づいてオブジェクトを平行移動およびスケーリングする。 しかし、この行列は視野 (FOV) を考慮せず、遠くのオブジェクトに対して生成する z 値はほとんど同じなので、深度比較が困難になる。この問題を解決するために、次の行列は、ビューポートのアスペクト比を考慮して頂点を調整し、アスペクト比をパースペクティブ射影に合わせる。

数学的な式

この行列では、Zn は前方のクリップ面の z 値である。変数 whQ の意味は、次のとおりである。fovw および fovk は、ビューポートの水平方向および垂直方向の視野を表す (ラジアン単位)。

数学的な式

アプリケーションでは、視野角度を使って x と y の倍率を定義することは、ビューポートの水平寸法と垂直寸法 (カメラ空間の) を使うのに比べて不便な場合がある。数値演算として、次に示す wh 用の 2 つの式ではビューポートのサイズを使っている。これらの式は上の公式と同等である。

数学的な式

これらの式では、Zn は前方のクリップ面の位置座標を表し、変数 Vw と Vh はカメラ空間でのビューポートの幅と高さを表している。

C++ アプリケーションでは、幅と高さの寸法は、D3DVIEWPORT9 構造体の Width および Height メンバに直接対応する。

どの式を使う場合でも、Zn をできるだけ大きな値に設定することが重要である。理由は、カメラに極端に近い z 値は大幅には変化しないからである。これによって、16 ビットの z バッファを使う深度比較は若干複雑になる。

ワールド トランスフォームおよびビュー トランスフォームと同様、IDirect3DDevice9::SetTransform メソッドを呼び出して射影トランスフォームを設定する。