Unity相機透視投影矩陣的推導(dǎo)筆記

相機透視投影矩陣的目標是將視錐體內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容