OpenGL模型檢視變換、投影變換、視口變換

idaretobe發表於2014-12-23

OpenGL中不設定模型,投影,視口,所繪製的幾何圖形的座標只能是-1到1(X軸向右,Y軸向上,Z軸垂直螢幕)。

產生目標場景的過程類似於用照相機進行拍照:

(1)把照相機固定在三角架上,並讓他對準場景

   從不同位置觀察場景(檢視變換)

(2)對場景進行安排,使各個物體在照片中的位置是我們所希望的

   移動,旋轉或者放大縮小場景中的物體(模型變換)

(3)選擇照相機鏡頭,並調整放大倍數(調焦)

   顯示物體時,可以選擇物體是如何投影到螢幕上(投影變換)

(4)確定照片的大小,放大照片還是縮小照片

   把圖形畫下來,是要佔據整個螢幕還是螢幕的一部分(視口變換)

三大變換:(都是通過操作矩陣來實現的)

1、模型檢視變換

在進行模型檢視變換之前,應先設定當前操作的矩陣為"模型檢視矩陣",通過設定glMatrixMode( GL_MODELVIEW),在進行變換

之前把當前矩陣設定為單位矩陣glLoadIdentity();如果不進行單位化,所有的後續操作都是在當前矩陣的前提下進行的。

2、投影變換

投影變換即定義一個可視空間,可視空間以外的物體不會被繪製到螢幕上(從現在起,座標不在是-1.0到1.0了)

OpenGL支援兩種投影,透視投影和正投影,通過設定glMatrixMode( GL_PROJECTION )來操作投影矩陣。

透視投影的主要函式

1、glFrustum()

2、glPerspective( GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far)

建立一個表示對稱透視檢視平截頭體的矩陣,並把它與當前矩陣相乘。fovy是YZ平面上視野的角度,範圍【0,180】。aspect是這個平截頭體的縱橫比,也就是寬度除於高度。near和far值分別是觀察點與近側裁剪平面以及遠側裁剪平面的距離(沿Z軸負方向)這兩個值都是正的。

正投影的主要函式

1、glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)

建立一個平行視景體(就是一個長方體空間區域)。實際上這個函式的操作是建立一個正射投影矩陣,並且用這個矩陣乘以當前矩陣。其中近裁剪平面是一個矩形,矩形左下角點三維空間座標是(left,bottom,-near),右上角點是(right,top,-near);遠裁剪平面也是一個矩形,左下角點空間座標是(left,bottom,-far),右上角點是(right,top,-far)。注意,near和far都是正值。只有在視景體裡的物體才能顯示出來,我感覺你最後兩個引數取得有點問題,而且你改成0,0後,視景體深度沒有了,整個視景體都被壓成個平面了,當然就顯示不正確了。

2、glOrtho2D( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)

建立一個表示把二維座標投影到螢幕上的矩陣,並把當前矩陣與它相乘,裁剪區域為矩形。

把畫素繪製到螢幕上glViewport()定義視口,前兩個引數最左下方,後兩個引數寬度和高度。

3、視口變換

在視窗中定義一個畫素矩形,最終的影象將對映到這個矩形中。

glViewport( Glint x, Glint y, GLsizei width, GLsizei height );XY指定了視口的左下角,WH指定了視口的高度和寬度。在預設情況下,視口的初始值是(0,0,winwidth,winheight)。

視口的縱橫比一般和視景體的縱橫比相同。當視窗的大小發生變化時,並不會自動影響視口,應用程式應該檢測視窗大小改變事件。

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/longge7685/archive/2010/01/31/5274467.aspx

關於模型轉換的基礎知識

1.模型轉換與視點轉換: glTranslate{fd}(TYPE x, TYPE y, TYPE z )、      glRotate{fd}( TYPE angle, TYPE x, TYPE y, TYPE z )、
     glScale{fd}(TYPE x, TYPE y, TYPE z )
這三個函式分別對模型進行平移,旋轉,縮放。我們可以想象一下,視點轉換和模型轉換可以使用相同的函式進行,比如,在用相機拍攝物體時,我們可以保持物體的位置不動,而將相機移離物體,這就相當於視點轉換;也可以保持相機的位置不動,將物體移離相機,這就相當於模型轉換。
模型轉換和視點轉換共同構成模型視景矩陣。

2.矩陣堆疊操作:glPushMatrix(),glPopMatrix()
說明,OpenGL中有兩個最基本的矩陣,模型視景矩陣和投影矩陣,它們都有相應的矩陣堆疊,這些矩陣的當前值就是在矩陣堆疊中的最頂層元素。對於轉換操作,發出轉換命令後生成的新的當前矩陣就儲存在矩陣堆疊中,因此,我們可以利用矩陣堆疊儲存當前值,並在需要的時候將當前值彈出堆疊。
舉例來說,我們現在需要繪製一個自行車,設定自行車的兩個輪子相對於座標原點是對稱的。我們可以這樣繪製:將座標系原點移動到前車輪中心,然後進行繪製,完成後,計算前車輪中心到後車輪中心的距離,並將座標系原點移動到後車輪中心,再繪製後車輪。顯然,這種繪製順序是不科學的,如果需要繪製更多的對稱物體,那麼這種計算量會非常大,而且容易產生錯誤。
這種問題,我們使用矩陣堆疊可以很容易得到解決。在繪製前車輪之前,將當前矩陣儲存在矩陣堆疊中,然後將座標原點移動到前車輪中心,繪製前車輪,繪製結束後,將儲存的當前矩陣彈出矩陣堆疊,這時堆疊頂部的矩陣仍為原座標系,下一步只需相對於原座標系移動相應距離到後車輪進行繪製,這樣,所有物體的位置都是相對於原座標系進行設定,程式計算量得到縮減,而且不容易出錯誤。

相關文章