OpenGL 的键盘控制 1、特殊键的按键消息 2、普通键的按键消息
键盘控制: GLUT允许编写程序时,在里面加入键盘输入控制,包括了普通键,和其他特殊键(如F1,UP)。在这一章里我们将学习如何去检测哪个键被按下,可以从GLUT里得到些什么信息,和如何处理键盘输入。
键盘控制: 处理按键消息,必须使用GLUT通知窗口系统,当某个键被按下时,哪个函数将完成所要求的操作。同样是调用一个函数注册相关的回调函数。
1、普通按键消息: 当按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调。 一个是glutKeyboardFunc。这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。 普通键是指字母,数字,和其他可以用ASCII代码表示的键。 函数原型如下: void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y)); 参数: func: 处理普通按键消息的函数的名称。如果传递NULL,则表示GLUT忽略普通按键消息。 这个作为glutKeyboardFunc函数参数的函数需要有三个形参。第一个表示按下的键的ASCII码,其余两个提供了,当键按下时当前的鼠标位置。鼠标位置是相对于当前客户窗口的左上角而言的。
2、控制特殊键的按键消息 控制特殊键的按键消息。GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,你能注册你的函数。 函数原型如下: void glutSpecialFunc(void (*func)(int key,int x,int y)); 参数: func: 处理特殊键按下消息的函数的名称。传递NULL则表示GLUT忽略特殊键消息。
实例1:旋转中的茶壶(特殊键的按键消息) Keyboard0
功能:上下左右箭头控制对象的旋转 主要回调函数: glutSpecialFunc 这个函数是控制特殊键的按键消息.GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,能注册函数. 函数原型如下: void glutSpecialFunc(void (*func)(int key,int x,int y)); 参数: func: 处理特殊键按下消息的函数的名称.传递NULL则表示GLUT忽略特殊键消息.
实例1中的:glutSpecialFunc(mySpecial); void mySpecial (int k,int x,int y) { switch(k) case GLUT_KEY_UP: viewRotateX+=1.0; break; case GLUT_KEY_DOWN: viewRotateX-=1.0; case GLUT_KEY_LEFT: viewRotateY+=1.0; case GLUT_KEY_RIGHT: viewRotateY-=1.0; default: return; } // printf("viewRotateX:%6.3f,viewRotateY:%6.3f\n",viewRotateX,viewRotateY); glutPostRedisplay(); Keyboard0
实例2:键盘控制旋转、放大、缩小及退出。 Z,z控制Z轴;D,d控制大小;;Esc控制退出 Keyboard1
功能:(普通按键)键盘控制旋转、放大、缩小及退出 主要回调函数: glutKeyboardFunc 按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调.其中一个是glutKeyboardFunc.这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息. 普通键是指字母,数字,和其他可以用ASCII代码表示的键. 函数原型如下: void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y)); 参数: func: 处理普通按键消息的函数的名称.如果传递NULL,则表示GLUT忽略普通按键消息. 这个作为glutKeyboardFunc函数参数的函数需要有三个形参.第一个表示按下的键的ASCII码,其余两个提供了,当键按下时当前的鼠标位置.鼠标位置是相对于当前客户窗口的左上角而言的.
实例1中的: glutKeyboardFunc(myKeyboard); //Z,z控制Z轴;D,d控制大小;;Esc控制退出 void myKeyboard(unsigned char k,int x,int y) { switch(k) case 'Z': viewRotateZ+=5.0; break; case 'z': viewRotateZ-=5.0; case 'D': viewDist+=1.0; case 'd': viewDist-=1.0;; case 27: exit(0); default: return; } glutPostRedisplay();
在glut.h里已经被预定义为常量。这组常量如下: GLUT_KEY_F1 F1 function key GLUT_KEY_F2 F2 function key GLUT_KEY_F3 F3 function key GLUT_KEY_F4 F4 function key GLUT_KEY_F5 F5 function key GLUT_KEY_F6 F6 function key GLUT_KEY_F7 F7 function key GLUT_KEY_F8 F8 function key GLUT_KEY_F9 F9 function key GLUT_KEY_F10 F10 function key GLUT_KEY_F11 F11 function key GLUT_KEY_F12 F12 function key GLUT_KEY_LEFT Left function key GLUT_KEY_RIGHT Up function key GLUT_KEY_UP Right function key GLUT_KEY_DOWN Down function key GLUT_KEY_PAGE_UP Page Up function key GLUT_KEY_PAGE_DOWN Page Down function key GLUT_KEY_HOME Home function key GLUT_KEY_END End function key GLUT_KEY_INSERT Insert function key
练习1: 程序实现:当一些特殊键按下的时候,改变三角形的颜色。这个函数使在按下F1键时三角形为红色,按下F2键时为绿色,按下F3键时为蓝色。 Keyboard4
练习2: 程序实现:当一些普通键按下的时候,改变茶壶的颜色。这个函数使在按下R键时茶壶为红色,按下G键时为绿色,按下B键时为蓝色。 Keyboard3