實驗四-鼠標交互_第1頁
實驗四-鼠標交互_第2頁
實驗四-鼠標交互_第3頁
實驗四-鼠標交互_第4頁
實驗四-鼠標交互_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

OpenGL的鼠標交互一、實驗目的1、掌握OpenGL的鼠標按鈕響應函數2、掌握OpenGL的鼠標移動響應函數3、進一步穩固OpenGL的根本圖元繪制的根底二、實驗環境硬件要求:PC機,主流配置,最好為獨立顯卡,顯存512M以上。軟件環境:操作系統:WindowsXP。語言開發工具:MicrosoftVisualstudio2023,VisualC++。三、實驗內容與要求要求:實驗課上老師要求的效果截圖、及其相應代碼拷貝到實驗報告文檔里。WORD文檔命名方式:學號姓名-實驗序號-實驗名稱。內容:1)鼠標畫草圖-實現鼠標點到哪,線就畫到哪思路:1.在主程序注冊鼠標響應和鼠標移動子函數glutMouseFunc(mymouse);glutMotionFunc(mymotion);放在display注冊之后和mainloop之前2.在程序頭部聲明鼠標響應和鼠標移動子函數voidmyMouse(intbutton,intstate,intx,inty);voidmyMotion(intx,inty);3.構造鼠標響應子函數//鼠標按鈕響應事件..voidmyMouse(intbutton,intstate,intx,inty){//鼠標左鍵按下—確定起始點//鼠標左鍵松開___畫最后一個頂點,畫線結束}4.構造鼠標移動子函數//鼠標移動時獲得鼠標移動中的坐標-----------------------------------------------------voidmyMotion(intx,inty){//鼠標移動__線畫到哪}5.修改顯示函數Display();附:畫直線程序框架#include"stdafx.h"#include<glut.h>intww,hh;//fordisplaywindowwidthandheightvoidMyinit(void);voidReshape(intw,inth);voidDisplay(void);intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);char*argv[]={"hello",""};intargc=2;//must/shouldmatchthenumberofstringsinargv glutInit(&argc,argv);//初始化GLUT庫;glutInitWindowSize(800,600);//設置顯示窗口大小glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//設置顯示模式;〔注意雙緩沖〕glutCreateWindow("鼠標畫線小程序演示");//創立顯示窗口Myinit();glutDisplayFunc(Display);//注冊顯示回調函數glutReshapeFunc(Reshape);//注冊窗口改變回調函數 glutMainLoop();//進入事件處理循環return0;}voidMyinit(void){glClearColor(0.0,0.0,0.0,0.0);glLineWidth(3.0);}//渲染繪制子程序--------------------------------------------------------------------------voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//刷新顏色緩沖區;glBegin(GL_LINES);glVertex2f(0,0);glVertex2f(ww,hh);glEnd();glutSwapBuffers();//雙緩沖的刷新模式;}//-----------------------------------------------voidReshape(intw,inth)//窗口改變時自動獲取顯示窗口的寬w和高h{glMatrixMode(GL_PROJECTION);//投影矩陣模式glLoadIdentity();//矩陣堆棧清空glViewport(0,0,w,h);//設置視區大小gluOrtho2D(0,w,0,h);//設置裁剪窗口大小ww=w;hh=h;}2〕鼠標畫線閱讀OpenGL鼠標畫線程序,能夠實現在繪制窗口用鼠標交互繪制假設干條直線,鼠標左鍵首先按下,確定直線的起始點,鼠標左鍵按下同時移動,看到畫線過程,鼠標左鍵松開時,確定直線的終點,可重復畫多條直線。實現主要思路:1)寫出畫靜止假設干條直線程序框架,坐標用變量替代;2)在主函數里注冊鼠標按鈕響應函數和鼠標移動響應函數;3)在鼠標按鈕響應子函數里,給出鼠標按鈕響應事件;4)在鼠標移動響應子函數里,給出鼠標移動響應事件;5)讀懂程序并分析程序,保存程序。//鼠標畫線小程序#include"stdafx.h"#include<glut.h>#defineN1000//maximumlinenumbersintww,hh;//fordisplaywindowwidthandheightintline[N][4],k=0;//forline'sendpointcoordinatesandlinenumbervoidMyinit(void);voidReshape(intw,inth);voidmyMouse(intbutton,intstate,intx,inty);voidmyMotion(intx,inty);voidDisplay(void);voiddrawlines();intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);char*argv[]={"hello",""};intargc=2;//must/shouldmatchthenumberofstringsinargv glutInit(&argc,argv);//初始化GLUT庫;glutInitWindowSize(800,600);//設置顯示窗口大小glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//設置顯示模式;〔注意雙緩沖〕glutCreateWindow("鼠標畫線小程序演示");//創立顯示窗口Myinit();glutDisplayFunc(Display);//注冊顯示回調函數glutMouseFunc(myMouse);//注冊鼠標按鈕回調函數glutMotionFunc(myMotion);//注冊鼠標移動回調函數glutReshapeFunc(Reshape);//注冊窗口改變回調函數 glutMainLoop();//進入事件處理循環return0;}voidMyinit(void){glClearColor(0.0,0.0,0.0,0.0);glLineWidth(3.0);}//渲染繪制子程序--------------------------------------------------------------------------voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//刷新顏色緩沖區; drawlines();//畫線子程序;glutSwapBuffers();//雙緩沖的刷新模式;}//-----------------------------------------------voidReshape(intw,inth)//窗口改變時自動獲取顯示窗口的寬w和高h{glMatrixMode(GL_PROJECTION);//投影矩陣模式glLoadIdentity();//矩陣堆棧清空glViewport(0,0,w,h);//設置視區大小gluOrtho2D(0,w,0,h);//設置裁剪窗口大小ww=w;hh=h;}//鼠標按鈕響應事件..voidmyMouse(intbutton,intstate,intx,inty){if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) { line[k][0]=x;//線段起點x坐標 line[k][1]=hh-y;//線段終點y坐標 }if(button==GLUT_LEFT_BUTTON&&state==GLUT_UP) { line[k][2]=x;//線段起點x坐標 line[k][3]=hh-y;//線段終點y坐標 k++; glutPostRedisplay(); }}//鼠標移動時獲得鼠標移動中的坐標-----------------------------------------------------voidmyMotion(intx,inty){//gettheline'smotionpoint line[k][2]=x;//動態終點的x坐標 line[k][3]=hh-y;//動態終點的y坐標 glutPostRedisplay();}//畫線子程序voiddrawlines(){for(inti=0;i<=k;i++)//******** { glBegin(GL_LINES); glVertex2f(line[i][0],line[i][1]); glVertex2f(line[i][2],line[i][3]); glEnd(); }}鼠標畫線程序運行后,程序效果如圖3-3所示。圖3-33〕鼠標繪制矩形〔將此修改代碼貼到實驗報告中〕修改鼠標畫線程序,要求:能夠實現在繪制窗口用鼠標交互繪制假設干矩形,鼠標左鍵首先按下,確定矩形對角線的起始點,鼠標左鍵按下同時移動時,看到畫矩形過程,鼠標左鍵松開,確定矩形對角線的另一點,可重復畫多個矩形。如圖3-4所示。圖3-44〕思考題鼠標畫圓鼠標畫圓應如何修改代碼?四、參考函數:1、根本圖元函數繪制舉例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);//內徑0.8,外徑1,盤心在原點2)球的繪制方法glutSolidSphere(1,80,80);//半徑為1的球,球心在原點glutWireSphere(1,80,80);//半徑為1的球,球心在原點5)裁剪窗口設置函數:gluOrtho2D(xwmin,xwmax,ywmin,ywmax);xwmin,xwmax,ywmin,ywmax為裁剪窗口在世界坐標系的位置,分別為x最小,x最大,y最小,y最大6)視區設置函數:glViewport(startx,starty,viewport_width,viewport_height);繪圖區在顯示窗口中的位置,以屏幕坐標系為參考startx,starty,viewport_width,viewport_height分別為繪圖區在顯示窗口的起點位置,以及繪圖區的寬度和高度7)鼠標按鈕響應相關函數voidglutMouseFunc(void(*f)(intbutton,intstate,intx,inty))Mousecallbackfunction。在主程序中調用。button:GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON,GLUT_RIGHT_BUTTONstate:GLUT_UP,GLUT_DOWNx,y:返回鼠標在窗口的位置(原點在左上角)。例如,主程序注冊:glutMouseFunc(mymouse);voidmym

溫馨提示

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

評論

0/150

提交評論