計算機圖形與OpenGL學習六(二維觀察2.OpenGL二維觀察函式)
OpenGL二維觀察函式
本節概念性內容較多,為便於理解與記憶,可以檢視之前文章的例項中的函式操作
1. OpenGL投影模式
在選擇OpenGL裁剪視窗和視口之前,必須建立合適的模式以便構建從世界座標系到螢幕座標系變換的矩陣,在OpenGL中,必須將裁剪視窗的引數作為投影變換的一部分來設定。因此,必須先選擇投影模式。我們可以使用在幾何變換中設定建模觀察模式的函式來設定。
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glMatrixMode()這個函式其實就是對接下來要做什麼進行一下宣告,也就是在要做下一步之前告訴計算機我要對“什麼”進行操作了,這個“什麼”在glMatrixMode的“()”裡的選項(引數)有,GL_PROJECTION,GL_MODELVIEW和GL_TEXTURE;如果引數是GL_PROJECTION,這個是投影的意思,就是要對投影相關進行操作,也就是把物體投影到一個平面上,就像我們照相一樣,把3維物體投到2維的平面上。(這裡參考了部落格https://blog.csdn.net/jiangdf/article/details/8460012)
glLoadIdentity()是為了得到單位矩陣,以保證我們進行場景切換後,新的觀察引數不會與前面的觀察引數混在一起。
2. GLU裁剪視窗函式
定義一個二維裁剪視窗使用下列OpenGL函式:
gluOrtho2D(xwmin,xwmax,ywmin,ywmax);
裁剪邊界的座標位置使用雙精度浮點數給出。該函式給出了將場景對映到螢幕的正交投影。對於三維場景來說,這意味著將物件沿垂直於二維xy平面的平行線投影。但是在二維投影中,物件是在二維xy平面中定義的。因此,正交投影對二維場景除了將物件位置轉換到規範化座標系之外沒有其他作用。OpenGL裁剪函式使用-1到1的規範化座標範圍。
3. OpenGL視口函式
使用下列函式指定視口的引數
glvVewport(xvmin,yvmin,vpWidth,vpHeight);
這裡的所有引數用對應於顯示視窗的整數螢幕座標給出。xvmin,yvmin指定視口左下角位置,與顯示視窗的左下角對應。vpWidth,vpHeight用於設定視口的寬度畫素數和高度畫素數。如果我們並未在程式中使用glViewports,則預設視口大小及位置與顯示視窗一樣。
最後,視口中圖元的畫素顏色裝入指定的螢幕位置的重新整理快取中。
4. 建立GLUT顯示視窗
使用下面函式進行初始化。
glutInit(&argc,argv);
並使用以下三個GLUT函式用來定義顯示視窗並選擇其尺寸及位置:
glutInitWindowPosition(xTopLeft,yTopLeft);//設定顯示視窗的左上角初始位置
glutInitWindowSize(dwWidth,dwHeight);//設定視窗大小,引數分別為寬和高
glutCreateWindow("Title");//標題
5. 設定GLUT顯示視窗的模式和顏色
glutInitDisplayMode(mode);
這個函式用來選擇顏色模式(RGB或索引號)和不同的快取組合,如:
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
顯示視窗的背景顏色使用:
glClearColor(red,green,blue,alpha);
在顏色索引模式下,我們用:
glClearIndex(index)
6. GLUT顯示視窗標識
因為一個應用可以建立多個顯示視窗,可使用以下函式獲得顯示整數視窗標識:
windowID=glutCreateWindow("Title");
7. 刪除GLUT顯示視窗
使用下面函式,刪除一個視窗
glutDestroyWindow(windowID);
8. 當前GLUT顯示視窗
指定的任何一個顯示視窗操作都針對當前顯示視窗,即最後建立的當前顯示視窗,或使用下列命令指定的顯示視窗:
glutSetWindow(windowId);
在任何時候,可以下列通過詢問函式來確定當前的顯示視窗是哪一個:
currentWindowId=glutGetWindow();
9. 修改GLUT顯示視窗的位置和大小
如果要改變當前顯示視窗的位置,使用
glutPositionWindow(xNewTopLeft,yNewTopLeft);
下面的函式設定顯示視窗的尺寸
glutReshapeWindow(dwNewWidth,dwNewHeight);
使用下面的函式可將當前顯示視窗擴充套件到整個螢幕
glutFullScreen();
無論何時改變現實視窗,都可能改變視窗的橫縱比並使物件變形。可以使用下列語句來調整顯示視窗的變化:
glutReshapeFunc(winReshapeFcn);
winReshapeFcn是一個“重定型事件”的“回撥函式”。