opengl中圖形繪制后瓤狐,往往需要一系列的變換來達到用戶的目的旬盯,而這種變換實現(xiàn)的原理是又通過矩陣進行操作的。opengl中的變換一般包括視圖變換沙廉、模型變換拘荡、投影變換等,在每次變換后撬陵,opengl將會呈現(xiàn)一種新的狀態(tài)(這也就是我們?yōu)槭裁磿Q其為狀態(tài)機)珊皿。
首先我們要知道,對于矩陣的操作都是對于矩陣棧的棧頂來操作的袱结。當前矩陣即為矩陣棧的棧頂元素亮隙,而對當前矩陣進行平移途凫、旋轉(zhuǎn)等的變換操作也同樣是對棧頂矩陣的修改垢夹。所以我們在變換之前調(diào)用glPushMatrix()的話,就會把當前狀態(tài)壓入第二層维费,不過此時棧頂?shù)木仃囈才c第二層的相同果元。
當經(jīng)過一系列的變換后,棧頂矩陣被修改犀盟,此時調(diào)用glPopMatrix()時而晒,棧頂矩陣被彈出,且又會恢復(fù)為原來的狀態(tài)阅畴。
函數(shù)的作用過程可以用下圖描述倡怎,更為直觀。
如上圖贱枣,從第一個圖狀態(tài)1到第二個圖狀態(tài)2調(diào)用了glPushMatrix()方法监署,此時矩陣棧的第一個和第二個的狀態(tài)是一樣的,但是平移纽哥、旋轉(zhuǎn)等方法都是對棧頂元素操作的钠乏,在經(jīng)過平移,旋轉(zhuǎn)之后棧頂?shù)臓顟B(tài)1變?yōu)?strong>狀態(tài)2春塌,此時對狀態(tài)2再進行某些繪制晓避,在調(diào)用glPopMatrix()彈棧,就相當于在狀態(tài)1的情況下繪制了只壳。
那么這么做有什么意義呢俏拱?
對于某些復(fù)雜的繪制,比如一個3D迷宮吼句,障礙是很多墻壁彰触,墻壁是由很多個立方體構(gòu)成了,我們需要繪制大量的立方體命辖,但是立方體的位置是分布在不同地方的况毅,如果我們每繪制一個立方體都要移動到相應(yīng)的位置分蓖,無疑是十分困難的,但是如果我們先調(diào)用glPushMatrix()尔许,在把所有的立方體都移動到中心么鹤,然后在繪制, 在調(diào)用glPopMatrix()味廊,把這個立方體彈棧蒸甜,返回原來的位置,我們就只需要一個簡單的for循環(huán)就可以做到余佛。此時柠新,可以簡單的把glPushMatrix()和glPopMatrix()方法理解為移動到指定位置,在移動回來辉巡;當然恨憎,這兩個方法不僅僅適用于移動。相應(yīng)的理解就是旋轉(zhuǎn)相應(yīng)的角度在旋轉(zhuǎn)回來郊楣。
在opengl場景中一般存在多種矩陣變換操作憔恳,而控制這些操作的命令主要用到
glMatrixMode(GLenum mode);
作用:用于指定用哪個矩陣作為當前矩陣,mode用于指定哪一種矩陣棧是其后矩陣操作的目標净蚤。
mode可仍孔椤:
GL_MODELVIEW: 把其后的矩陣操作施加于模型視圖矩陣棧。(默認)
GL_PROJECTION: 把其后的矩陣操作施加于投影矩陣棧今瀑。
GL_TEXTURE: 把其后的矩陣操作施加于紋理矩陣棧程梦。
注意上述三種模式分別對應(yīng)了三種矩陣棧。 所以在場景中存在多種矩陣變換時橘荠,glPushMatrix()和glPopMatrix()一般情況下也要結(jié)合glMatrixMode(GLenum mode)運用屿附,系統(tǒng)才知道具體操作的是哪個矩陣棧。
注釋:
1.模型視圖矩陣是在對物體進行縮放或者從不同的視角觀察物體的時候所調(diào)用的砾医。主要涉及到三個函數(shù):
進行模型和視圖變換拿撩,主要涉及到三個函數(shù):
(1)glTranslate(x,y,z),把當前矩陣和一個表示移動物體的矩陣相乘如蚜。三個參數(shù)分別表示了在三個坐標上的位移值压恒。
(2)glRotate(angle,x,y,z),把當前矩陣和一個表示旋轉(zhuǎn)物體的矩陣相乘错邦。物體將繞著(0,0,0)到(x,y,z)的直線以逆時針旋轉(zhuǎn)探赫,參數(shù)angle表示旋轉(zhuǎn)的角度。
(3)glScale(x,y,z)撬呢,把當前矩陣和一個表示縮放物體的矩陣相乘伦吠。x,y,z分別表示在該方向上的縮放比例。
2.投影矩陣是定義一個可視空間,可視空間以外的物體不會被繪制到屏幕上毛仪。投影分為正投影和透視投影
**(1)透視投影常見的方法:
gluPerspective
gluLookAt
(2)正投影常見的方法:
glOrtho
**