天天看點

OpenGL 坐标系定義

openGL使用右手坐标

從左到右,x遞增

從下到上,y遞增

從遠到近,z遞增

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

OPENGL坐标系可分為:世界坐标系和目前繪圖坐标系。

世界坐标系以螢幕中心為原點(0, 0, 0)。你面對螢幕,你的右邊是x正軸,上面是y正軸,螢幕指向你的為z正軸。長度機關這樣來定: 視窗範圍按此機關恰好是(-1,-1)到(1,1)。

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

OpenGL中的6種坐标系

在OpenGL中存在6種坐标系,

1. Object or model coordinates

2. World coordinates

3. Eye (or Camera) coordinates

4. Clip coordinates

5. Normalized device coordinates

6. Window (or screen) coordinates

從object coordainates到world coordinates再到camera coordinate的變換,在OPENGL中統一稱為model-view轉換,初始化的時候,object coordinates和world coordinates還有camera coordinates坐标重合在原點,變換矩陣都為Identity。model-view matix轉換points,vectorsd到camera坐标系。

在opengl程式設計中,有個困惑的問題,就是那個坐标系是不動的,我想是你想參考坐标系是不動的。比如我想建立了一個object,放到 camera坐标系中,這時,我以camera的原點為參考點。當然,我想看這個物體的時候,我就以object的原點為參考點,移動camera坐标系的原點,就可以看到object了。好像寫了一堆廢話,呵呵。

  其中四種坐标經常要在程式中用到:世界坐标,物體坐标,裝置坐标和眼坐标。

世界坐标是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,用連續幾條旋轉指令完成複雜旋轉。由于矩陣運算的左乘特點,旋轉指令的順序與旋轉動作的順序正好相反。

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

眼坐标是以視點為原點,以視線的方向為Z+軸正方向的坐标系中的方向。OpenGL管道會将世界坐标先變換到眼坐标,然後進行裁剪,隻有在視線範圍(視見體)之内的場景才會進入下一階段的計算。

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

繼續閱讀