输入与交互.pptVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
输入与交互

计算机图形学 杨 武 影像科学与技术实验室 东南大学计算机学院 yangwu@seu.edu.cn * 第三章 输入与交互 * 第三章之第一节 简 介 * 基本内容 常见的输入设备 物理设备 逻辑设备 输入模式 事件驱动的输入 光滑动画中的双缓存 用GLUT进行事件输入编程 * Sketchpad 项目 Ivan Sutherland (MIT 1963) 建立了刻画交互式计算机图形学的基本交互框架: 用户在显示器上看到一个对象 用户利用输入设备(光笔、鼠标、跟踪球等)点选该对象 对象发生了改变(移动、旋转、变形等) 重复上述过程 * 图形输入设备 输入设备可以用下述两种属性中的一种进行描述 物理属性 鼠标 键盘 跟踪球 逻辑属性 设备通过API返回给程序的内容是什么? 位置 对象标识 * 物理设备 mouse trackball light pen data tablet joy stick space ball * 输入值 数据板等类似设备直接向操作系统返回位置 类似于鼠标、跟踪球以及游戏操纵杆等设备向操作系统返回一个步进输入(即速度) 必须把这些输入累加在一起得到一个绝对位置 鼠标滚轮的旋转 跟踪球的滚动 难以得到绝对位置 输入可能相当敏感 * 逻辑设备 考虑 C与 C++ 代码 C++: cin x; C: scanf (“%d”, x); 输入设备是什么? 键盘、文件、… 不管物理设备是什么,程序得到一个数(int)作为输入 * 图形逻辑设备 在GKS和PHIGS中,定义了六种逻辑输入: 定位: 返回一个位置 拾取:返回对象的标识ID 字符串: 返回字符串 笔划: 返回位置数组 定值: 返回浮点数 选择: 返回n项中的一项 * 输入模式 如何以及何时获取输入? 触发器(trigger) 向操作系统发送一个信息 鼠标上的按钮、键盘上的键 测量值 当触发后,输入设备向系统返回信息 鼠标返回位置信息 键盘返回ASCII代码 请求(主动)或者事件(被动) * 请求模式 只有当用户触发了设备后,输入才提供给程序 典型例子:键盘输入 * 采样模式 程序需要输入函数调用时,输入设备立刻返回测量值 要求之前已经将输入数据存入缓存 * 事件模式 绝大部分系统具有多个输入设备,每个设备都可能被用户在任意时间触发 每个触发生成一个事件,事件的测量值放到事件队列中,用户程序检查该队列 * 事件类型 窗口:改变尺寸、重新显示、缩成图标 鼠标:点击一个或多个按钮,移动 键盘:按下或释放某个键 空闲:“没有事件” 可以定义如果队列中没有其它事件就可以进行的某种操作 * 回调 回调是事件驱动输入方式的程序界面 为图形系统可以识别的每种类型事件定义一个回调函数 当相应的事件出现时,就会自动执行用户指定的函数 GLUT示例: glutMouseFunc(mymouse) 鼠标回调函数 * GLUT 中的回调函数 GLUT识别在各种窗口系统(Windows, X,Macintosh)中都有的一组事件 glutDisplayFunc glutMouseFunc glutReshapeFunc glutKeyboardFunc glutIdleFunc glutMotionFunc, glutPassiveMotionFunc * GLUT 中的事件循环 记住: 在任何利用GLUT的程序中,main()的最后一行实质语句必须是 glutMainLoop(); 这条语句使得程序进入一个无穷的事件循环 每经过事件循环一次,GLUT进行下述操作 查看事件队列中的事件 对于在队列中的每个事件,如果定义了相应的回调函数,GLUT就执行这个回调函数 如果对该事件没有定义回调函数,那么就忽略该事件 * 显示回调函数 只要GLUT确定需要刷新窗口,那么就会执行显示回调函数,例如 第一次打开窗口 窗口形状改变 重新露出窗口 用户程序决定需要改变显示内容 在 main()中 glutDisplayFunc(mydisplay) 确定要执行的显示回调函数 每个GLUT程序都必须有一个显示回调函数,必要时可以设置为空函数 * 标识重新显示 许多事件都会导致调用显示回调函数 这会导致遍历一次事件循环的过程中多次执行显示回调函数 可以用下列方法避免这个问题 glutPostRedisplay(); 这条语句设置一个标志 当事件循环结束时,GLUT会检查是否设置了上述标志 如果设置了标志,那么就会执行显示回调函数 * 空闲回调的应用 当在事件队列中没有事件时,就执行该回调函数 glutIdleFunc(myidle) 动画中非常有用 void myidle() { /* c

文档评论(0)

118books + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档