版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1Angel: Interactive Computer Graphics 5E Addison-Wesley 2009输入与交互2Angel: Interactive Computer Graphics 5E Addison-Wesley 2009基本内容输入设备物理设备逻辑设备输入模式GLUT事件驱动编程鼠标事件键盘事件窗口事件3Angel: Interactive Computer Graphics 5E Addison-Wesley 2009Sketchpad项目Ivan Sutherland (MIT 1963年)建立了刻画交互式计算机图形学的基本框架:用户在显示器上看到一个对象(的
2、图像)用户利用输入设备(光笔、鼠标、跟踪球等)点选该对象对象发生了改变(移动、旋转、变形等)重复上述过程4Angel: Interactive Computer Graphics 5E Addison-Wesley 2009图形输入设备输入设备可以用下述两种属性中的一种进行描述物理属性鼠标、键盘、跟踪球逻辑属性设备通过API返回给程序的内容是什么?位置对象标识符(一个整数值)模式如何以及何时获取输入?请求(主动)或者事件(被动)物理输入设备指向设备:允许用户在屏幕上指定点的位置,有一个或多个按钮用来向计算机发送信号或中断请求键盘设备:几乎总是指键盘,也可泛指任何能向计算机传送字符编码的设备(如
3、,软键盘)5Angel: Interactive Computer Graphics 5E Addison-Wesley 2009指向设备绝对定位绝对定位设备:直接向操作系统返回屏幕位置数据板光笔6Angel: Interactive Computer Graphics 5E Addison-Wesley 2009指向设备相对定位7Angel: Interactive Computer Graphics 5E Addison-Wesley 2009相对定位设备鼠标、跟踪球以及游戏操纵杆等设备向操作系统返回两个正交的速度分量值当鼠标移动时,对两个速度分量进行积分得到x和y方向上的偏移值,加到初始
4、位置上转化为屏幕上某点的位置坐标利用球的位置改变来确定位置,并没有利用球的绝对位置8Angel: Interactive Computer Graphics 5E Addison-Wesley 2009逻辑设备考虑C与C+代码:C+:cinx;C:scanf(”%d”, &x);输入设备是什么?代码中并没有指明可以是键盘、文件、或者其它程序的输出上述代码要求的就是逻辑输入不管物理设备是什么,程序得到一个数(int)作为输入9Angel: Interactive Computer Graphics 5E Addison-Wesley 2009图形逻辑设备相对于非图形程序中的输入通常只是数字、字符
5、或者字节而言,图形输入的形式更多在GKS和PHIGS这两个老的API中,定义了六种类型的逻辑输入:定位(Locator):返回一个位置拾取(Pick):返回对象的标识ID键盘(Keyboard):返回字符串笔划(Stroke):返回一组位置数据定值(Valuator):返回模拟量输入(浮点数)选择(Choice):返回n项中的一项10Angel: Interactive Computer Graphics 5E Addison-Wesley 2009客户-服务器(C-S)结构在X Window系统中引入了适用于工作站网络的客户-服务器模型(C-S模型)客户(Client): OpenGL程序图
6、形服务器(Graphics Server):具有指向设备、键盘和位图(即光栅)显示设备11Angel: Interactive Computer Graphics 5E Addison-Wesley 2009输入模式在输入设备中具有一个触发器(trigger), 它可以向操作系统发送一个信息鼠标上的按钮按下/释放键盘上的键当触发后,输入设备向系统返回相应的测量值(measure)鼠标返回位置信息键盘返回ASCII码两种模式:请求模式和事件模式12Angel: Interactive Computer Graphics 5E Addison-Wesley 2009请求模式(Request Mod
7、e)只有当用户触发了设备后,输入才提供给程序键盘输入为典型例子在按回车键(触发器)之前,可以删除(回退)、编辑、修改输入的信息用户必须指明哪个输入设备提供输入适合程序引导用户的情形,而不适合用户控制程序执行过程13Angel: Interactive Computer Graphics 5E Addison-Wesley 2009事件模式(Event Mode)绝大部分系统具有多个输入设备,每个设备都可能被用户在任意时间触发每个触发生成一个事件,事件的测量值放到事件队列中,用户程序检查该队列,根据事件的类型采用相应的操作(回调函数)14Angel: Interactive Computer G
8、raphics 5E Addison-Wesley 2009事件类型窗口:改变尺寸、重新显示、缩成图标鼠标:点击一个或多个按钮,移动键盘:按下或释放某个键空闲:“没有事件”可以定义如果队列中没有其它事件就可以进行的某种操作15Angel: Interactive Computer Graphics 5E Addison-Wesley 2009回调回调是事件驱动输入方式的程序界面为图形系统可以识别的每种类型事件定义一个回调函数当相应的事件出现时,就会自动执行用户指定的函数GLUT示例glutMouseFunc(mymouse);16Angel: Interactive Computer Grap
9、hics 5E Addison-Wesley 2009GLUT中的回调函数GLUT识别在各种窗口系统(Windows, X, Macintosh)中都有的一组事件glutDisplayFuncglutMouseFuncglutReshapeFuncglutKeyboardFuncglutIdleFuncglutMotionFuncglutPassiveMotionFunc17Angel: Interactive Computer Graphics 5E Addison-Wesley 2009GLUT中的事件循环记住: 在任何利用GLUT的程序中,main()的最后一行实质语句必须是glutMa
10、inLoop();这条语句使得程序进入一个无穷的事件循环每经过事件循环一次,GLUT进行下述操查看事件队列中的事件对于在队列中的每个事件,如果定义了相应的回调函数,GLUT就执行这个回调函数如果对该事件没有定义回调函数,那么就忽略该事件18Angel: Interactive Computer Graphics 5E Addison-Wesley 2009鼠标回调函数glutMouseFunc(mouse)void mouse(int button, int state, int x, int y)其中button的值可能是GLUT_LEFT_BUTTON,GLUT_MIDDLE_BUTTON
11、,GLUT_RIGHT_BUTTON表示哪个按钮导致了事件发生state表示相应按钮的状态:GL_UP, GL_DOWNx, y表示在窗口中的位置19Angel: Interactive Computer Graphics 5E Addison-Wesley 2009定位在屏幕上的位置通常是以像素为单位的,原点在左上角因为显示器自顶向下刷新显示内容在OpenGL中使用的世界坐标系,其原点在左下角在这个坐标系中的y坐标需要从窗口高度中减去回调函数返回的y值:y := h-y20Angel: Interactive Computer Graphics 5E Addison-Wesley 2009获
12、取窗口尺寸为了完成y坐标的转换,需要知道窗口的高度h在程序执行过程中高度可能发生改变需要利用一个全局变量跟踪其变化新高度值返回给形状改变回调函数(见后)也可以用查询函数glGetIntegerv和glGetFloatv获取,因为高度是状态的一部分21Angel: Interactive Computer Graphics 5E Addison-Wesley 2009鼠标结束程序在以前的程序中没有办法通过OpenGL结束当前程序可以利用简单的鼠标回调函数做到这一点void mouse(int btn, int state, int x, int y)if(btn=GLUT_RIGHT_BUTTO
13、N & state = GLUT_DOWN)exit(0);22Angel: Interactive Computer Graphics 5E Addison-Wesley 2009鼠标位置的应用在要构造的例子中,每单击一次鼠标左按钮,就会在当前鼠标位置处画一个小方框在这个例子中并没有用到显示回调函数,但是由于GLUT要求必须有一个显示回调函数,因此要定义一个空函数display() 23Angel: Interactive Computer Graphics 5E Addison-Wesley 2009在指针处画方框void mouse(int btn, int state, int x,
14、int y) if(btn = GLUT_RIGHT_BUTTON & state = GLUT_DOWN) exit(0);if(btn = GLUT_LEFT_BUTTON & state = GLUT_DOWN) drawSquare(x, y);void drawSquare(GLint x, GLint y) y = h-y; /转化y坐标glColor3ub( (char)rand()%256, (char) rand()%256, (char)rand()%256); / 随机颜色glBegin(GL_POLYGON); glVertex2f(x -size, y -size);
15、glVertex2f(x + size, y -size);glVertex2f(x + size, y + size);glVertex2f(x -size, y + size);glEnd(); 24Angel: Interactive Computer Graphics 5E Addison-Wesley 2009鼠标移动回调函数通过利用移动回调函数可以在不释放鼠标按钮的情况下,连续画一系列方框(square.c)glutMotionFunc(drawSquare)应用被动移动回调函数,可以不用按鼠标按钮就可以连续画方框glutPassiveMotionFunc(drawSquare)v
16、oid glutMotionFunc(void (*f)(int x,int y)void glutPassiveMotionFunc(void (*f)(int x,int y)25Angel: Interactive Computer Graphics 5E Addison-Wesley 2009键盘的使用glutKeyboardFunc(keyboard)void keyboard(unsigned char key, int x, int y)返回键盘上被按下键的ASCII码和鼠标位置注意在GLUT中并不把释放按键做为一个事件void keyboard(unsigned char ke
17、y, int x, int y) / 按下Q、q或ESC键时,终止程序if(key = Q | key = q | key = 27) exit(0);26Angel: Interactive Computer Graphics 5E Addison-Wesley 2009特殊按键GLUT在glut.h中定义了特殊按键:功能键1: GLUT_KEY_F1向上方向键:GLUT_KEY_UPvoid glutSpecialFunc(void (*func)(int key, int x, int y)回调函数内if(key = GLUT_KEY_F1)if(key = GLUT_KEY_UP)27
18、Angel: Interactive Computer Graphics 5E Addison-Wesley 2009修饰键Ctrl/Alt/ShiftInt glutGetModifiers()如果在鼠标或键盘事件产生时修饰键被按下,该函数返回GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT的逻辑与结果可以利用单键或双键鼠标模拟三键鼠标让Ctrl+c或Ctrl+C终止程序,在键盘回调函数中if (glutGetModifiers() = GLUT_ACTIVE_CTRL) & (key = c | key = C) exit(0);28
19、Angel: Interactive Computer Graphics 5E Addison-Wesley 2009显示回调函数只要GLUT确定需要刷新窗口,那么就会执行显示回调函数,例如当第一次打开窗口的时候当改变了窗口形状的时候当重新露出了窗口的时候当用户程序决定需要改变显示内容的时候在main()中,glutDisplayFunc(display)注册要执行的显示回调函数display每个GLUT程序都必须有一个显示回调函数,必要时可以设置为空函数29Angel: Interactive Computer Graphics 5E Addison-Wesley 2009标识重新显示许多事件都会导致调用显示回调函数,这会导致遍历一次事件循环的过程中多次执行显示回调函数可以用下列方法避免这个问题glutPostRedisplay();这条语句设
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度楼梯工程环保验收合同2篇
- 二零二四年度工程建设项目分包合同(桥梁段)
- 2024年商业房产租赁协议范本版B版
- 2024年度企业招聘与人才租赁合同3篇
- 2024年企业信息化建设咨询合同
- 2024年度河流整治树木清运合同2篇
- 2024年度IT支持与维护服务合同2篇
- 2024年xx行业数据保密合同示范文本版B版
- 2024年废弃物处理服务合同
- 2024年夫妻房产赠与合同书模板版B版
- 网络安全基础课件
- 压力容器质量安全风险管控清单(压力容器设计单位)
- 健身指导知识考试题库及答案(500题)
- 1例肺癌终末期患者伴有癌性伤口的个案护理
- 液冷数据中心白皮书 2023:数据中心液冷革命解锁未来的数字冰河
- 幼儿园优质公开课:大班综合《谁知盘中餐》有声动态课件
- 《斯蒂芬·库里》课件
- 英语读写1智慧树知到课后章节答案2023年下鲁东大学
- 小学语文-《日月明》教学设计学情分析教材分析课后反思
- 合同(塑胶跑道)
- 五年级语文上册情境题期中自测-2023-2024学年新课标(统编版)
评论
0/150
提交评论