1. 程式人生 > >計算機圖形學----投影矩陣

計算機圖形學----投影矩陣

投影矩陣概述

在得到相機座標後,就相當於得到了人眼觀察世界中物體的座標,但是我們需要把物體對映到一個二維平面上用於顯示,投影矩陣就起到把三維座標對映到二維座標的作用,同時因為三維空間有深度的概念,因此把Z軸轉化成深度。W作為一個係數,用於檢測是否超出視窗範圍。

投影變換最終的效果是把各個座標對映到 [ 1 , 1

] [-1,1] 之間,然後再乘以相應的螢幕高度和寬度,得到最終的螢幕座標。 [ 1 , 1 ]
[-1,1]
的座標又成為NDC座標

推導過程參照:http://www.songho.ca/opengl/gl_transform.html ,一般直接套公式使用即可。

透視投影

M p r

o j e c t i o n = [ 2 n r l 0 r + l r l 0 0 2 n t + b t b 0 0 0 f + n f n 2 f n f n 0 0 1 0 ] \bf{M}_{projection}= \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0\\ 0 & \frac{2}{n} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix}
n是近平面距離,f是遠平面距離。l、r、t、b分別是左右上下
此時變換完成後,還不是NDC座標,需要每個座標乘以 w w 分量才行,下面的操作:
[ x c l i p y c l i p z c l i p w c l i p ] = M p r o j e c t i o n [ x e y e y e y e z e y e w e y e ] \begin{bmatrix} x_{clip}\\y_{clip}\\z_{clip}\\w_{clip} \end{bmatrix}=\bf{M}_{projection}\begin{bmatrix} x_{eye}\\y_{eye}\\z_{eye}\\w_{eye} \end{bmatrix}
其中,eye表示相機座標,clip表示初步對映的座標。

之後,再除以 w w 分量,得到NDC座標:
[ x n d c y n d c z n d c ] = [ x c l i p / w c l i p y c l i p / w c l i p z c l i p / w c l i p ] \begin{bmatrix} x_{ndc}\\y_{ndc}\\z_{ndc} \end{bmatrix}= \begin{bmatrix} x_{clip}/w_{clip}\\y_{clip}/w_{clip}\\z_{clip}/w_{clip} \end{bmatrix}
如果NDC不在[-1,1],表示超出螢幕範圍,不能顯示。

正交投影

正交投影的基本步驟是一致的,只是變換矩陣不同:
[ 2 r l 0 0 r + l r l 0 2