圖一
透視矩陣把物體投影到一個距離攝像機為N的一個平面上,用圖一可以看,我們把P投影近裁剪面P’點
我們定義兩個點
根據相似三角形原理我們得到公式1
那么
因為z值永遠都是N,但是我們可以用來存儲一些其他信息,比如原來的Z值
換種寫法
用齊次坐標系表達的話
那么我們根據P P’推導下投影矩陣
得到投影矩陣
到這里我們 。經過除以齊次坐標得到真正的投影空間坐標。一般透視矩陣讓人難於理解是因為,他還把其他一步功能糅雜在里面,把兩步操作隱藏在一個矩陣中。
我們知道Camera可是區域是個梯形椎體,在計算中,對於計算機的椎體的裁決(裁剪掉攝像機外圍的不可見點)計算比較復雜。我們如何使裁剪變的更容易呢。如果所有的都變換的一個規正的形狀中就比較好了,比如說一個立方體或者一個長方體中。這樣就比較好判斷。只要根據長寬高比值比較就可以判斷是否在攝像機的中,如果不在就剔除掉。所以在透視矩陣是分為兩步 透視乘法變換,變換到canonical view volume(CVV)規則觀察體。在中間還有一步是CVV裁剪。后面再進行透視除法,得到真正的投影點
。我們今天只討論透視乘法和透視除法兩步。我們這里先討論DX情況下CVV空間,OpenGL參數有些差異。等下說明,原理一樣
我們在先在DX情況下討論。
先說下Z軸,Z軸在[0,1]我們定義近的裁剪面距離為N,遠的裁剪面距離為F,
變換得到
那么投影矩陣現在可以寫成
現在計算X軸和Y軸 x在[-1,1] y[-1,1],定義屏幕左右邊界為 right和left 屏幕上下邊界為 top和bottom
先計算X軸的情況
我們這里分為兩種情況,一種是特殊,一種是普通
特殊情況是 right left 大小相同 一正一負,投影點正好在屏幕中心點
另一個通用的是左右兩邊不對稱。投影點不在屏幕中心點
我們先討論特殊情況,也是我們一般碰到的,屏幕的中心在投影點,左右對稱
那么上面公式可以變換成
我們可以發現在公式中
定義屏幕寬是640分辨率,中心是0 右邊是-320 左邊是 320
得到
同樣
現在的投影點p'寫成
那么我們根據P P’推導下投影矩陣
那么現在的投影矩陣是
這個就是我們推導的投影矩陣了,我們同樣跟MSDN的
D3DXMatrixPerspectiveLH
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205352(v=vs.85).aspx
投影矩陣比對下
發現是一樣的,證明推導沒錯。
MSDN里面還有種寫法是傳入參數 屏幕的寬高比 和 鏡頭視角大小
D3DXMatrixPerspectiveFovLH
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205350(v=vs.85).aspx
這里鏡頭視角是取Y-Z平面的視角大小,我們也可以用X-Y平面看推導出來。但是推導出投影矩陣的有差異
如圖根據三角函數我們可以推導出以下公式
那么矩陣中 元素我們可以換種寫法
根據寬高比
那么投影矩陣可以寫成
我們跟MSDN里面的對比下是一樣的
繼續我們剛剛討論 屏幕中心不在投影點的情況,那么就沒有消除
同樣
現在P'的寫法
反推導矩陣
MSDN里面
D3DXMatrixPerspectiveOffCenterLH
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205353(v=vs.85).aspx
就是這種推導,比對下
當我們屏幕中心在投影點的時候 Left+Right = 0 Top+Bottom =0 ,代入,其實和特殊矩陣是一樣的
OpenGL 待續