透視投影矩陣簡明說明

本文主要由三個部分構成:視錐,視場與透視投影矩陣的推導.bash


視錐:

如圖所見,視錐是一個錐形的幾何體,其中near與far以前的空間就是咱們的可視範圍.spa

其中near和far也分別被稱爲近平面與遠平面.code

再算上,上下左右四個面,一個視椎總共由6個面構成.cdn


視場:

視場分爲水平視場,與垂直視場,先來講水平視場.blog

水平視場.

如圖所見,水平視場是在xz平面上的錐形區域,且被限制在[-1,1]之間.遊戲

角度α = 2arctan(1/e)

焦距e=1/tan(α/2)
複製代碼

tan是對邊比鄰邊,因此對邊越大tan越大,而後1/tan就越小.根據公式可知,e越小遠平面所佔據的比例就越大,視場就越寬.數學


垂直視場:

焦距與角度的計算與水平視場相同.string


透視投影矩陣的推導

根據類似三角形定理可知投影點x,y座標的表達式爲:it

(1)io

x = (-e/Pz)*Px
y = (-e/Pz)*Py
Px,Py,Pz爲屏幕中的點的座標.
複製代碼

如今來將x與y的取值範圍爲限定在[-1,1]

定義l<=x<=r,b<=y<=t

那麼

(2)

x' = (x-l) * 2/(r-l) - 1 y' = (y-b) * 2/(t-b) - 1
複製代碼

如今咱們就得到了取值範圍在[-1,1]之間的x'與y'.

接下來是取值範圍在[-1,1]的z':

列出能讓-n = -1與-f=1到表達式:

z' = A/z + B -1 = A/-n + B -1 = A/-f + B 複製代碼

推導出下列公式:

A = 2nf/(f-n)
B = (f+n)/(f-n)
複製代碼

最後可得將z'限制在[-1,1]之間的表達式.:

z' = (2nf/(f-n))/Pz + (f+n)/(f-n) 複製代碼

如今列出x',y',z'的表達式:

x' = ((-e/Pz)*Px-l) * 2/(r-l) - 1 = [2e/(r-l)](-Px/Pz)-(r+l)/(r-l) y' = ((-e/Pz)*Py-b) * 2/(t-b) - 1 = [2e/(t-b)](-Py/Pz)-(t+b)/(t-b)
z' = (2nf/(f-n))/Pz + (f+n)/(f-n) 複製代碼

到了這一步,就能夠開始構建透視投影矩陣了,在排版更好的書裏,能夠一眼看見每個表達式裏都是有-1/Pz的,因此能夠直接把x',y',z'這個三維向量,經過乘以-Pz轉換成四維向量,從而構建出透視投影矩陣. 轉換後的四維向量:

-x'Pz = [2e/(r-l)]*Px+(r+l)/(r-l)*Pz -y'Pz = [2e/(t-b)]*Py+(t+b)/(t-b)*Pz
-z'Pz = -(2nf/(f-n)) - (f+n)/(f-n)*Pz 建透視投影矩陣M: 點P: 2e/(r-l), 0, (r+l)/(r-l), Pz Px 0, 2e/(t-b), (t+b)/(t-b), 0 Py 0, 0, -(f+n)/(f-n), -(2nf/(f-n)) Pz 0, 0, -1, 0 1 複製代碼

P' = M*P

透視投影矩陣推導這塊較爲繁瑣,推薦參閱3D遊戲與計算機圖形學中的數學方法一書.

相關文章
相關標籤/搜索