實(shí)驗(yàn)四-鼠標(biāo)交互.doc_第1頁(yè)
實(shí)驗(yàn)四-鼠標(biāo)交互.doc_第2頁(yè)
實(shí)驗(yàn)四-鼠標(biāo)交互.doc_第3頁(yè)
實(shí)驗(yàn)四-鼠標(biāo)交互.doc_第4頁(yè)
實(shí)驗(yàn)四-鼠標(biāo)交互.doc_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

OpenGL的鼠標(biāo)交互一、實(shí)驗(yàn)?zāi)康?、掌握OpenGL的鼠標(biāo)按鈕響應(yīng)函數(shù)2、掌握OpenGL的鼠標(biāo)移動(dòng)響應(yīng)函數(shù)3、進(jìn)一步鞏固OpenGL的基本圖元繪制的基礎(chǔ)二、實(shí)驗(yàn)環(huán)境 硬件要求:PC機(jī),主流配置,最好為獨(dú)立顯卡,顯存512M以上。 軟件環(huán)境:操作系統(tǒng):Windows XP。語(yǔ)言開發(fā)工具:Microsoft Visual studio 2008,Visual C+。三、實(shí)驗(yàn)內(nèi)容與要求 要求: 實(shí)驗(yàn)課上老師要求的效果截圖、及其相應(yīng)代碼 拷貝到實(shí)驗(yàn)報(bào)告文檔里。 WORD文檔命名方式:學(xué)號(hào)姓名-實(shí)驗(yàn)序號(hào)-實(shí)驗(yàn)名稱。內(nèi)容:1) 鼠標(biāo)畫草圖-實(shí)現(xiàn)鼠標(biāo)點(diǎn)到哪,線就畫到哪 思路: 1.在主程序注冊(cè)鼠標(biāo)響應(yīng)和鼠標(biāo)移動(dòng)子函數(shù) glutMouseFunc(mymouse); glutMotionFunc(mymotion);放在display注冊(cè)之后和mainloop之前2. 在程序頭部聲明鼠標(biāo)響應(yīng)和鼠標(biāo)移動(dòng)子函數(shù) void myMouse(int button,int state,int x,int y);void myMotion(int x,int y);3. 構(gòu)造鼠標(biāo)響應(yīng)子函數(shù) /鼠標(biāo)按鈕響應(yīng)事件.void myMouse(int button,int state,int x,int y)/鼠標(biāo)左鍵按下確定起始點(diǎn) /鼠標(biāo)左鍵松開_畫最后一個(gè)頂點(diǎn),畫線結(jié)束4. 構(gòu)造鼠標(biāo)移動(dòng)子函數(shù) /鼠標(biāo)移動(dòng)時(shí)獲得鼠標(biāo)移動(dòng)中的坐標(biāo)-void myMotion(int x,int y) /鼠標(biāo)移動(dòng)_線畫到哪5. 修改顯示函數(shù)Display();附: 畫直線程序框架 #include stdafx.h#include int ww,hh; / for display window width and heightvoid Myinit(void);void Reshape(int w, int h);void Display(void);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 in argv glutInit(&argc, argv); /初始化GLUT庫(kù); glutInitWindowSize(800, 600); /設(shè)置顯示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /設(shè)置顯示模式;(注意雙緩沖) glutCreateWindow(鼠標(biāo)畫線小程序演示); / 創(chuàng)建顯示窗口 Myinit(); glutDisplayFunc(Display); /注冊(cè)顯示回調(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_BUFFER_BIT); /刷新顏色緩沖區(qū); glBegin(GL_LINES); glVertex2f(0,0); glVertex2f(ww,hh); glEnd(); 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; 2) 鼠標(biāo)畫線 閱讀OpenGL鼠標(biāo)畫線程序,能夠?qū)崿F(xiàn)在繪制窗口用鼠標(biāo)交互繪制若干條直線,鼠標(biāo)左鍵首先按下,確定直線的起始點(diǎn),鼠標(biāo)左鍵按下同時(shí)移動(dòng),看到畫線過(guò)程,鼠標(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)子函數(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 #define N 1000 /maximum line numbersint ww,hh; / for display window width and heightint lineN4, k=0; /for lines endpoint coordinates and line numbervoid Myinit(void);void Reshape(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);char *argv = hello , ;int argc = 2; / must/should match the number of strings in argv glutInit(&argc, argv); /初始化GLUT庫(kù); glutInitWindowSize(800, 600); /設(shè)置顯示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /設(shè)置顯示模式;(注意雙緩沖) glutCreateWindow(鼠標(biāo)畫線小程序演示); / 創(chuàng)建顯示窗口 Myinit(); 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_BUFFER_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 state,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 lines motion pointlinek2=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 3) 鼠標(biāo)繪制矩形(將此修改代碼貼到實(shí)驗(yàn)報(bào)告中) 修改鼠標(biāo)畫線程序,要求:能夠?qū)崿F(xiàn)在繪制窗口用鼠標(biāo)交互繪制若干矩形,鼠標(biāo)左鍵首先按下,確定矩形對(duì)角線的起始點(diǎn),鼠標(biāo)左鍵按下同時(shí)移動(dòng)時(shí),看到畫矩形過(guò)程,鼠標(biāo)左鍵松開,確定矩形對(duì)角線的另一點(diǎn),可重復(fù)畫多個(gè)矩形。如圖3-4所示。 圖3-4 4)思考題鼠標(biāo)畫圓 鼠標(biāo)畫圓應(yīng)如何修改代碼? 四、 參考函數(shù): 1、基本圖元函數(shù)繪制舉例1)、點(diǎn)繪制舉例 glPointSize(2.0) /點(diǎn)的大小設(shè)置 glBegin(GL_POINTS); glColor3f(1.0,1.0,1.0); glVertex2f(-0.5,-0.5); /頂點(diǎn) glColor3f(1.0,0.0,1.0); glVertex2f(-0.5,0.5); glColor3f(0.0,1.0,1.0); glVertex2f(0.5,0.5); glColor3f(1.0,1.0,0.0); glVertex2f(0.5,-0.5); glEnd() 2)、直線/三角形/四邊形繪制舉例 glLineWidth(2.0); glBegin(GL_LINES); / glBegin(GL_LINE_STRIP); / glBegin(GL_LINE_LOOP); / glBegin(GL_TRIANGLES); / glBegin(GL_TRIANGLE_STRIP); / glBegin(GL_TRIANGLE_FAN); / glBegin(GL_QUADS); / glBegin(GL_TRIANGLE_STRIP); glVertex2f(-0.5,0.5); glVertex2f(-0.5,-0.5); glColor3f(1.0,1.0,1.0); glVertex2f(-0.5,0.5); glColor3f(1.0,1.0,0.0); glVertex2f(0.5,-0.5); glEnd(); 3)、多邊形舉例 glBegin(GL_POLYGON); glVertex2f(-0.5,0.5); glVertex2f(-0.5,-0.5); glColor3f(1.0,1.0,1.0); glVertex2f(0,-0.5); glColor3f(1.0,1.0,0.0); glVertex2f(0.5,-0.5); glVertex2f(0.5,0.5); glEnd(); 4)、圓的繪制 1)圓盤繪制方法 GLUquadricObj *disk; /定義二次曲面對(duì)象 disk=gluNewQuadric(); /生成二次去面對(duì)像gluDisk(disk,0.8,1,50,50); /內(nèi)徑0.8,外徑1,盤心在原點(diǎn) 2)球的繪制方法 glutSolidSphere(1,80,80); /半徑為1的球,球心在原點(diǎn) glutWireSphere(1,80,80); /半徑為1的球,球心在原點(diǎn) 5)裁剪窗口設(shè)置函數(shù):gluOrtho2D(xwmin,xwmax,ywmin,ywmax);xwmin,xwmax,ywmin,ywmax為裁剪窗口在世界坐標(biāo)系的位置,分別為x最小,x最大,y最小,y最大6) 視區(qū)設(shè)置函數(shù):glViewport(startx,starty,viewport_width,viewport_height);繪圖區(qū)在顯示窗口中的位置,以屏幕坐標(biāo)系為參考startx,starty,viewport_width,viewport_height分別為繪圖區(qū)在顯示窗口的起點(diǎn)位置, 以及繪圖區(qū)的寬度和高度 7) 鼠標(biāo)按鈕響應(yīng)相關(guān)函數(shù) 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:返回鼠標(biāo)在窗口的位置(原點(diǎn)在左上角)。例如,主程序注冊(cè): glutMouseFunc(mymouse); void mymouse(int x,int y,int button,int state) if (state=GLUT_DOWN &button=GL

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論