關(guān)于透視矩陣-P的一些扯淡推導(dǎo)
推倒P矩陣過程:
這里推導(dǎo)P矩陣的思路主要還是來源于GAMES101的思路。
X,Y的系數(shù)很好推,就是一個簡單的等比例縮放,便不再贅述。
比較困難的是Z坐標(biāo),即深度的變化。
猜測在裁剪過程中,裁剪后的Z值不受到該點(diǎn)其X、Y值的影響,因此不妨直接假設(shè)變化后的Z’ = aZ + b; 即P矩陣的(3,3)與(3,4)的系數(shù)。
我們得到了一個二元一次方程,因此我們需要找到兩個方程來求解這兩個方程。
首先我們變換裁剪空間的目的是為了滿足關(guān)于w的三個不等式(三個不等式對應(yīng)了齊次除法后空間變?yōu)镹dc)以此判斷三維空間中的頂點(diǎn)是否在我們的視錐體中,因此我們可以得到近裁見面的四個頂點(diǎn)的坐標(biāo)和遠(yuǎn)裁剪面的四個頂點(diǎn)的坐標(biāo),當(dāng)然隨著裁剪它們都發(fā)生了變化。(個人猜測深度是普遍朝向Far平面拉伸了)
然而,有兩個神奇的點(diǎn)位幾乎不發(fā)生任何變化,那就是ZNear的中心點(diǎn)和ZFar的中心點(diǎn)。最終一個變?yōu)?ZNear,一個Z變?yōu)閆Far。因此我們可以得到了兩個方程。
第一個: -aZnear + b = -ZNear 第二個: -aZFar + b = ZFar;
最終解方程組得到a= Far+Near / Far-Near , b = -2NearFar / Far - Near;
最后我們需要將坐標(biāo)系變?yōu)樽笫肿鴺?biāo)系,因此新的w’ = -z
所以最后一行為 0 0 -1 0.
也就是說透視矩陣的意義大概就是轉(zhuǎn)化為Ndc之前的最后一步,把整個攝像機(jī)空間的深度值拉成一正一負(fù)(左手坐標(biāo)系是z值越大越遠(yuǎn),因此ZFar平面需要置為正,并且要從右手坐標(biāo)系變回左手坐標(biāo)系,否則三個不等式就要反過來,也就是說z值越大越近,變?yōu)橛沂肿鴺?biāo)系),于是便得到了透視變換后的空間。