openGL座標系

openGL座標系

2011-04-22 16:11:54| 分類:默認分類| 標籤:opengl|字號訂閱

What are the basic steps to use OpenGL in a Windows Program?

  • Getting a Device Context (DC) for the rendering location 

  • Selecting and setting a pixel format for the Device Context 

  • Creating a Rendering Context (RC) associated with the Device Context 

  • Drawing using OpenGL commands 

  • Releasing the rendering context 

  • Release the device context 

What is a DC?

  • A DC is simply a data structure that keeps the state of the current settings and route calls to the appropriate device. 

What is an RC?

  • An RC is a data structure that keeps the state variables for OpenGL. It is also a portal through which OpenGL calls are sent to the device. 

  • You can think of both DC and RC as a data structure that keeps the state of the current settings and routes calls to the proper device. 

Brief Introduction to Pixel Format Data Structure

  • Pixel formats are the translation between OpenGL calls (such as an OpenGL call to draw a pixel with an RGB triad value of [128,120,135]) and the rendering operation that Windows performs (the pixel might be drawn with a translated RGB value of [128,128,128]). The selected pixel format describes such things as how colors are displayed, the depth of field resolution, and what additional capabilities are supported by the rendering context you have created. The Windows OpenGL has four functions that handle the pixel format. 


    Pixel Format Function Description
    ------------------------------------------------------------------
    ChoosePixelFormat() Obtains a DC's pixel format that's the
    closest match to a pixel format you've
    provided.

    SetPixelFormat() Sets a DC's current pixel format to the
    pixel format index specified.

    GetPixelFormat() Returns the pixel format index of a DC's
    current pixel format.

    DescribePixelFormat() Given a DC and a pixel format index, fills
    a PIXELFORMATDESCRIPTOR data structure with
    the pixel format's properties.

    The main properties of pixel format include:

    • Single or double buffering: Mainly for smooth animation. 

    • RGBA or color indexing: A color can be directly specified by Red, Green, and Blue values. Some video display controllers have limited frame buffer memory. For example, EGA supports 16 colors. Therefore, only 4 bits is used to represent a pixel. This pixel value is used as the index into a color map to find the associated RGB values for display. 

    • Drawing to a window or bitmap: When a drawing is sent to a window, it will be displayed in real-time on the screen. A bitmap is a canvas in the main memory. The content in a bitmap may be displayed later by being copied into a window. 

    • Support of GDI (Window's Graphics Device Interface) or OpenGL calls. 

    • Color depth: The number of bits per pixel in the frame buffer. 

    • Z-axis depth: The number of bits per pixel in Z-buffer that is used for hidden surface removal. 

     

視圖模型變換過程就是一個將頂點座標從世界座標系變換到視覺座標系的過程。這裏很重要的是對兩個座標系的認識。

世界座標系,也稱爲全局座標系。它是一個右手座標系,可以認爲該座標系是固定不變的,在初始態下,其x軸爲沿屏幕水平向右,y軸爲沿屏幕垂直向上,z軸則爲垂直屏幕面向外指向用戶,當然,如果在程序中對視點進行了轉換,就不能再認爲是這樣的了。

視覺座標系,也稱爲局部座標系。它是一個左手座標系,該座標系是可以活動的。在初始態下,其原點及x,y 軸分別與世界座標系的原點及x,y 軸重合,而z軸則正好相反,即爲垂直屏幕面向內。


--------------------------------------------------------------------------------

OPENGL座標系可分爲:世界座標系和當前繪圖座標系。用過ANSYS的應該很清楚,呵呵。

世界座標系以屏幕中心爲原點(0, 0, 0)。你面對屏幕,你的右邊是x正軸,上面是y正軸,屏幕指向你的爲z正軸。長度單位這樣來定: 窗口範圍按此單位恰好是(-1,-1)到(1,1)。 

當前繪圖座標系繪製物體時的座標系,就是模型座標系。程序剛初始化時,世界座標系和當前繪圖座標系是重合的。當用glTranslatef(),glScalef(), glRotatef()對當前繪圖座標系進行平移、伸縮、旋轉變換之後, 世界座標系和當前繪圖座標系不再重合。改變以後,再用glVertex3f()等繪圖函數繪圖時,都是在當前繪圖座標系進行繪圖,所有的函數參數也都是相 對當前繪圖座標系來講的

世界座標是OpenGL中用來描述場景的座標,Z+軸垂直屏幕向外,X+從左到右,Y+軸從下到上,是右手笛卡爾座標系統。我們用這個座標系來描述物體及光源的位置。

將物體放到場景中也就是將物體平移到特定位置、旋轉一定角度,這些操作就是座標變換。OpenGL中提供了glTranslate*/glRotate*/glScale*三條座標變換命令,利用OpenGL的矩陣運算命令,則可以實現任意複雜的座標變換。

非常重要:OpenGL 中有一個座標變換矩陣棧(ModelView),棧頂就是當前座標變換矩陣,進入OpenGL管道的每個座標(齊次座標)都會先乘上這個矩陣,結果纔是對應點在場景中的世界座標。OpenGL中的座標變換都是通過矩陣運算完成的,與圖形學課本的描述完全一致。要注意的是變換中的矩陣乘法是左乘,而矩陣乘法與算術乘法不同,不符合交換律(萬一不明白去看矩陣代數書好了)。

glTranslate*(x,y,z):平移,參數爲各軸向的移動量。
glRotate(d,x,y,z):旋轉,第一個參數爲轉動的度數,後三個參數表明是否繞該軸旋轉。通常x,y,z中只有一個爲1,其餘爲0,用連續幾條旋轉命令完成複雜旋轉。由於矩陣運算的左乘特點,旋轉命令的順序與旋轉動作的順序正好相反

考察下面利用三個變換繪製頂點的代碼:

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glMultMatrixf(N); /* apply transformation N */

glMultMatrixf(M); /* apply transformation M */

glMultMatrixf(L); /* apply transformation L */

glBegin(GL_POINTS);

glVertex3f(v); /* draw transformed vertex v */

glEnd();

在這個過程中,GL_MODELVIEW狀態相繼引入了I(單位陣)、NML矩陣。變換後的頂點爲NMLv。因此,頂點的變換爲N(M(Lv)),即是先作變換L,然後是變換M最後纔是N。這裏,頂點v的實際變換順序正好與指定的順序相反。

  • 視圖變換

     

視圖變換改變視點的位置和方向,也就是改變視覺座標系。在世界座標系中,視點和物體的位置是一個相對的關係,對物體作一些平移、旋轉變換,必定可以通過對視點作相應的平移、旋轉變換來達到相同的視覺效果。完成視圖變換可以有以下幾種方法:

(1).

利用一個或幾個造型變換命令(即glTranslate*()glRotate*())。由於這些命令也是在GL_MODELVIEW狀態下執行的,所以較難和那些造型變換命令區分開來,移動視點的變換和移動物體的變換很容易混淆。爲了便於建立清晰的物體和場景模型,可以認爲只有其中一個變換在起作用,比如認爲只有模型變換的話,那麼glTranslate*()glRotate*()將統一被視爲對物體的變換。 

(2).利用實用庫函數gluLookAt()設置視覺座標系。在實際的編程應用中,用戶在完成場景的建模後,往往需要選擇一個合適的視角或者不停地變換視角,以對場景作觀察。實用庫函數gluLookAt()就提供了這樣的一個功能。

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

GLdouble centerx,GLdouble centery,GLdouble centerz,

GLdouble upx,GLdouble upy,GLdouble upz);

該函數定義一個視圖矩陣,並與當前矩陣相乘。

eyex, eyey,eyez 

指定視點的位置 

centerx,centery,centerz 

指定參考點的位置 

upx,upy,upz 

指定視點向上的方向 

(3).創建封裝旋轉和平移命令的實用函數。有些應用需要用簡便方法指定視圖變換的定製函數。例如,在飛機飛行中指定滾動、俯仰和航向旋轉角,或對環繞對象運動的照相機指定一種利用極座標的變換。

物體座標是以物體某一點爲原點而建立的“世界座標”,該座標系僅對該物體適用,用來簡化對物體各部分座標的描述。物體放到場景中時,各部分經歷的座標變換相同,相對位置不變,所以可視爲一個整體,與人類的思維習慣一致。

眼座標是以視點爲原點,以視線的方向爲Z+軸正方向的座標系中的方向。OpenGL管道會將世界座標先變換到眼座標,然後進行裁剪,只有在視線範圍(視見體)之內的場景纔會進入下一階段的計算。

同樣的,有投影變換矩陣棧(Projection),棧頂矩陣就是當前投影變換矩陣,負責將場景各座標變換到眼座標,由所得到的結果是裁剪後的場景部分,稱爲裁剪座標。前面提到過的視見體設定其實就是在建立該矩陣。

設備座標:OpenGL 的重要功能之一就是將三維的世界座標經過變換、投影等計算,最終算出它在顯示設備上對應的位置,這個位置就稱爲設備座標。在屏幕、打印機等設備上的座標是二維座標。值得一提的是,OpenGL可以只使用設備的一部分進行繪製,這個部分稱爲視區或視口(viewport)。投影得到的是視區內的座標(投影座標),從投影座標到設備座標的計算過程就是設備變換了。

矩陣棧切換:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令執行後參數所指矩陣棧就成爲當前矩陣棧,以後的矩陣棧操縱命令將作用於它。

矩陣棧操縱命令:
glPushMatrix(); 當前矩陣入棧,這時矩陣棧將棧頂值壓入棧。
glPopMatrix(); 棧頂出棧,通常與上一條命令配合使用。
glLoadIdentity(); 將棧頂設爲不變矩陣(就是對角線全爲1其它爲0的那個)。
glMultMatrix(M);將棧頂T設爲M·T。

------------------------------------------------------------------

從三維物體到二維圖象,就如同用相機拍照一樣,通常都要經歷以下幾個步驟:

  1、將相機置於三角架上,讓它對準三維景物,它相當於OpenGL中調整視點的位置,即視點變換(Viewing Transformation)。

  2、將三維物體放在場景中的適當位置,它相當於OpenGL中的模型變換(Modeling Transformation),即對模型進行旋轉、平移和縮放。

  3、選擇相機鏡頭並調焦,使三維物體投影在二維膠片上,它相當於OpenGL中把三維模型投影到二維屏幕上的過程,即OpenGL的投影變換(Projection Transformation),OpenGL中投影的方法有兩種,即正射投影和透視投影。爲了使顯示的物體能以合適的位置、大小和方向顯示出來,必須要通過投影。有時爲了突出圖形的一部分,只把圖形的某一部分顯示出來,這時可以定義一個三維視景體(Viewing Volume)。正射投影時一般是一個長方體的視景體,透視投影時一般是一個棱臺似的視景體。只有視景體內的物體能被投影在顯示平面上,其他部分則不能。

  4、沖洗底片,決定二維相片的大小,它相當與OpenGL中的視口變換(Viewport Transformation)(在屏幕窗口內可以定義一個矩形,稱爲視口(Viewport),視景體投影后的圖形就在視口內顯示)規定屏幕上顯示場景的範圍和尺寸。

  通過上面的幾個步驟,一個三維空間裏的物體就可以用相應的二維平面物體表示了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章