天天看點

Linux OpenGL 實踐篇-4 坐标系統

OpenGL坐标系 

 OpenGL中頂點經過頂點着色器後會變為标準裝置坐标系。标準裝置坐标系的各坐标的取值範圍是[-1,1],超過這個範圍的點将會被剔除。而這個變換的過程可描述為頂點在幾個坐标系統的變換,這幾個坐标系統為:

  1. 模型空間(Local Sapce)
  2. 世界空間(world Space)
  3. 觀察空間(View Space)
  4. 裁切空間(Clip Space)
  5. 螢幕空間(Projection Space)

  下面我們對幾個空間做一個詳細的解釋:  

  模型空間

  表示模型最初所在的空間,即當時建構這個模型時的坐标空間。比如上一節中繪制三角形時所給的三個頂點的坐标就時模型坐标系下的坐标位置,每一個x,y,z的取值範圍都是[-1,1]。 

  世界空間

  世界坐标系描述的時所有三維模型的相對關系。

  想象一下,我們構造模型的時候通常是一個一個的建構的,每個模型都是相對模型坐标系的(0,0,0)點進行的模組化,這個時候如果我們把這些模型都放在一起,可以想象它們将疊在一起,這個當然不是我們想要的,這個時候就需要另一個坐标系來描述它們的方位關系了。比如場景中有一個人和一輛車,它們在建構時都在(0,0,0)點,現在我們在這個基礎上把人放在(-2,0,0)的位置,把車放在(10,0,0)的位置,而這個坐标就是世界空間中的坐标。  

   觀察空間

  以錄影機在世界坐标系中的位置和方向建構的坐标系,即把世界坐标系按錄影機的位置和方向變換。

  觀察空間可以這麼了解:在世界空間擺放好我們的模型之後,我們需要找一個位置和角度來觀察它們,我們觀察到的畫面即我們要渲染的畫面,而以我們眼睛為基點建構的空間即為觀察空間。觀察空間是把世界空間的點轉換為視線前方的點的而産生的結果。它通常由一些平移和旋轉矩陣組合成。

  裁切空間

  我們人眼的觀察範圍是有限的,計算機模拟人眼視野,是以OpenGL渲染的頂點應該都在一個視野範圍内,這個視野範圍即我們所謂的裁切空間,超出這個範圍的點就被裁切掉。裁切空間定義在标準裝置坐标系上的,坐标的取值範圍是(-1,1),但我們觀察空間中的頂點是三維的,如果要把三維的頂點映射為二維的點,我們需要定義一個投影矩陣把觀察空間的點映射到裁切空間。

  投影就是将三維物體投射到二維平面的過程,投影可分為正投影和透視投影。

Linux OpenGL 實踐篇-4 坐标系統

正投影

  正投影比較簡單,他的平截頭體是一個長方體,在這個長方體内的頂點可見,其它點則剔除。這個長方體可以由left,right,bottom,top,near,far這幾個參數确定,其中near和far表示近平面和遠平面。投影可以看作是把三維畫面投影在近平面,可以想象,因為遠平面和近平面一樣大,是以投影對于物體的大小沒有影響,可以推斷:在着色器使用齊次坐标,頂點着色器透視除法所使用的w為1,即(x/w,y/w,z/w,1),w=1。

透視投影

  在實際生活中常見的現象是離我們越遠的物體越小,越近的物體越大。這個效果就是透視,最直覺的現象即使兩條平行線在遠處會相交,如鐵路上的鐵軌。要實作這種透視的效果我們需要一個梯狀的平截頭體,這個平截頭體的參數定義可同正投影使用6個參數,也可使用指定fov的方式定義。與正投影相比,透視投影的遠平面更大,這樣越遠的物體投影到近平面時就越小,即w是一個與z相關的值。

具體的投影矩陣推導可參見:這裡;

   這裡的投影其實是借助了“齊次坐标”的應用,關于“齊次坐标”,有興趣的同學可自行google或百度。使用齊次坐标的好處就是能把三維的平移使用四維的錯切變換實作,即平移可以使用矩陣的乘法實作(在三維坐标下三維平移是使用加法),這樣所有的變換都可以統一為乘法,友善計算。

  螢幕空間

  螢幕空間可了解為顯示器螢幕上定義的坐标空間,有兩種定義,一種是以左上角為(0,0)點,右下角為(width,height),其中width和height是螢幕的寬和高;一種是左下角為(0,0)點,右上角為(width,height)。

  MVP

  MVP即我們常用的把坐标從模型坐标系變換到投影坐标系的矩陣,其中M表示model,V表示view,P表示Projection。根據前文表述,我們有4個坐标系(螢幕坐标系統除外),其中有三個變化,分别是:模型空間->世界空間,世界空間->觀察空間,觀察空間->裁切空間,把這3個變化矩陣組合到一起即為模型空間到裁切空間的矩陣變換——MVP:

   

Linux OpenGL 實踐篇-4 坐标系統

結語  

  為什麼要分這麼多個階段的變化?為什麼會有這麼幾個坐标系空間?

  這些坐标系空間都是我們了解這個三維的世界時所提煉出來的概念,比如錄影機模拟的就是人的眼睛,世界坐标系則可以對标我們現實的大世界。對于這些空間坐标系劃分和梳理,能夠讓我們直覺的計算機繪制三維世界的過程,同時結合矩陣的應用,我們能夠根據我們的目的選擇合适的坐标系空間來操作,比如在進行物體移動的時候,使用世界坐标系會比較的友善,計算光照或投影時,在錄影機空間可能更為友善。

  

的發達第

繼續閱讀