標籤:
OPENGL座標系可分為:全局座標系和當前繪圖座標系。
全局座標系:在OpenGL中,全局座標系是以螢幕中心為原點(0, 0, 0),且是始終不變的。你面對
螢幕,你的右邊是x正軸,上面是y正軸,螢幕指向你的為z正軸。長度單位這樣來定:
視窗範圍按此單位恰好是(-1,-1)到(1,1),即螢幕左下角座標為(-1,-1),右上方
座標為(1,1)。
當前繪圖座標系:是繪製物體時的座標系。程式剛初始化時,全局座標系和當前繪圖座標系是重合
的。當用glTranslatef(),glScalef(), glRotatef()等對當前繪圖座標系進行平移、
伸縮、旋轉變換之後,全局座標系和當前繪圖座標系不再重合。注意,這裡的平移旋
轉是將當前繪圖座標系看做一個整體在全局座標系中進行旋轉平移。然後,改變以
後,再用glVertex3f()等繪圖函數繪圖時,都是在當前繪圖座標系進行繪圖,所有的
函數參數也都是相對當前繪圖座標系來講的。
今天看3D模型動畫代碼中,發現用四元組來進行插值和旋轉,瞭解了使用歐拉角做旋轉會有萬向鎖的問題存在。但這個是建立在對模型座標系進行旋轉的基礎上,於是又對OGL中矩陣變化的部分再次學習了一下。發現了一篇好文章,轉寄學習,留供查閱。
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。
轉自:http://blog.chinaunix.net/u1/49717/showart_2263380.html
OpenGL中各種座標系的理解[轉]