本文主要是對OpenGL紅寶書(第八版)第五章中給出的透視投影矩陣和正交投影矩陣做一個簡單推導。投影矩陣的目的是:原始點P(x,y,z)對應後投影點P'(x',y',z')滿足x',y',z'∈[-1,1]。
OpenGL編程指南(原書第八版2013年最新)英文PDF 下載見 http://www.linuxidc.com/Linux/2015-08/122230.htm
OpenGL編程指南(原書第7版)中文掃描版PDF 下載見 http://www.linuxidc.com/Linux/2012-08/67925.htm
一、透視投影
下圖為透視投影的視錐體:
注:上圖中忘了標注了,遠裁剪平面距離原點距離為f,近裁剪平面距離原點距離為n。
設P(x0, y0, z0),我們分別求各個坐標在投影後的值。將P點投影到近平面上,首先看x方向上的投影,沿著過P點,且平行於xoz平面切一刀,有如下圖:
假設投影後的x坐標為:x_n(在近裁剪平面的投影),由相似三角形的性質,有
,可以得到:
同理,有
這樣其實實現了透視投影,近大遠小的效果,因為z0越大,則x1,y1就越小。為了將這兩個值轉換到[-1,1]區間內,設l和r分別為近裁剪平面左、右邊框的x坐標,即l=-w/2,r=w/2(如圖所示,w為上下邊框的長度),為了使任何投影到近裁剪平面的點都在區間內,轉換後,[l',r']∈[0,1],其中l',r'分別為l和r轉換後的值。因為是線性轉換,可領x'=kx+b,則下式成立:
求得,
再根據之前的結果,可以得到歸一化後的x坐標為:
同理,設t和p分別為近裁剪平面上下邊框的y坐標,則:
投影後的坐標都有一個共同因子——[-1/z0],正好對應變換後w=-z0。
接下來,我們看z要滿足什麼要求。為簡化討論,根據以上結論,我們假設透視變換有下述形式:
於是:
最後的變換矩陣如下:
OpenGL超級寶典 第4版 中文版PDF+英文版+源代碼 見 http://www.linuxidc.com/Linux/2013-10/91413.htm
OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm
Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm
OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm
Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm
如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm
更多《OpenGL超級寶典學習筆記》相關知識 見 http://www.linuxidc.com/search.aspx?where=nkey&keyword=34581