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),棧頂矩陣就是當前投影變換矩陣,負責將場景各坐標變換到眼坐標,由所得到的結果是裁剪後的場景部分,稱為裁剪坐標。前面提到過的視見體設定其實就是在建立該矩陣。
設備坐標:OpenGL 的重要功能之一就是將三維的世界坐標經過變換、投影等計算,最終算出它在顯示設備上對應的位置,這個位置就稱為設備坐標。在屏幕、打印機等設備上的坐標是二維坐標。值得一提的是,OpenGL可以只使用設備的一部分進行繪制,這個部分稱為視區或視口(viewport)。投影得到的是視區內的坐標(投影坐標),從投影坐標到設備坐標的計算過程就是設備變換了。
矩陣棧切換:glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令執行後參數所指矩陣棧就成為當前矩陣棧,以後的矩陣棧操縱命令將作用於它。
矩陣棧操縱命令:
glPushMatrix(); 當前矩陣入棧,這時矩陣棧將棧頂值壓入棧。
glPopMatrix(); 棧頂出棧,通常與上一條命令配合使用。
glLoadIdentity(); 將棧頂設為不變矩陣(就是對角線全為1其它為0的那個)。
glMultMatrix(M);將棧頂T設為M·T。