ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:52.04KB ,
资源ID:9772140      下载积分:8 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9772140.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(实验四OpenGL下图形的交互控制.doc)为本站上传会员【人****来】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

实验四OpenGL下图形的交互控制.doc

1、实验四 OpenGL下图形的交互控制 实验目的: 通过实验掌握下列知识: 1. 熟悉OpenGL Glut中常用的回调函数; 2. 掌握用鼠标对图形进行交互控制的方法; 3. 掌握用键盘对图形进行交互控制的方法; 内容及步骤: 一、常用回调函数的介绍 1、用于显示的回调函数 (1) void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GLUT当窗口内容必须被绘制时,那个函数将被调用.当窗口改变大小或者从被覆盖的状态中恢复

2、或者由于调用glutPostRedisplay()函数要求GLUT更新时,执行func参数指定的函数. (2) void glutReshapeFunc(void (*func)(int width, int height)); 指定当窗口的大小改变时调用的函数 参数: func:形如void func(int width, int height) 处理窗口大小改变的函数. width,height:为窗口改变后长宽. 这个函数确定一个回调函数,每当窗口的大小或形状改变时(包括窗口第一次创建),GLUT将会调用这个函数,这个回调函数接受这个窗口新的长宽作为输入参数. 2

3、用于鼠标操作的回调函数 (1) void glutMouseFunc(void (*func)(int button, int state, int x, int y)); 注册当前窗口的鼠标点击回调函数 参数: func:形如void func(int button, int state, int x, int y); button:鼠标的按键,为以下定义的常量 GLUT_LEFT_BUTTON:鼠标左键 GLUT_MIDDLE_BUTTON:鼠标中键 GLUT_RIGHT_BUTTON:鼠标右键 state:鼠标按键的动作,为以下定义的常量

4、GLUT_UP:鼠标释放 GLUT_DOWN:鼠标按下 x,y:鼠标按下式,光标相对于窗口左上角的位置 当点击鼠标时调用. (2) void glutMotionFunc(void (*func)(int x, int y)); 当鼠标在窗口中按下并移动时调用glutMotionFunc注册的回调函数 (3) void glutPassiveMotionFunc(void (*func)(int x, int y)); 当鼠标在窗口中移动时调用glutPassiveMotionFunc注册的回调函数 参数: func:形如void func(int x, i

5、nt y); x,y:鼠标按下式,光标相对于窗口左上角的位置,以像素为单位 (4) void glutEntryFunc(void (*func)(int state)); 设置鼠标进出窗口的回调函数 参数: func:形如void func(int state);注册的鼠标进出回调函数 state:鼠标的进出状态,为以下常量之一 GLUT_LEFT 鼠标离开窗口 GLUT_ENTERED 鼠标进入窗口 当窗口取得焦点或失去焦点时调用这个函数,当鼠标进入窗口区域并点击时,state为GLUT_ENTERED,当鼠标离开窗口区域点击其他窗口时,state为G

6、LUT_LEFT. 3、用于键盘操作的回调函数 (1) void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)); 注册当前窗口的键盘回调函数 参数: func:形如void func(unsigned char key, int x, int y) key:按键的ASCII码 x,y:当按下键时鼠标的坐标,相对于窗口左上角,以像素为单位 当敲击键盘按键时调用. ( 除了特殊按键,即glutSpecialFunc()中处理的按键,详见glutSpecialFunc() ) (2)void

7、 glutSpecialFunc(void (*func)(int key, int x, int y)); 设置当前窗口的键盘特定键的回调函数 参数: Func:形如void func(int key, int x, int y); key:按下的特定键,为以下定义的常量 GLUT_KEY_F1:F1功能键 GLUT_KEY_F2:F2功能键 GLUT_KEY_F3:F3功能键 GLUT_KEY_F4:F4功能键 GLUT_KEY_F5:F5功能键 GLUT_KEY_F6:F6功能键 GLUT_KEY_F7:F7功能键

8、 GLUT_KEY_F8:F8功能键 GLUT_KEY_F9:F9功能键 GLUT_KEY_F10:F10功能键 GLUT_KEY_F11:F11功能键 GLUT_KEY_F12:F12功能键 GLUT_KEY_LEFT:左方向键 GLUT_KEY_UP:上方向键 GLUT_KEY_RIGHT:右方向键 GLUT_KEY_DOWN:下方向键 GLUT_KEY_PAGE_UP:PageUp键 GLUT_KEY_PAGE_DOWN:PageDown键 GLUT_KEY_HOME:Home键 GLUT_K

9、EY_END:End键 GLUT_KEY_INSERT:Insert键 注意特别:上述键盘和鼠标的回调函数中,都返回光标的当前坐标x和y,注意这个坐标的原点是在窗口左上角,向右为X轴的正方向,向下为Y轴的正方向。而glut中的函数是把窗口的左下角设为原点,向右为X轴的正方向,向上为Y轴的正方向。所以假设窗口的高为winHeight,那么回调函数中光标(x,y)的位置换算到glut中实际上是(x,winHeight - y)。 注意:ESC,回车和delete键由ASCII码产生,即可以用glutKeyboardFunc()处理。当在键盘上敲击上述按键时调用该函数。注意和glut

10、KeyboardFunc()的区别. 4、其它常用的回调函数 (8) void glutIdleFunc(void (*func)(void)); 设置空闲回调函数 参数: func:形如void func(void); 当系统空闲时调用. 5、实例 实例1、一个旋转的三角形――用空闲回调函数实现 #include #include #define DEG_TO_RAD 0.017453 //角度转为弧度的参数,即 2*PI/360 float theta=30.0; //直线和X轴正方向的夹角 float

11、length=200.0; //直线的长度 float x=300.0, y=200.0; //直线的第一个端点 void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 640.0, 0.0, 480.0); } void display (void) { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0,

12、0.0); glBegin (GL_POLYGON); glVertex2f (x, y); glVertex2f ( x + length*cos(DEG_TO_RAD*theta), y + length*sin(DEG_TO_RAD*theta) ); glVertex2f ( x + length*cos(DEG_TO_RAD* (theta+30) ), y + length*sin(DEG_TO_RAD* (theta+30)) ); glEnd ( ); glFlush ( ); } vo

13、id idleFunc() { theta += 0.1; if (theta>360) theta -=360; glutPostRedisplay(); //重新调用绘制函数 } void main (int argc, char** argv) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition (50, 100); glutIn

14、itWindowSize (640, 480); glutCreateWindow ("Draw Triangle with Single Buffer"); init ( ); glutDisplayFunc (display); glutIdleFunc(idleFunc); //指定空闲回调函数 glutMainLoop ( ); } 该例子中,我们使红色三角形围绕其中的一个顶点旋转,该顶

15、点就是(300,200),三角形的另外两个顶点由两个参数length和theta确定,length是这两个顶点离固定顶点(300,200)的距离,这两个顶点和(300,200)连线的夹角分别为theta和theta+30度(相对于X轴正方向),所以,当改变theta的值时,三角形的位置会围绕(300,200)旋转。 该程序中改变theta的值是在函数idleFunc中,每次增加0.1度,当大于360度时,又使之变为0度,始终使theta在)0~360度之间循环变化。该函数我们用glutIdleFunc(idleFunc)指定为空闲回调函数,当事件队列中没有事件需要处理时,该空闲回调函数得到执

16、行。 执行后,会看到红色的三角形在旋转中有闪烁的现象,这是由于计算机的显示屏工作时都以固定的频率进行刷新,刷新时从显示卡的内存里取颜色缓存的内容,表现在显示屏上。对于应用程序来说,屏幕的刷新无法控制。该程序绘制时,实际上是对显示卡内存里的颜色缓存进行操作,所以程序对颜色缓存的写和显示屏刷新时对颜色缓存的读是不同步的,所以在某个时刻,颜色缓存的所有颜色值可能不是针对某个确定的theta值,所以三角形看起来不完整。 虽然应用程序无法将两个读写过程同步,但借助于双缓存技术,可以保证绘制一个完整的红色三角形。双缓存技术使用两个颜色缓存――前台缓存和后台缓存,前台缓存用于刷新显示屏,后台缓存用于应用

17、程序的绘制。在绘制完成一个完整的三角形后,我们只要交换前台缓存和后台缓存,就能输出完整的图形。交换前台缓存和后台缓存的函数是void glutS() ,用它取代显示回调函数中的glFlush()即可。 要用双缓存技术,需要在初始化时就指定,把原来的 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB) 改为glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB)。 #include #include #define DEG_TO_RAD 0.017453 //角度转为

18、弧度的参数,即 2*PI/360 float theta=30.0; //直线和X轴正方向的夹角 float length=200.0; //直线的长度 float x=300.0, y=200.0; //直线的第一个端点 void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 640.0, 0.0, 480.0); } void display (void) {

19、 glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 0.0); glBegin (GL_POLYGON); glVertex2f (x, y); glVertex2f ( x + length*cos(DEG_TO_RAD*theta), y + length*sin(DEG_TO_RAD*theta) ); glVertex2f ( x + length*cos(DEG_TO_RAD* (theta+30) ), y + length*s

20、in(DEG_TO_RAD* (theta+30)) ); glEnd ( ); glutS ( ); //交换前后台缓存 } void idleFunc() { theta += 0.1; if (theta>360) theta -=360; glutPostRedisplay(); //重新调用绘制函数 } void main (int argc, char** argv) { glutInit (&argc, argv); glutInitDisplayMo

21、de (GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition (100, 100); glutInitWindowSize (640, 480); glutCreateWindow ("Draw Triangle with Double Buffer"); init ( ); glutDisplayFunc (display); glutIdleFunc(idleFunc); //

22、指定空闲回调函数 glutMainLoop ( ); } 该程序改用双缓存后,避免的闪烁的发生。 实例2、一个旋转的三角形――用鼠标回调函数实现 假如要把上例改为用鼠标控制三角形的旋转,例如单击鼠标左键一次,三角形顺时针旋转一定角度,单击鼠标右键一次,三角形逆时针旋转一定角度。这时,要借助鼠标操作回调函数来完成。 例如鼠标回调函数是void myMouse(int button, int state, int x, int y),那么该鼠标回调函数在主函数中用glutMouseFunc(myMouse)注册该鼠标回调函数。myMouse

23、可写为: void myMouse(int button, int state, int x, int y) { //按下鼠标左键 if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) theta += 5.0; //按下鼠标右键 if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) theta -= 5.0; if (theta>360) theta -=360; if (theta<0) theta +=360; glutPos

24、tRedisplay(); //重新调用绘制函数 } 实例3、一个旋转的三角形――用键盘回调函数实现 假如要把上例改为用键盘控制三角形的旋转,例如单击键盘a键,三角形顺时针旋转一定角度,单击键盘s键,三角形逆时针旋转一定角度,单击键盘c键,程序退出。这时,要借助键盘回调函数来完成。 例如键盘回调函数是void myKeyboard(unsigned char key, int x, int y),那么该键盘回调函数在主函数中用glutKeyboardFunc( myKeyboard)注册该回调函数。myKeyboard可写为: void myKeyboard(unsigned ch

25、ar key, int x, int y) { if(key == 'a' || key == 'A') theta += 5.0; if(key == 's' || key == 'S') theta -= 5.0; if(key == 'c' || key == 'C') exit(0); if (theta>360) theta -=360; if (theta<0) theta +=360; glutPostRedisplay(); //重新调用绘制函数 } exit(0)表示退出程序,返回到操作系统,该函数在stdlib.h 中

26、定义,所以程序开头加上#include 。 加入要用键盘的一些特殊键来控制,例如F1和左方向键控制顺时针旋转,F2和右方向键控制逆时针旋转,则该代码就必须放到用glutSpecialFunc()注册的一个特殊键回调函数中。例如: void mySpecialKeyboard(int key, int x, int y) { if(key == GLUT_KEY_F1 || key == GLUT_KEY_LEFT) theta += 5.0; if(key == GLUT_KEY_F2 || key == GLUT_KEY_RIGHT) thet

27、a -= 5.0; if (theta>360) theta -=360; if (theta<0) theta +=360; glutPostRedisplay(); //重新调用绘制函数 } 该函数在主函数中注册: glutSpecialFunc( mySpecialKeyboard); 二、编程练习 1、编制一个OpenGL的程序,生成一个600*600大小的窗口,上面绘制一个200*300大小的矩形,用键盘的四个方向键控制矩形朝上下左右进行移动,按c键退出程序。 2、编制一个OpenGL的程序,生成一个600*600大小的窗口,上面用鼠标画线。点击左键生成第一点,再点击左键生成第二点,用这两点画一条直线,然后再点击左键两次,再画另外一条直线。点击右键把屏幕清空。 15 / 15

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服