天天看點

[翻譯]投影變換 Projection Transform (Direct3D 9)

你可以認為投影變換就是控制錄影機内部的一種方式。他可以類推為為錄影機選擇一個漏字闆。它是三種變換中最難懂的。本文隻讨論以下的一些内容。

典型的投影變換就是縮放和透視投影。投影就變換把視椎轉化為一個立方體。近大遠小。這就是把透視應用于場景。

在視椎體中,錄影機與變換空間原點的距離被定義為D,是以投景矩陣看起來像這樣:

[翻譯]投影變換 Projection Transform (Direct3D 9)

觀察矩陣把錄影機通過把z軸-D 平移到原點。平移矩陣如下 

[翻譯]投影變換 Projection Transform (Direct3D 9)

他們兩個矩陣相乘得到以下矩陣

[翻譯]投影變換 Projection Transform (Direct3D 9)

透視轉換把視椎體轉化為新的一個坐标空間。注意視堆平截變為一個立方體,原點炎右上角移動到場景的中間,如圖所示

[翻譯]投影變換 Projection Transform (Direct3D 9)

在透視變換中,x和y方向的範圍是-1到1。z方向的範圍是0(在平面前面),1(在平面後面)

這人矩陣平移和縮放模型是根據錄影機與截面的距離,但是目前 沒有考慮到視角大小 ,并且它為遠端物體産生的z值可能幾乎相同,這使嘗試比較變的困難。以下矩陣解決了問題,并根據 視區的縱橫比調整頂點,這使它成為透視投影的一個很好的選擇。

[翻譯]投影變換 Projection Transform (Direct3D 9)

在這個矩陣中,Zn是近裁剪平面的z值。變量w,h和Q有以下含義。注意fovw和fovh表示視區在水準和垂直方向上的視角,以弧度為機關

[翻譯]投影變換 Projection Transform (Direct3D 9)

對應用程式而言,使用視角的角度定義x和y的比例系數可能不如使用視區在水準和垂直方向上的大小(在錄影機空間中)友善。可以用數學推導,得出下面兩個使用視區大小計算w和h的公式,它們與前面的公式是等價的。

[翻譯]投影變換 Projection Transform (Direct3D 9)

在這兩個公式中,Zn表示近裁剪平面的位置,Vw和Vh變量表示視區在錄影機空間的寬和高。

對于C++應用程式而言,這兩個大小直接對應于D3DVIEWPORT9結構的Width和Height成員。(譯注:雖然直接對應,但是不等價的,因為Vw和Vh位于錄影機空間,而Width和Height位于螢幕空間)

無論決定使用什麼公式,非常重要的一點是要盡可能将Zn設得大,因為接近錄影機的z值變化不大。這使得用16位z緩存的深度比較變得有點複雜。

同世界變換和觀察變換一樣,應用程式調用IDirect3DDevice9::SetTransform方法設定投影矩陣。

繼續閱讀