透視投影とは
ビュー座標系からクリッピング座標系への変換を投影変換といい、透視投影とはその1種です。
具体的には、空間上に錐台の視体積(視錐台)を定め、それを原点が中心とした辺の長さが2の直方体(標準視体積)へ移す変換のことです。
透視投影変換行列 - 導出その1
ビュー座標系は右手座標系、正規化デバイス座標系は左手座標系とします。
ビュー座標系における視体積を定めるため、各軸の最小値最大値を決めます。
ビュー座標系における視体積の前方面のxy軸の最小値最大値をそれぞれ 、前方面のz値を 、 後方面のz値を とします。
まずは、zを-1倍することにより、右手座標系から左手座標系へ変換します。
この変換により、 は となります。
ここから透視投影の変換をやっていきます。
点 の座標を とします。
点 を前方面に投影した点 の座標を をとします。
点 を正規化デバイス座標系に変換した点 の座標を とします。
まずは、 を求めてます。
前方面に投影されているので 座標は以下のようになります。
これを に移せばよいので、 座標は以下のようになります。 を に代入し、 を に代入して整理します。次に を求めます。
は の関数になるように作る必要があるので、以下のようになります。 であり、これを に移せばよいので、以下の式が成り立ちます。
を について解きます。
を に代入します。
が求まったので、これを として、同次座標にします。
以上より、透視投影変換行列 は以下のようになります。
透視投影変換行列 - 導出その2
左手座標系に変換するところまでは、導出その1と同じです。
まず、前方面上の矩形の表示領域の中心をz軸を通るようにします。
これは、xy軸方向において「横に押し出すような変形」なので、せん断変換を行います。
この変換行列 は以下のようになります。
次に、投影します。
点 の座標を とします。
点 を前方面に投影した点 の座標を をとします。
まずxy座標から考えましょう。
前方面に投影されているので 座標は以下のようになります。
次にzですが、zは、zに反比例するので、 と変換します。
その後、zの中心が原点に平行移動すると、 となります。
この変換により、 となっています。
この変換行列 は以下のようになります。
最後に、視体積の辺の長さを2にします。
このときの変換行列 は以下のようになります。
透視投影変換行列 は を掛け合わせたものとなります。
最後に
near,farの値については、平行投影の記事を参照してください。
せん断の図を添えたい。
透視深度についてもう少しくどく解説してもよいかもしれない。
fovyの透視投影は別記事にしようかな?(未定)
参考文献
コンピュータグラフィックスの基礎 p55-p60
ゲームプログラミングのための3Dグラフィックス数学 p89-p100
Real-Time Rendering, Third Edition p92-p96