OpenGL學習二——四種變換

   現實世界中可以通過以下方式觀察感興趣的對象:
   1、變化觀察者的位置(觀察點),從不同的角度去審視(視圖變換)
   2、移動或者旋轉被觀察對象,全方位觀察(模型變換)
   3、如果把物體畫下來,我們可以選擇:是否需要一種“近大遠小”的透視效果。另外,我們可能只希望看到物體的一部分,而不是全部(剪裁)(投影變換)
   4、我們可能希望把整個看到的圖形畫下來,但它只佔據紙張的一部分,而不是全部(視口變換)
   這些方式也是OpenGL顯示三維場景和物體的主要過程。在OpenGL中三維場景和物體以特定的方式顯示在屏幕上,需要經過視圖變換、模型變換、投影變換和視口變換等過程,這個過程對應於數學上的概念即爲矩陣乘法運算。這四種變換對於OpenGL來說十分重要,下面詳細講解。

一、概念
   視圖變換用於確定場景的合適位置,即確定觀察點的位置。它可以使觀察者在任何位置從任何方向觀察物體。模型變換用於旋轉、移動、放縮以及反射觀察對象,使得觀察者在淨止的情況下看到物體的全部。這兩個變換具有相對關係,它們用到的函數也基本相同,所以在實際編程中往往以模型視圖變換統稱。
   投影變換描述了一個可視見空間,確定了被觀察對象投影到屏幕上的方式(透視投影、正交投影)和範圍(超出範圍的對象或者對象的某一部分將被裁剪掉,無法顯示在屏上)。
   視口變換定義了三維觀察對象映射到屏幕上的變換,最終實現三維空間到二維空間的轉換。

二、座標
   在先後進行的四種變換中,涉及到以下幾種座標:
   原始頂點座標:程序中定義的定點數據,未加任何處理
   規範化齊次座標:由OpenGL處理得到
   裁剪座標:規範化齊次座標經過模型視圖變換和投影變換得到裁剪座標,可視見空間以爲的座標去除掉
   規格化設備座標:OpenGL中座標向量爲四維,同時除以第四個分量w即可得到
   屏幕座標:真實的物理座標,觀察對象的規格化座標經過視口變換換成真實的屏幕座標
   需要特別注意的是:屏幕座標具有單位,代表了實際的長度度量,而其它幾種座標是一種邏輯座標,無單位

三、變換過程分析
   1、視圖變換和模型變換
      OpenGL中繪製三維場景和對象之前,應該首先確定觀察點位置和方向,並把觀察對象放到合適的位置,以便觀察。涉及到的函數:
         gluLookAt:設置觀察點的位置、方向和向上的量,視圖變換專用
         glTranslate*:移動觀察對象或者觀察點,共用
         glScale*:放縮觀察對象或者座標系,共用
         glRotate*:旋轉觀察對象或者座標系,共用
      默認情況下,觀察點位於座標系遠點,朝向Z軸負方向,向上量爲Y軸正方向。
   2、投影變換
      確定以何種方式投影到屏幕上,並設置投影的方式,即可視見空間。用到的函數:
         glFrustum:定義透視投影方式——越遠的物體顯得越小,參數含義如下圖,定義了可視空間的大小和兩個可視截面:
                    
         gluPerspective:以另外一種方式定義透視投影,如下圖:
                   
         glOrtho:正交投影,更加精確的反映物體的形狀,參數如下圖:
                  
      一旦在X-Y平面內充滿整個可視見空間,投影到屏幕上的對象會佔滿真個視口屏幕。
   3、視口變換
      視口變換確定了三維空間如何映射到屏幕的那個空間位置,它指定了圖像所佔屏幕的區域。主要涉及的函數:
         glViewport:指出OpenGL可以顯示的屏幕區域大小,參數包括原點和高寬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章