GLUT常用函数介绍
stephenxjc_千年一笑
2010-7-29
对象:GLUT的入门级(初学者)
关键字:GLUT、函数
核心内容:主要是通过在一个具体的程序中函数的作用
平台:visual studio2008,需要配置好OpenGL32.lib、GLu32.lib、GlAux.Lib、glut32.lib和相应的dll文件。
正文
简单的一个主函数:
#include <windows.h> #include <GL\glut.h> #include <gl\glaux.h> #include <stdlib.h> #include <stdio.h> #include <math.h> /************************************************************************/ /* 主函数 */ /************************************************************************/ int main(int argc,char** argv) { /******************* 初始化窗口**************************************/ //初始化glut库,如果失败,程序退出 glutInit(&argc,argv); //初始化显示模式,这里声明采用双缓存并采用RGB的颜色模式 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); //初始化窗口的位置,以左上角为原点、向左为x轴正方向,向下为y轴方向 glutInitWindowPosition(50,100); //创建一个大小为*640(像素)的窗口 glutInitWindowSize(640,640); //创建一个窗口,并设定窗口的标题为“An Example of OpenGL Program” glutCreateWindow("An Example of OpenGL Program");
//用于初始化的一个函数,主要是对opengl中的一些参数进行设定 init();
/*********************设定响应函数********************************/ //设定键盘响应函数 glutKeyboardFunc(pressKeyboard); //设定特殊的键盘响应函数 glutSpecialFunc(specialKey); //设定鼠标点击响应函数 glutMouseFunc(pickTarget); //设定鼠标移动响应函数 glutMotionFunc(mouseMotion); //显示输出函数。主要是opengl的绘制 glutDisplayFunc(display); //调整窗口大小变化时的响应函数 glutReshapeFunc(reshape);
/*********************循环等待********************************/ //进入循环,等待输入,触发相应的响应 glutMainLoop(); return 0; } |
以上主函数里包含了常用的glut中的函数。其中,glutInit(),glutInitWindowPosition(),glutInitWindowSize() ,glutCreateWindow()等函数比较简单,程序中的介绍已经足够。下面重点介绍其它函数。
初始化显示模式。这里主要采用RGB模式显示,并采用双缓存模式。双缓存模式相对的是单缓存,双缓存是现在后台缓存绘制,在绘制完成后,将后台与前台缓存交换,后台变前台,前台变后台,达到快速输出的效果。而单缓存,在绘制时就在唯一缓存中绘制,当绘制时间比较长时,会使屏幕比较卡。
设定键盘响应函数为pressKeyboard,函数的结构为:
/************************************************************************/ /* 按键响应 */ /************************************************************************/ void pressKeyboard(unsigned char key, int x,int y){ switch(key){ case 'r'://按键'r',经角度增加度。 spin = (spin+30)%360; break; case 't'://按键't',修改textureNum的值 //采用组合键Alt if (glutGetModifiers()==GLUT_ACTIVE_ALT) { textureNum+=2; if (textureNum>=6) { textureNum=0; } break; } else{ textureNum-=2; if (textureNum<0) { textureNum=4; } break; } default: break; } //刷新屏幕 glutPostRedisplay(); } |
其中,key为返回的按键的ASCII编码,x和y为鼠标的当前的位置。
对于组合键,可以通过glutGetModifiers(),获取按下当前的组合键,返回值如下:
值 |
意义 |
GLUT_ACTIVE_ALT |
Alt被按下 |
GLUT_ACTIVE_CTRL |
Ctrl被按下 |
GLUT_ACTIVE_SHIFT |
Shift或Caps Lock被按下 |
注意:对于组合键,glut不支持多个组合键。如Ctrl+Alt+t并不会响应
实际也是针对按键响应,但与glutKeyBoardFunc相比,前者针对的是一些特殊的按键。包括:
GLUT_KEY_F1,GLUT_KEY_F2,GLUT_KEY_F3,GLUT_KEY_F4,GLUT_KEY_F5,GLUT_KEY_F6,GLUT_KEY_F7,
GLUT_KEY_F8,GLUT_KEY_F9,GLUT_KEY_F10,GLUT_KEY_F11,GLUT_KEY_F12,GLUT_KEY_LEFT,
GLUT_KEY_UP,GLUT_KEY_RIGHT,GLUT_KEY_DOWN,GLUT_KEY_PAGE_UP,GLUT_KEY_PAGE_DOWN,
GLUT_KEY_HOME,GLUT_KEY_END,GLUT_KEY_INSERT。函数结构与glutKeyBoardFunc相同。
鼠标点击响应。pickTarget函数结构如下:
/************************************************************************/ /* 鼠标点击,选择物体 */ /************************************************************************/ void pickTarget(int button, int state,int x,int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { //左键单击响应 } else { } break; case GLUT_RIGHT_BUTTON: break; default: break } glutPostRedisplay(); } |
参数意义如下:
参数 |
意义 |
x,y |
鼠标的屏幕位置 |
button |
GLUT_LEFT_BUTTON鼠标左键 GLUT_RIGHT_BUTTON鼠标右键 GLUT_MIDDLE_BUTTON鼠标的滚轮键 |
state |
GLUT_DOWN鼠标键按下 GLUT_UP鼠标键抬起 |
按住鼠标移动。mouseMotion的函数结构如下:void mouseMotion(int x,int y){}。xy为鼠标的屏幕坐标。
在鼠标拖动过程中,与前一刻的鼠标坐标相比较,就可以比较快得到鼠标的运动情况(如鼠标的运动方向)
display主要是显示输出函数,需要与opengl结合,这里不仔细讲,可以参看opengl的一些绘制函数示例。这里给出一个示例,结构如下:
/************************************************************************/ /* 输出显示 */ /************************************************************************/ void display(void) { //将缓存清空,以便绘制新的图像,类似清屏操作 glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //修改为模型矩阵,并将 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //绘制物体 drawTargets(GL_RENDER); //利用双缓存,执行绘制 glutSwapBuffers(); } |
对于窗口调整时,需要进行的操作。通常在opengl里,需要进行一些投影变换和视口变换。这里对于具体什么事投影变换和视口变换不介绍,可以查看《opengl编程指南》这本书。
这里只给出一个示例:
/************************************************************************/ /* 大小调整时,修改视野和投影 */ /************************************************************************/ void reshape(int w,int h) { //设定视口变换 glViewport(0, 0, (GLsizei) w, (GLsizei) h); //矩阵模式设为投影,并设定视野范围 glMatrixMode(GL_PROJECTION);//GL_TEXTURE GL_MODELVIEW glLoadIdentity(); glOrtho(-8,8,-8,8,0,100); //将模式修改为模型矩阵 glMatrixMode(GL_MODELVIEW); } |
在程序中调用一次,使程序能够进入循环,等待输入。
通常,有外界输入,为了使屏幕能够有相应的响应变化,需要调用该函数,重新绘制,显示输出。
附件当中是文章的docx版本,并附上利用glut和opengl编写的茶壶示例