版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)三 OpenGL的簡單交互繪制一、實(shí)驗(yàn)?zāi)康?、理解OpenGL坐標(biāo)系的概念,掌握OpengGL裁剪窗口、視區(qū)、顯示窗口的概念和它們之間的關(guān)系,學(xué)會(huì)計(jì)算世界坐標(biāo)和屏幕坐標(biāo)。2、學(xué)會(huì)OpenGL的簡單鍵盤交互操作。3、學(xué)會(huì)OpenGL的簡單字符繪制。3、進(jìn)一步掌握OpengGL點(diǎn)、直線、多邊形的繪制。二、實(shí)驗(yàn)環(huán)境 硬件要求:PC機(jī),主流配置,最好為獨(dú)立顯卡,顯存512M以上。 軟件環(huán)境:操作系統(tǒng):Windows XP。語言開發(fā)工具:Microsoft Visual studio 2008,Visual C+。 程序框架:Win32應(yīng)用程序三、實(shí)驗(yàn)內(nèi)容與要求 3.1 鍵盤交互 1、調(diào)出實(shí)驗(yàn)一的源
2、代碼運(yùn)行,調(diào)整修改使得顯示窗口在屏幕中央保持缺省大小(300*300),繪制的矩形在顯示窗口中央。如圖2-1所示。 提示: (1)添加修改窗口位置的函數(shù)glutInitWindowPosition(int x, int y);其中(x,y)為窗口左上角在屏幕上的位置。 (2)顯示窗口的左下角坐標(biāo)為(-1,-1),右上角坐標(biāo)為(1,1)。圖2-1未修改前的win32初始源程序參考如下:/*my first program.cpp*/#include "stdafx.h"#include <glut.h>void display(void);void myresha
3、pe(GLsizei w, GLsizei h); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine); char *argv = "hello ", " "int argc = 2; / must/should match the number of strings
4、 in argvglutInit(&argc, argv); /初始化GLUT庫;glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /設(shè)置顯示模式;(緩沖,顏色類型)glutInitWindowSize(500, 500);glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);glutCreateWindow("Hello"); /創(chuàng)建窗口,標(biāo)題為“hello”;glutDisplayFunc(display); /用于繪制當(dāng)前窗口;glutMainLoop(); /表示開
5、始運(yùn)行程序,用于程序的結(jié)尾;return 0; void display(void) glClear(GL_COLOR_BUFFER_BIT); /刷新顏色緩沖區(qū) glRectf(-0.5,-0.5,0.5,0.5); glFlush(); /用于刷新命令隊(duì)列和緩沖區(qū),使所有尚未被執(zhí)行的OpenGL命令得到執(zhí)行 2、在實(shí)驗(yàn)一的基礎(chǔ)上添加鍵盤交互,按W鍵繪制的矩形上移,按S鍵矩形下移,按A鍵矩形左移,按D鍵矩形右移,如圖2-2。參考步驟如下:(1)在主函數(shù)里添加注冊(cè)鍵盤回調(diào)函數(shù) glutKeyboardFunc(mykeyboard);此函數(shù)可放在 glutDisplayFunc(display
6、);后面。 并在程序頭部聲明添加鍵盤回調(diào)函數(shù): void mykeyboard(unsigned char key, int x, int y);(2)在display()繪制函數(shù)中修改繪制矩形代碼,用變量代替數(shù)值參數(shù)。 例如: glRectf(-0.5,-0.5,0.5,0.5)改為glRectf(x1,y1,x2,y2); 程序前面加上變量聲明和初始值,如:float x1=-0.5,y1=-0.5,x2=0.5,y2=0.5; 注意語句的位置。 (3)在程序中增加mykeyboard鍵盤子函數(shù),可放在display()函數(shù)之后。并在如下代碼中進(jìn)行修改,實(shí)現(xiàn)鍵盤控制矩形移動(dòng),運(yùn)行程序自行測(cè)
7、試。 void mykeyboard(unsigned char key, int x, int y) switch(key) case 'W': case 'w':/ 矩形對(duì)角坐標(biāo)變量修改使得矩形上移 y1+=0.1; y2+=0.1; break;case 'S': case 's':/矩形對(duì)角坐標(biāo)變量修改使得矩形下移 y1-=0.1;y2-=0.1; break;case 'A': case 'a':/矩形對(duì)角坐標(biāo)變量修改使得矩形左移 x1-=0.1; x2-=0.1; break;case
8、'D': case 'd':/矩形對(duì)角坐標(biāo)變量修改使得矩形右移 x1+=0.1; x2+=0.1; break; /參數(shù)修改后調(diào)用重畫函數(shù),屏幕圖形將發(fā)生改變 glutPostRedisplay(); 圖2-2 3、設(shè)置窗口改變函數(shù),使得矩形的長度和寬度等于100,程序啟動(dòng)時(shí)矩形仍在窗口中央,當(dāng)顯示窗口最大化時(shí),繪制矩形也隨之增大,如圖2-3。 (1)在main函數(shù)里添加注冊(cè)窗口變化函數(shù)glutReshapeFunc(myreshape); (放在glutMainLoop()之前)并在程序頭部聲明添加窗口變換函數(shù): void myreshape(GLsizei
9、w, GLsizei h);(2)在程序中添加窗口改變子函數(shù),參數(shù)w,h為當(dāng)前顯示窗口的寬和高 void myreshape(GLsizei w, GLsizei h) glViewport(0,0,w,h); /設(shè)置視區(qū)位置 glMatrixMode(GL_PROJECTION);/設(shè)置投影變換模式 glLoadIdentity(); /調(diào)單位矩陣,清空當(dāng)前矩陣堆棧 gluOrtho2D(0,300,0,300); 3) 此時(shí),矩形的初始變量經(jīng)重新計(jì)算后為: float x1=100,x1=100,x2=200,y2=200; 注意:請(qǐng)同學(xué)們自己思考為什么矩形初始的初始變量由原來的(-0.5
10、,-0.5,0.5,0.5)變?yōu)?100,100,200,200) ?裁剪窗口設(shè)置函數(shù)gluOrtho2D(xwmin,xwmax,ywmin,ywmax); 和視區(qū)設(shè)置函數(shù) glViewport(startx,starty,viewport_width,viewport_height)的設(shè)置有何規(guī)律? 此時(shí),按下鍵盤“WADS”鍵進(jìn)行交互移動(dòng),矩形的移動(dòng)距離較之前有什么變化?要保持以前的移動(dòng)頻率,程序應(yīng)該如何修改? a) 顯示窗口改變前 b)顯示窗口變大后圖2-3 4、在矩形中間添加字符"Hello",觀察結(jié)果;然后將"Hello"字符改為自己名字的拼
11、音或英文名字。如圖2-4所示。提示:在繪制矩形后添加如下代碼:glColor3f(1,0,0); glRasterPos2i(x1+x2)/2,(y1+y2)/2); /定位當(dāng)前光標(biāo) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'H'); /寫字符"H" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'e'); /寫字符"e" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); /寫字符"
12、l" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); /寫字符"l" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'o'); /寫字符"o"注意:運(yùn)行程序,效果如圖2-4所示。但是如果此時(shí),按下鍵盤“WADS”鍵進(jìn)行交互移動(dòng),程序會(huì)發(fā)生什么變化?要保持矩形白色,字符紅色,程序應(yīng)該如何修改?如果字符顏色設(shè)置語句glColor3f(1,0,0);放在定位光標(biāo)語句glRasterPos2i(x1+x2)/2,(y1+y2)/2); 之后,運(yùn)
13、行又會(huì)發(fā)生什么變化?請(qǐng)同學(xué)自己總結(jié)設(shè)置字符顏色語句的順序規(guī)律。 圖2-45、 自己參照講義或教材按照自己的構(gòu)思畫二維平面圖形,將上面的矩形替換成自己構(gòu)思的二維平面圖形實(shí)現(xiàn)交互功能,注意頂點(diǎn)的順序。并在畫面上標(biāo)注自己的姓名。3.2 鼠標(biāo)交互(1) 鼠標(biāo)畫線 閱讀OpenGL鼠標(biāo)畫線程序,能夠?qū)崿F(xiàn)在繪制窗口用鼠標(biāo)交互繪制若干條直線,鼠標(biāo)左鍵首先按下,確定直線的起始點(diǎn),鼠標(biāo)左鍵按下同時(shí)移動(dòng),看到畫線過程,鼠標(biāo)左鍵松開時(shí),確定直線的終點(diǎn),可重復(fù)畫多條直線。實(shí)現(xiàn)主要思路: 1) 寫出畫靜止若干條直線程序框架,坐標(biāo)用變量替代;2) 在主函數(shù)里注冊(cè)鼠標(biāo)按鈕響應(yīng)函數(shù)和鼠標(biāo)移動(dòng)響應(yīng)函數(shù);3) 在鼠標(biāo)按鈕響應(yīng)子函
14、數(shù)里,給出鼠標(biāo)按鈕響應(yīng)事件;4) 在鼠標(biāo)移動(dòng)響應(yīng)子函數(shù)里,給出鼠標(biāo)移動(dòng)響應(yīng)事件;5) 讀懂程序并分析程序,保留程序。/鼠標(biāo)畫線小程序#include "stdafx.h"#include <glut.h>#define N 1000 /maximum line numbersint ww,hh; / for display window width and heightint lineN4, k=0; /for line's endpoint coordinates and line numbervoid Myinit(void);void Reshap
15、e(int w, int h);void myMouse(int button,int state,int x,int y);void myMotion(int x,int y);void Display(void);void drawlines();int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);ch
16、ar *argv = "hello ", " "int argc = 2; / must/should match the number of strings in argv glutInit(&argc, argv); /初始化GLUT庫; glutInitWindowSize(800, 600); /設(shè)置顯示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /設(shè)置顯示模式;(注意雙緩沖) glutCreateWindow("鼠標(biāo)畫線小程序演示"); / 創(chuàng)建顯示窗口 Myi
17、nit(); glutDisplayFunc(Display); /注冊(cè)顯示回調(diào)函數(shù) glutMouseFunc(myMouse); /注冊(cè)鼠標(biāo)按鈕回調(diào)函數(shù) glutMotionFunc(myMotion); /注冊(cè)鼠標(biāo)移動(dòng)回調(diào)函數(shù) glutReshapeFunc(Reshape); /注冊(cè)窗口改變回調(diào)函數(shù) glutMainLoop(); /進(jìn)入事件處理循環(huán) return 0;void Myinit(void)glClearColor(0.0,0.0,0.0,0.0);glLineWidth(3.0);/渲染繪制子程序-void Display(void) glClear(GL_COLOR_B
18、UFFER_BIT); /刷新顏色緩沖區(qū);drawlines(); /畫線子程序; glutSwapBuffers(); /雙緩沖的刷新模式;/-void Reshape(int w, int h) /窗口改變時(shí)自動(dòng)獲取顯示窗口的寬w和高h(yuǎn) glMatrixMode(GL_PROJECTION); /投影矩陣模式 glLoadIdentity(); /矩陣堆棧清空 glViewport(0, 0, w, h); /設(shè)置視區(qū)大小 gluOrtho2D(0, w, 0, h); /設(shè)置裁剪窗口大小 ww=w; hh=h;/鼠標(biāo)按鈕響應(yīng)事件.void myMouse(int button,int s
19、tate,int x,int y)if(button=GLUT_LEFT_BUTTON&&state=GLUT_DOWN) linek0=x; /線段起點(diǎn)x坐標(biāo) linek1=hh-y; /線段終點(diǎn)y坐標(biāo)if(button=GLUT_LEFT_BUTTON&&state=GLUT_UP)linek2=x; /線段起點(diǎn)x坐標(biāo)linek3=hh-y; /線段終點(diǎn)y坐標(biāo)k+;glutPostRedisplay(); /鼠標(biāo)移動(dòng)時(shí)獲得鼠標(biāo)移動(dòng)中的坐標(biāo)-void myMotion(int x,int y) /get the line's motion pointl
20、inek2=x; /動(dòng)態(tài)終點(diǎn)的x坐標(biāo)linek3=hh-y; /動(dòng)態(tài)終點(diǎn)的y坐標(biāo) glutPostRedisplay();/畫線子程序void drawlines() for(int i=0;i<=k;i+) /*glBegin(GL_LINES);glVertex2f(linei0,linei1);glVertex2f(linei2,linei3);glEnd();鼠標(biāo)畫線程序運(yùn)行后,程序效果如圖3-3所示。 圖3-3 (2) 鼠標(biāo)繪制矩形(將此修改代碼貼到實(shí)驗(yàn)報(bào)告中) 修改鼠標(biāo)畫線程序,要求:能夠?qū)崿F(xiàn)在繪制窗口用鼠標(biāo)交互繪制若干矩形,鼠標(biāo)左鍵首先按下,確定矩形對(duì)角線的起始點(diǎn),鼠標(biāo)左鍵
21、按下同時(shí)移動(dòng)時(shí),看到畫矩形過程,鼠標(biāo)左鍵松開,確定矩形對(duì)角線的另一點(diǎn),可重復(fù)畫多個(gè)矩形。如圖3-4所示。 圖3-4四、思考題:按下列步驟操作,并分析裁剪窗口、視區(qū)和顯示窗口的關(guān)系。 (1)修改視區(qū)大小為原來的一半。如圖2-5(a)。 (2)修改裁剪窗口的大小原來的一半;視區(qū)保持不變。如圖2-5(b)。 圖2-5(a) 圖2-5(b)(3)修改以上程序使得按數(shù)字1鍵 實(shí)現(xiàn)矩形用WSAD鍵控制上下左右移動(dòng),按2鍵 顯示自己構(gòu)思的其他2D圖形(三角形,點(diǎn)或多邊形等)用WSAD鍵控制上下左右移動(dòng)五、參考函數(shù):1、 裁剪窗口設(shè)置函數(shù):gluOrtho2D(xwmin,xwmax,ywmin,ywmax)
22、; xwmin,xwmax,ywmin,ywmax為裁剪窗口在世界坐標(biāo)系的位置,分別為x最小,x最大,y最小,y最大2、 視區(qū)設(shè)置函數(shù):glViewport(startx,starty,viewport_width,viewport_height); 繪圖區(qū)在顯示窗口中的位置,以屏幕坐標(biāo)系為參考 startx,starty,viewport_width,viewport_height分別為繪圖區(qū)在顯示窗口的起點(diǎn)位置, 以及繪圖區(qū)的寬度和高度 3、 鍵盤響應(yīng)相關(guān)函數(shù):3.1 glutKeyboardFunc(void*f(unsigned char key,int x,int y)注冊(cè)鍵盤響應(yīng)函
23、數(shù), 按下鍵盤中某鍵,程序?qū)ey值作為字符返回給函數(shù)f,用戶可決定下一步的行動(dòng)。該函數(shù)調(diào)用放在主程序main()中n 例如,當(dāng)用戶按下q 或 Q 或 Esc鍵 (ASCII27)時(shí),程序退出。n glutKeyboardFunc(mykey); /主函數(shù)注冊(cè)鍵盤響應(yīng)函數(shù) n void mykey(unsigned char key,int x,int y) /鍵盤響應(yīng)函數(shù)n if (key=q|key=Q|key=27)n exit(0);n 3.2 特殊鍵響應(yīng)void glutSpecialFunc(void (*f) (int key,int x,int y)當(dāng)用戶按下一個(gè)特殊鍵時(shí),調(diào)用
24、函數(shù)f響應(yīng)用戶需求。使用方法同glutKeyboardFunc(void*f(unsigned char key,int x,int y)例, if (key=GLUT_KEY_F1) . if (key=GLUT_KEY_UP) .非ASCII鍵回調(diào)參數(shù)值Fi(i=1,2,12)GLUT_KEY_FiPage UpGLUT_KEY_PAGE_UPPage DownGLUT_KEY_PAGE_DOWN左方向鍵GLUT_KEY_LEFT右方向鍵GLUT_KEY_RIGHT上方向鍵GLUT_KEY_UP下方向鍵GLUT_KEY_DOWNHomeGLUT_KEY_HOMEEndGLUT_KEY_EN
25、D3.3 組合鍵 int glutGetModifers() 在鍵盤響應(yīng)事件中當(dāng)鍵盤按下時(shí)返回GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL,或GLUT_ACTIVE_ALT值例, if(glutGetModifers()= GLUT_ACTIVE_CTRL)&&(key=c)|(key=C) exit(0);4、 鼠標(biāo)按鈕響應(yīng)相關(guān)函數(shù) n void glutMouseFunc(void (*f) (int button, int state, int x, int y)¨ Mouse callback function。在主程序中調(diào)用。¨ button:n GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON,GLUT_RIGHT_BUTTON¨ state:n GLUT_UP,GLUT_DOWN¨ x,y:返
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度租賃房屋維修保養(yǎng)責(zé)任合同4篇
- 二零二五版房產(chǎn)中介公司擔(dān)保貸款服務(wù)合同范本3篇
- 二零二五年度道路危險(xiǎn)貨物運(yùn)輸合同標(biāo)的運(yùn)輸資質(zhì)審核合同4篇
- 2025年度綠色辦公空間植物租賃與空氣質(zhì)量改善合同4篇
- 2024蔬菜產(chǎn)業(yè)技術(shù)研究合作合同范本3篇
- 2025年度智慧社區(qū)建設(shè)場(chǎng)咨詢服務(wù)合同樣本4篇
- 全球醫(yī)藥市場(chǎng)及發(fā)展趨勢(shì)概要教學(xué)教材
- 4 上學(xué)路上 第二課時(shí) 說課稿-2023-2024學(xué)年道德與法治一年級(jí)上冊(cè)統(tǒng)編版
- 2025年度冷鏈物流材料運(yùn)輸安全與責(zé)任協(xié)議3篇
- 2025年駝絨布項(xiàng)目投資可行性研究分析報(bào)告
- 中國大百科全書(第二版全32冊(cè))08
- 初中古詩文言文背誦內(nèi)容
- 天然氣分子篩脫水裝置吸附計(jì)算書
- 檔案管理項(xiàng)目 投標(biāo)方案(技術(shù)方案)
- 蘇教版六年級(jí)上冊(cè)100道口算題(全冊(cè)完整版)
- 2024年大學(xué)試題(宗教學(xué))-佛教文化筆試考試歷年典型考題及考點(diǎn)含含答案
- 計(jì)算機(jī)輔助設(shè)計(jì)智慧樹知到期末考試答案章節(jié)答案2024年青島城市學(xué)院
- 知識(shí)庫管理規(guī)范大全
- 電腦耗材實(shí)施方案、供貨方案、售后服務(wù)方案
- 環(huán)衛(wèi)項(xiàng)目年終工作總結(jié)
- 弘揚(yáng)教育家精神爭做四有好老師心得10篇
評(píng)論
0/150
提交評(píng)論