由引數l,r,b,t,n,f定義的透視投影矩陣的推導困惑了我差不多乙個多禮拜,這幾天幾乎是天天都在思考這個問題,昨天晚上3點多鐘我突然醒了,然後我又開始想這個問題,結果終於讓我給想通了,於是我趕緊起床把這個思路記在了草稿紙上,還專門照了張**作證。
為了解決這個問題,前幾天我專門發了兩篇帖子求答案,結果知網上的竟然沉掉了。而在csdn上也沒有得到答案(質疑有關透視投影矩陣的推導)。幸虧我自己還是解決了這個問題。
下面推導的是opengl中的透視投影矩陣。
已經知道由引數fovy,aspect,n,f定義的透視投影矩陣為:(有關這塊的推導可見《3d graphics for game programming》 2.4.3 derivation of projection matrix,講得非常詳細) po
peng
l=⎛⎝
⎜⎜⎜⎜
⎜⎜⎜c
ot(f
ovy2
)asp
ect0
000c
ot(f
ovy2
)000
0−f+
nf−n
−100
−2nf
f−n0
⎞⎠⎟⎟
⎟⎟⎟⎟
⎟那麼再看另一種投影引數l,r,b,t,n,f,上面矩陣中: co
t(fo
vy2)
aspe
ct=c
ot(f
ovx2
)=2n
r−l,
cot(
fovy
2)=2
nt−b
.因為引數l,r是對應視見空間中x軸的座標,b,t對應視見空間中y軸的座標,如果l=-r並且b=-t,那麼由這種引數定義的透視投影矩陣就是: p′
open
gl=⎛
⎝⎜⎜⎜
⎜⎜2n
r−l0
0002
nt−b
0000
−f+n
f−n−
100−
2nff
−n0⎞
⎠⎟⎟⎟
⎟⎟而官方的透視投影矩陣是: po
peng
l=⎛⎝
⎜⎜⎜⎜
⎜⎜2n
r−l0
0002
nt−b
00r+
lr−l
t+bt
−b−f
+nf−
n−10
0−2n
ff−n
0⎞⎠⎟
⎟⎟⎟⎟
⎟實際上這個矩陣是由兩步轉換完成的,第一步是進行矩陣p′
open
gl變換,然後進行了平移操作,如下:
那些說這個透視投影沒有做平移這一步操作,我可以100%跟你說你是錯的!
下面我來解釋為什麼進行了平移操作。
來張示意圖:
這個是視見空間中的示意圖,因為存在l≠-r或b≠-t的情況,所以這裡我故意沒把近裁剪平面中心畫在z軸上。
示意圖上由紅線繪製的立方體才是由l,r,b,t,n,f引數定義的視錐體
,其中遠裁剪平面上的四個點分別對應原點eye經過近裁剪平面上四個點的延長線與z=-f平面的交點,注意這個視錐體是不規則的!然後圖中的標註l』, r』是近裁剪平面點(l,b,-n)和點(r,b,-n)x軸上的分量在z=
−cot
(fov
x2)上的投影,l′
=2lr
−l,r
′=2r
r−l,l』和r』的中心值是r+
lr−l
,同理近裁剪平面上點(r,b,-n)和點(r,t,-n)y軸上的分量在z=
−cot
(fov
y2)上的投影,b′
=2bt
−b,t
′=2t
t−b,b』和t』的中心值是t+
bt−b
。圖中的視錐體通過p′
open
gl透視變換之後得到的是規則的正方體(左下角頂點(2
lr−l
,2bt
−b,1
),右上角頂點(2
rr−l
,2tt
−b,−
1)),最終要把它轉換成cvv(canonical view volume,正規視覺化空間),則需要進行t平移轉換,也就是平移(−
r+lr
−l,−
t+bt
−b,0
)。得證。
OpenGL 投影矩陣的推導
計算機顯示器是乙個2d平面。opengl渲染的3d場景必須以2d影象方式投影到計算機螢幕上。gl projection矩陣用於該投影變換。首先,它將所有定點資料從觀察座標轉換到裁減座標。接著,這些裁減座標通過除以w分量的方式轉換到歸一化裝置座標 ndc 本文主要推導正交投影矩陣和透視投影矩陣。注意n...
透視投影矩陣
1.將投影面上x,y,z方向上的點,投影到剪裁空間有一定比例關係 2.y方向上的比例關係 y y0 y y0 z tan fov 2 y y tan fov 2 z 讓f 1 tan fov 2 y f z y 3.x方向上的比例關係 x f z x 根據相似三角形原理 tan fovx 2 tan...
透視校正插值 OpenGL
在3d渲染中,輸入資料是一些primitive資訊,包括頂點位置 顏色 紋理座標等等。在光柵化階段,primitive 一般為三角形 被轉化成一系列的fragment 或者稱為畫素 這些fragment接下來要做ps操作,此時每個fragment都有位置 顏色 紋理座標這些屬性資訊,這些屬性資訊通過...