透視矩陣的推導 opengl

2021-08-16 03:50:08 字數 2361 閱讀 3645

由引數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都有位置 顏色 紋理座標這些屬性資訊,這些屬性資訊通過...