透視矩陣的推導(最直觀、最深刻、最還原,看完請點贊。)

由參數l,r,b,t,n,f定義的透視投影矩陣的推導困惑了我差點兒相同一個多禮拜。這幾天差點兒是每天都在思考這個問題。昨天晚上3點多鐘我忽然醒了,而後我又開始想這個問題,結果最終讓我給想通了,因而我趕忙起牀把這個思路記在了草稿紙上,還專門照了張照片做證。
這裏寫圖片描寫敘述
爲了解決問題,前幾天我專門發了兩篇帖子求答案,結果知網上的竟然沉掉了。而在csdn上也沒有獲得答案(質疑有關透視投影矩陣的推導)。markdown

幸好我本身仍是攻克了這個問題。
如下推導的是OpenGL中的透視投影矩陣。
已經知道由參數fovy,aspect,n,f定義的透視投影矩陣爲:(有關這塊的推導可見《3d graphics for game programming》 2.4.3 derivation of projection matrix,講得很具體)
POpenGL= cot(fovy2)aspect0000cot(fovy2)0000f+nfn1002nffn0
那麼再看還有一種投影參數l,r,b,t,n,f,上面矩陣中:
cot(fovy2)aspect=cot(fovx2)=2nrl,
cot(fovy2)=2ntb.
因爲參數l,r是相應視見空間中x軸的座標,b,t相應視見空間中y軸的座標,假設l=-r並且b=-t。那麼由這樣的參數定義的透視投影矩陣就是:
POpenGL= 2nrl00002ntb0000f+nfn1002nffn0
而官方的透視投影矩陣是:
POpenGL= 2nrl00002ntb00r+lrlt+btbf+nfn1002nffn0
實際上這個矩陣是由兩步轉換完畢的,第一步是進行矩陣 POpenGL 變換,而後進行了平移操做。例如如下:
post

POpenGL=T×POpenGL=100001000010r+lrlt+btb01×2nrl00002ntb0000f+nfn1002nffn0=2nrl00002ntb00r+lrlt+btbf+nfn1002nffn0

那些說這個透視投影沒有作平移這一步操做,我可以100%跟你說你是錯的!


如下我來解釋爲何進行了平移操做。
來張示意圖:
這裏寫圖片描寫敘述
這個是視見空間中的示意圖。因爲存在l≠-r或b≠-t的狀況。因此這裏我有益沒把近裁剪平面中心畫在z軸上。atom

示意圖上由紅線繪製的立方體纔是由l,r,b,t,n,f參數定義的視錐體,當中遠裁剪平面上的四個點分別相應原點eye通過近裁剪平面上四個點的延長線與z=-f平面的交點,注意這個視錐體是不規則的!spa

而後圖中的標註l’, r’是近裁剪平面點(l,b,-n)和點(r,b,-n)x軸上的份量在 z=cot(fovx2) 上的投影, l=2lrl r=2rrl 。l’和r’的中心值是 r+lrl 。同理近裁剪平面上點(r,b,-n)和點(r,t,-n)y軸上的份量在 z=cot(fovy2) 上的投影。 b=2btb t=2ttb ,b’和t’的中心值是 t+btb 圖中的視錐體經過 POpenGL 透視變換以後獲得的是規則的正方體(左下角頂點 (2lrl,2btb,1) ,右上角頂點 (2rrl,2ttb,1) 。最終要把它轉換成cvv(canonical view volume,正規可視化空間)。則需要進行T平移轉換,也就是平移 (r+lrl,t+btb,0) 。得證。.net

相關文章
相關標籤/搜索