相機透視投影矩陣的目標是將視錐體內(nèi)的頂點映射到規(guī)范觀察立方體內(nèi)

透視錐到標準設(shè)備坐標
先用相似三角形的原理,計算出x與y在近裁剪面上的投影

image.png
先計算x軸

image.png
同理,再計算y軸

image.png
因為Xp,Yp都與-Ze成反比,因為相機空間的坐標被GL_PROJECTION矩陣轉(zhuǎn)換后還是齊次坐標,最終得到NDC坐標是通過除以裁剪坐標的W-元素來得到的,所以把-Ze當作裁剪坐標的W元素

image.png
接下來根據(jù)Xp->Xn, Yp->Yn的映射關(guān)系:[r,l] [1, -1],[b,t],[1, -1]得出歸一后公式(一次函數(shù))

image.png
把Xp,與Yp代入到公式中

image.png
使方程里的每一項都除以-Ze,使括號里的變成了裁剪坐標Xc,Yc
這樣,已經(jīng)推導(dǎo)出了第一排與第二排

image
求Zn與Xn,Yn不太一樣,所有點的Ze投影到近裁剪面上以后都是相同的,但是我們要用Ze來進行裁剪與深度測試,所以我們要反向投影。Z軸與X,Y軸是無關(guān)聯(lián)的,可以用z軸與近裁剪面與遠裁剪面相交的兩個特殊點[0,0,-n,1],[0,0,-f,1],反推出映射關(guān)系中的A,B

image.png
因為在相機空間中,We是1所以簡化為

image
在規(guī)則觀察體里-n映射成-1,-f映射成1,代入方程

image
解方程A,B

image.png
再把Ze與Zn的關(guān)系代入

image
得到最終矩陣

OpenGL Perspective Projection Matrix
如果相機視錐是對稱的,r=-l, t=-b,投影矩陣可以簡化為

image.png
需要注意到Ze與Zn的關(guān)系不是線性的,離近裁剪面近的時候變化很大,遠的時候變化很小,這會導(dǎo)致深度的精度問題,所以盡可能使用小一些的深度值

Comparison of depth precision
學(xué)習(xí)參考文章:http://www.songho.ca/opengl/gl_projectionmatrix.html
學(xué)習(xí)參考文章2:https://zhuanlan.zhihu.com/p/359128442