下面介紹投影變換矩陣。這個相比較上一遍的就比較難了。主要分為透視投影矩陣和正交投影矩陣,本文主要介紹透視投影矩陣,正交比較簡單,就給出矩陣形式。
(1)透視投影變換矩陣
我們先來說一下透視投影需要哪些參數。如圖1所示,深色部分表示最終顯示的區域。照相機的z軸是穿過視錐體正中心的,顯示區域離相機最近的平面我們稱為Znear,最遠的平面我們稱為Zfar。其中Znear就是最終的投影窗口。所以我們要把Znear的寬映射到坐標[-1,1],把Znear的高映射到坐標[-1,1],把Znear到Zfar的深度距離映射到坐標[-1,1]。因為最后的OpenGL繪制的區域其實就是一個從(-1,-1,-1)到(1,1,1)的一個立方體。而且這樣映射還有個好處,就是繪制的時候靠近Znear的對象要比靠近Zfar的對象大。

圖1
根據這些參數我們可以得到投影變換矩陣。首先,對於這個矩陣,我們先來看x軸和y軸。我們結合上圖,根據相似三角形可以得到:

圖2
我們化簡一下可以得到Yproj=Znear*x/z和Xproj=Znear*y/z。之后我們將齊次坐標的w分量設為z,就可以得到Yproj=Znear*x和Xproj=Znear*y。再將坐標映射到[-1,1],除以投影窗口的長寬即可。我們得到部分透視投影矩陣:

圖3
我們再來看z軸。其實z軸映射也非常簡單。我們假設f(z)=A*z+B,當齊次坐標的w分量為z時,那么實際上z軸的坐標為A+B/z。我們根據映射關系得到下面兩個式子:

圖4
再根據這兩個式子,求出A和B的值(具體求解就忽略了,得到的結果就是下面矩陣第三行的兩個值)。最終得到完整的透視投影變換矩陣:

圖5
我們還可以用另一種方式來表達透視投影。這種方式一共有四個變量。
- 透視的角度fovy。如圖6所示,fovy表示的是照相機所看到的范圍。
- 投影窗口的寬高比aspect。如圖6所示,aspect就是Znear平面的寬高比。
- 顯示區域離相機最近的距離near和離相機最遠的距離far。這兩個量與前面都是一樣的。

圖6
這個表達下的透視投影矩陣如下(計算過程跟上面一種基本一致):

圖7
(2)正交投影變換矩陣
正交投影就比較簡單了。如圖8所示,顯示區域就是一立方體。因為沒有近大遠小的特性,齊次坐標的w分量不需要變化,設為1.0就可以了。另外,我們也需要把x軸,y軸,z軸分別映射到坐標[-1,1]。計算過程也和透視投影變化矩陣類似。
