1. 程式人生 > >opengl的GL_PROJECTION變換矩陣

opengl的GL_PROJECTION變換矩陣

opengl將一個點從攝像頭座標系(投影座標系)轉換到NDC(標準座標系)的轉換矩陣如下:

OpenGL Perspective Projection Matrix

攝像頭座標系的形狀如下圖第一個, 是一個平截頭體

x軸方向上定義  r: right  , l: left,  y軸方向上定義 t: top,    b: bottom,  z軸方向上定義  n: near,    f: far。
每個攝像頭根據焦距的不同,對應的上面的值也會有差別。根據實際情況調整數值。


下圖的第二個座標系就是標準座標系:NDC(normalized device coordinates),是opengl初始的座標系。

OpenGL Perspective Frustum and NDC

計算該變換矩陣的原理如下:

Top View of FrustumSide View of Frustum

假設攝像頭座標系內有一個點(e),則該點在  -n 這個平面上的 X,Y 座標投影可以通過比例計算出來。

(攝像頭座標系,攝像頭所在座標為原點。這是opengl強制要求)

           

然後將 -n平面中X,Y 投影點  對映到 NDC 中,比如X 座標為: [l, r] ⇒ [-1, 1] ,通過線性關係,計算出在NDC的位置

Y軸座標變換為:[b, t] ⇒ [-1, 1], 其 計算方式與X軸一樣,不再重複說明。


最終合併後,將   e 從 攝像頭座標系轉到 NDC的 表示式為:

         

根據上面的公式,我們看到都需要 除以  -ze

我們可以將Wc 的值設為-ze。  (W 數值的作用: 如果W不為0, 那麼使用四維向量表示的3維座標是:Normalized Device Coordinates

因此,我們就可以得到變換矩陣的部分數值。

剩餘 Z 軸座標的變換,Z軸座標用於 裁剪 和 深度測試。 Z軸座標不依賴於 X,Y軸。因此假設Zn 與Ze 和 We相關,引數設為A,B


在 攝像頭座標系中 ,We 數值為1(X,Y, Z就是真正的座標位置)。

為了計算A和B 的值, 使用(ze, zn) 對映關係 (-n, -1) and (-f, 1)。


通過計算方程式,最終得到上面的變換矩陣。

(注: 此篇內容參考網頁: http://www.songho.ca/opengl/gl_projectionmatrix.html)