詳解OpenGL中的各種變換(投影變換,模型變換,視圖變換)(二)——投影變換


  下面介紹投影變換矩陣。這個相比較上一遍的就比較難了。主要分為透視投影矩陣和正交投影矩陣,本文主要介紹透視投影矩陣,正交比較簡單,就給出矩陣形式。

  (1)透視投影變換矩陣

  我們先來說一下透視投影需要哪些參數。如圖1所示,深色部分表示最終顯示的區域。照相機的z軸是穿過視錐體正中心的,顯示區域離相機最近的平面我們稱為Znear,最遠的平面我們稱為Zfar。其中Znear就是最終的投影窗口。所以我們要把Znear的寬映射到坐標[-1,1],把Znear的高映射到坐標[-1,1],把ZnearZfar的深度距離映射到坐標[-1,1]。因為最后的OpenGL繪制的區域其實就是一個從(-1,-1,-1)(1,1,1)的一個立方體。而且這樣映射還有個好處,就是繪制的時候靠近Znear的對象要比靠近Zfar的對象大。

圖1

  根據這些參數我們可以得到投影變換矩陣。首先,對於這個矩陣,我們先來看x軸和y軸。我們結合上圖,根據相似三角形可以得到:

圖2

  我們化簡一下可以得到Yproj=Znear*x/zXproj=Znear*y/z。之后我們將齊次坐標的w分量設為z,就可以得到Yproj=Znear*xXproj=Znear*y。再將坐標映射到[-1,1],除以投影窗口的長寬即可。我們得到部分透視投影矩陣:

圖3

  我們再來看z軸。其實z軸映射也非常簡單。我們假設f(z)=A*z+B,當齊次坐標的w分量為z時,那么實際上z軸的坐標為A+B/z。我們根據映射關系得到下面兩個式子:

圖4

  再根據這兩個式子,求出AB的值(具體求解就忽略了,得到的結果就是下面矩陣第三行的兩個值)。最終得到完整的透視投影變換矩陣:

圖5

  我們還可以用另一種方式來表達透視投影。這種方式一共有四個變量。

  • 透視的角度fovy。如圖6所示,fovy表示的是照相機所看到的范圍。
  • 投影窗口的寬高比aspect。如圖6所示,aspect就是Znear平面的寬高比。
  • 顯示區域離相機最近的距離near和離相機最遠的距離far。這兩個量與前面都是一樣的。

圖6

  這個表達下的透視投影矩陣如下(計算過程跟上面一種基本一致):

圖7

  (2)正交投影變換矩陣

   正交投影就比較簡單了。如圖8所示,顯示區域就是一立方體。因為沒有近大遠小的特性,齊次坐標的w分量不需要變化,設為1.0就可以了。另外,我們也需要把x軸,y軸,z軸分別映射到坐標[-1,1]。計算過程也和透視投影變化矩陣類似。

圖8
  下面是正交投影變換矩陣:
圖9
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM