詳解OpenGL中的各類變換(投影變換,模型變換,視圖變換)(一)——模型變換和視圖變換

  本文一些用於均參考《OpenGL編程指南(第8版)》,有興趣的同窗能夠結合一塊兒看。這篇算是整合補充。編程

  OpenGL採用的是相機模型,就是把視圖變換操做類比爲使用照相機拍攝照片的過程,具體步驟以下(這裏和紅寶書有一些改變):spa

  1. 將準備拍攝的對象移動到場景中指定位置。(模型變換,Model Transform)
  2. 將相機移動到準備拍攝的位置,將它對準某個方向。(視圖變換,View Transform)
  3. 設置相機的焦距,或者調整縮放比例。(投影變換,Projection Transform)
  4. 拍攝照片並變換到須要的圖片大小。(這個是視口變換,咱們這裏不作討論)

  在這四個步驟中,前三個都是能夠用變換矩陣實現的。看完本文以後基本就能夠用本身寫的矩陣來代替OpenGL裏面的各類變換操做了。至於爲何要按照上述的順序能夠參考下面代碼,有興趣的讀者能夠調換一下位置試一試,其中投影變換矩陣必定要放在最左邊。3d

/*Project:投影變換矩陣
    View:視圖變換矩陣
    Model:模型變換矩陣*/
ModelViewProject = Project * View * Model;

 


  下面須要知道一些矩陣和齊次座標的相關知識,網上有不少資料,若是又不知道的能夠提早了解下。orm

  這裏有必要深刻講解一下齊次座標的意義。假設一3維向量x,咱們對這個向量進行線性變換Tx,但不管T爲任意3*3矩陣,都沒法完成向量的平移操做(好比x=(0,0,0)Tx不管如何也不可能變換到(1,0,0))。這裏咱們就須要用到齊次座標,使用齊次座標的目的也就是經過增長額外的數值來完成向量的平移操做。熟悉OpenGL的已經知道了,將三維數據植入思惟座標空間當中就好了。就是將x=(0,0,0)轉變成x=(0,0,0,1)。T也轉變成4*4矩陣。對象

  咱們再討論一下齊次座標的一個性質, 齊次座標所表達的實際上是方向而不是位置。好比x1=(1,2,3,1)x2=(2,4,6,2)其實在3維座標系中表示的是同一個位置。此外,最後一個份量w越大,那麼齊次座標將處於更遠的位置。當OpenGL準備顯示集合體的時候,它會使用左後一個份量除之前三個份量,從而將其次座標從新變換到3維座標系中,所以w越大的物體也會顯示的越小。w0.0的時候,因爲座標位於無限近的位置,以致於顯示可能會呈現出無限大。這個概念很是重要,由於下面投影矩陣就是利用這個概念!blog

  咱們接下來講明三個變換中具體包含哪些矩陣。對於一個頂點來講,咱們對其先進行模型變換,在進行視圖變換和投影變換。咱們將這些變換細分一下就能夠獲得以下代碼:圖片

/*S:縮放 R:旋轉 T:平移*/
ModelViewProject = Project 
          * ViewR * ViewT 
          * ModelS * ModelR * ModelT
gl_position = ModelViewProject * Vertex;

  


   下面我就按照順序逐一介紹一下各個矩陣,先介紹一下模型變換矩陣,這部分我就不細說了,瞭解的人應該很多。博客

  (1)ModelT 平移矩陣it

  這個矩陣算是最簡單的矩陣,這裏舉個例子。假設咱們要將v=(x,y,z)沿x軸正方向平移2.5,具體計算以下:io

圖1

  (2)ModelR 旋轉矩陣

  這個矩陣就比較多樣了,我之前的博客關於這個矩陣有很多分析,這裏也很少說了。下面列出三個歐拉角對應的旋轉矩陣(也是最經常使用的):

圖2

  (3)ModelS 縮放矩陣

  這個矩陣也比較簡單,只要把縮放因子factor放在矩陣的對角線上就好了。具體表達以下:

圖3

  這三個矩陣就組成了模型變換矩陣,根據具體需求能夠隨意組合平移旋轉縮放矩陣,並不必定非要按照上面代碼中的順序。

 


  下面介紹視圖矩陣,咱們能夠把這一步假想爲設置相機或者人眼(View)的位置。設置相機通常只須要兩步,首先把相機移動到固定的位置,而後把當前座標系轉化成相機座標系。這裏不像模型變換,能夠屢次旋轉平移,這裏只須要1個平移操做和1個旋轉操做通常就能夠了,並且還不須要縮放。

  (1)ViewT 平移矩陣

  這個矩陣和ModelT正好是相反的。咱們能夠這樣理解,若是要在世界座標系下的(x,y,z)位置設置相機,那麼咱們把相機再移回世界座標系原點的位移就是(-x,-y,-z)。因此咱們當以相機爲座標原點的時候,全部在原來座標系下的物體都要加上這個負的平移份量。那麼這個平移矩陣以下:

圖4

  (2)ViewR 旋轉矩陣

  咱們將原來的座標系轉變成相機座標系,不只須要平移到相機位置,還要旋轉到相機的朝向。如圖5所示,咱們要將藍色的座標系經過旋轉變換成紅色的相機座標系。因爲座標系的三個基向量都是單位化的,因此最簡單的辦法就是點乘。作法是點乘相機座標系的三個基向量,具體看圖6的公式。


圖5

圖6

 

  其中V指向相機座標系的y軸,U指向相機座標系的x軸,N指向相機座標系的z軸。

  這兩個矩陣就組成了視圖變換矩陣,View乘以Model獲得的矩陣,在OpenGL固定管線中稱爲模型視圖矩陣,能夠經過glMatrixMode(GL_MODELVIEW)進行設置。

相關文章
相關標籤/搜索