第3章图形学 输入及交互.pptVIP

  • 16
  • 0
  • 约9.12千字
  • 约 66页
  • 2018-06-27 发布于湖北
  • 举报
第3章图形学 输入及交互

显示列表中的状态 绝大多数OpenGL函数都可以放在显示列 表中 ?? 在显示列表中发生的状态改变在列表执行 结束后仍然起作用 ?? 可以通过刚进入显示列表时调用 glPushAttrib和glPushMatrix,执 行结束之前调用glPopAttrib和 glPopMatrix避免这个问题 层次体系与显示列表 考虑一个汽车模型 ? 为底盘创建显示列表 ? 为车轮创建显示列表 glNewList(CAR, GL_COMPILE); glCallList(CHASSIS); glTranslatef(…); glCallList(WHEEL); glTranslatef(…); glCallList(WHEEL); …… elEndList(); 鼠标移动回调函数的应用 通过利用移动回调函数可以在不释放鼠标 按钮的情况下,连续画一系列方框 (square.c) ?glutMotionFunc(drawSquare) ???? 应用被动移动回调函数,可以不用按鼠标 按钮就可以连续画方框 ?glutPassiveMotionFunc(drawSquare) 键盘的应用 glutKeyboardFunc(mykey) ?? void mykey(GLubyte key, GLint x, GLint y) ?返回键盘上被按下键的ASCII码和鼠标位置 ?注意在GLUT中并不把释放键做为一个事件 void mykey(GLubyte key, GLint x, GLint y) { if(key == ‘Q’ | key == ‘q’) exit(0); } 特殊按键 GLUT在glut.h中定义了特殊按键: ? 功能键1: GLUT_KEY_F1 ? 向上方向键:GLUT_KEY_UP ?if(key == GLUT_KEY_F1) …… ?? 其它键 ?可以利用glutGetModifiers(…)探测是否按下了 GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT ?由此可以利用单钮或双钮鼠标模拟三钮鼠标 窗口形状的改变 通过拖动窗口的角点可以改变窗口的形状 和尺寸 ?? 那么其中的显示内容该如何处理? ? 必须由应用程序重新绘制 ? 有两种可能性 ? 显示原来内容的一部分 ? 通过强迫适应新窗口来显示所有内容 ? 可能会改变了显示长宽比率 形状改变的可能性 形状改变的回调函数 glutReshapeFunc(myreshape) ?? void myreshape(GLint w, GLint h) ?返回新窗口以像素为单位的宽度与高度 ?在回调函数执行后自动发送重新显示的事件 ?GLUT有一个缺省的形状改变的回调函数,但用户可能 需要定义自己的行为 ?? 这个回调函数是放置照相机函数的恰当地方, 因为当窗口第一次被打开时就会调用这个函数 例子 在下面的例子中通过改变窗和世界窗口使得长宽比率不变 void myreshape(GLint w, GLint h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); /*switch matrix mode */ glLoadIdentity(); if(w=h) gluOrtho2D(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D(-2.0*(GLfloat)w/(GLfloat)h, 2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0); glMatrixMode(GL_MODELVIEW); /*return to modelview mode*/ } 窗口资源 许多窗口系统提供了一个工具包或者一组库函 数用来建立用户界面,界面中用到了一些特殊 类型的窗口,称为资源构件(widget) ?? 构件集合中包含下述工具: ? 菜单 ? 滑动条 ? 对话框 ? 输入文本框 ?? 但上述构件通常都是与平台相关的 ?? GLUT只提供了包含菜单在内的很少几个构件 菜单 GLUT支持弹出式菜单 ? 可以有子菜单 ?? 创建弹出式菜单的三个步骤 ? 定义菜单内各条目 ? 定义每个菜单项的行为 ? 如果条目被选择执行的操作 ? 把菜单连接到鼠标按钮上 定义一个简单菜单 在main()中 menu_id = glutCreateMenu(mymenu); glutAddMenuEntry(“Clear Screen”, 1); glutAddMenuEntry(“Exit”, 2); glutAttachMenu(GLUT_RIGHT_BUTTON

文档评论(0)

1亿VIP精品文档

相关文档