實驗四-鼠標交互.doc_第1頁
實驗四-鼠標交互.doc_第2頁
實驗四-鼠標交互.doc_第3頁
實驗四-鼠標交互.doc_第4頁
實驗四-鼠標交互.doc_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

OpenGL的鼠標交互一、實驗目的1、掌握OpenGL的鼠標按鈕響應函數(shù)2、掌握OpenGL的鼠標移動響應函數(shù)3、進一步鞏固OpenGL的基本圖元繪制的基礎二、實驗環(huán)境 硬件要求:PC機,主流配置,最好為獨立顯卡,顯存512M以上。 軟件環(huán)境:操作系統(tǒng):Windows XP。語言開發(fā)工具:Microsoft Visual studio 2008,Visual C+。三、實驗內(nèi)容與要求 要求: 實驗課上老師要求的效果截圖、及其相應代碼 拷貝到實驗報告文檔里。 WORD文檔命名方式:學號姓名-實驗序號-實驗名稱。內(nèi)容:1) 鼠標畫草圖-實現(xiàn)鼠標點到哪,線就畫到哪 思路: 1.在主程序注冊鼠標響應和鼠標移動子函數(shù) glutMouseFunc(mymouse); glutMotionFunc(mymotion);放在display注冊之后和mainloop之前2. 在程序頭部聲明鼠標響應和鼠標移動子函數(shù) void myMouse(int button,int state,int x,int y);void myMotion(int x,int y);3. 構(gòu)造鼠標響應子函數(shù) /鼠標按鈕響應事件.void myMouse(int button,int state,int x,int y)/鼠標左鍵按下確定起始點 /鼠標左鍵松開_畫最后一個頂點,畫線結(jié)束4. 構(gòu)造鼠標移動子函數(shù) /鼠標移動時獲得鼠標移動中的坐標-void myMotion(int x,int y) /鼠標移動_線畫到哪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庫; glutInitWindowSize(800, 600); /設置顯示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /設置顯示模式;(注意雙緩沖) glutCreateWindow(鼠標畫線小程序演示); / 創(chuàng)建顯示窗口 Myinit(); glutDisplayFunc(Display); /注冊顯示回調(diào)函數(shù) glutReshapeFunc(Reshape); /注冊窗口改變回調(diào)函數(shù) glutMainLoop(); /進入事件處理循環(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) /窗口改變時自動獲取顯示窗口的寬w和高h glMatrixMode(GL_PROJECTION); /投影矩陣模式 glLoadIdentity(); /矩陣堆棧清空 glViewport(0, 0, w, h); /設置視區(qū)大小 gluOrtho2D(0, w, 0, h); /設置裁剪窗口大小 ww=w; hh=h; 2) 鼠標畫線 閱讀OpenGL鼠標畫線程序,能夠?qū)崿F(xiàn)在繪制窗口用鼠標交互繪制若干條直線,鼠標左鍵首先按下,確定直線的起始點,鼠標左鍵按下同時移動,看到畫線過程,鼠標左鍵松開時,確定直線的終點,可重復畫多條直線。實現(xiàn)主要思路: 1) 寫出畫靜止若干條直線程序框架,坐標用變量替代;2) 在主函數(shù)里注冊鼠標按鈕響應函數(shù)和鼠標移動響應函數(shù);3) 在鼠標按鈕響應子函數(shù)里,給出鼠標按鈕響應事件;4) 在鼠標移動響應子函數(shù)里,給出鼠標移動響應事件;5) 讀懂程序并分析程序,保留程序。/鼠標畫線小程序#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庫; glutInitWindowSize(800, 600); /設置顯示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); /設置顯示模式;(注意雙緩沖) glutCreateWindow(鼠標畫線小程序演示); / 創(chuàng)建顯示窗口 Myinit(); glutDisplayFunc(Display); /注冊顯示回調(diào)函數(shù) glutMouseFunc(myMouse); /注冊鼠標按鈕回調(diào)函數(shù) glutMotionFunc(myMotion); /注冊鼠標移動回調(diào)函數(shù) glutReshapeFunc(Reshape); /注冊窗口改變回調(diào)函數(shù) glutMainLoop(); /進入事件處理循環(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) /窗口改變時自動獲取顯示窗口的寬w和高h glMatrixMode(GL_PROJECTION); /投影矩陣模式 glLoadIdentity(); /矩陣堆棧清空 glViewport(0, 0, w, h); /設置視區(qū)大小 gluOrtho2D(0, w, 0, h); /設置裁剪窗口大小 ww=w; hh=h;/鼠標按鈕響應事件.void myMouse(int button,int state,int x,int y)if(button=GLUT_LEFT_BUTTON&state=GLUT_DOWN) linek0=x; /線段起點x坐標 linek1=hh-y; /線段終點y坐標if(button=GLUT_LEFT_BUTTON&state=GLUT_UP)linek2=x; /線段起點x坐標linek3=hh-y; /線段終點y坐標k+;glutPostRedisplay(); /鼠標移動時獲得鼠標移動中的坐標-void myMotion(int x,int y) /get the lines motion pointlinek2=x; /動態(tài)終點的x坐標linek3=hh-y; /動態(tài)終點的y坐標 glutPostRedisplay();/畫線子程序void drawlines() for(int i=0;i=k;i+) /*glBegin(GL_LINES);glVertex2f(linei0,linei1);glVertex2f(linei2,linei3);glEnd();鼠標畫線程序運行后,程序效果如圖3-3所示。 圖3-3 3) 鼠標繪制矩形(將此修改代碼貼到實驗報告中) 修改鼠標畫線程序,要求:能夠?qū)崿F(xiàn)在繪制窗口用鼠標交互繪制若干矩形,鼠標左鍵首先按下,確定矩形對角線的起始點,鼠標左鍵按下同時移動時,看到畫矩形過程,鼠標左鍵松開,確定矩形對角線的另一點,可重復畫多個矩形。如圖3-4所示。 圖3-4 4)思考題鼠標畫圓 鼠標畫圓應如何修改代碼? 四、 參考函數(shù): 1、基本圖元函數(shù)繪制舉例1)、點繪制舉例 glPointSize(2.0) /點的大小設置 glBegin(GL_POINTS); glColor3f(1.0,1.0,1.0); glVertex2f(-0.5,-0.5); /頂點 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; /定義二次曲面對象 disk=gluNewQuadric(); /生成二次去面對像gluDisk(disk,0.8,1,50,50); /內(nèi)徑0.8,外徑1,盤心在原點 2)球的繪制方法 glutSolidSphere(1,80,80); /半徑為1的球,球心在原點 glutWireSphere(1,80,80); /半徑為1的球,球心在原點 5)裁剪窗口設置函數(shù):gluOrtho2D(xwmin,xwmax,ywmin,ywmax);xwmin,xwmax,ywmin,ywmax為裁剪窗口在世界坐標系的位置,分別為x最小,x最大,y最小,y最大6) 視區(qū)設置函數(shù):glViewport(startx,starty,viewport_width,viewport_height);繪圖區(qū)在顯示窗口中的位置,以屏幕坐標系為參考startx,starty,viewport_width,viewport_height分別為繪圖區(qū)在顯示窗口的起點位置, 以及繪圖區(qū)的寬度和高度 7) 鼠標按鈕響應相關函數(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:返回鼠標在窗口的位置(原點在左上角)。例如,主程序注冊: glutMouseFunc(mymouse); void mymouse(int x,int y,int button,int state) if (state=GLUT_DOWN &button=GL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論