Platform SDK: DirectX

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

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

視錐台では、射影トランスフォームに必要なカメラとビュー トランスフォームによって定義される空間の原点の間の距離が、D として定義される。パースペクティブ射影を定義する行列では、次のように、最初にこの D 変数を使用する。

ビュー行列は、カメラをシーンの原点に配置する。射影行列では (0, 0, -D) にカメラを配置する必要があるので、射影行列は次の行列を使用してベクトルを z 方向に -D だけ平行移動する。

これら 2 つの行列を乗算すると、次のような合成行列ができる。

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

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

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

この行列では、Zn は近くのクリップ面の z 値である。変数 whQ の意味は、次のとおりである (fovwfovh は水平方向と垂直方向の視野をラジアンで表している)。

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

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

[C++]

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

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

ワールド トランスフォームおよびビュー トランスフォームと同様、IDirect3DDevice7::SetTransform メソッドを呼び出して射影トランスフォームを設定する。詳細については、「トランスフォームの設定」を参照すること。

[Visual Basic]

Visual Basic アプリケーションでは、幅と高さの寸法は、D3DVIEWPORT7 型の lWidth および lHeight メンバに直接対応する。

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

ワールド トランスフォームおよびビュー トランスフォームと同様、Direct3DDevice7.SetTransform メソッドを使用して射影トランスフォームを設定する。詳細については、「トランスフォームの設定」を参照すること。