对于OpenGL的开发来说,GLUT是一个很方便的辅助库,而且与平台无关。
GLUT的功能包括窗口和菜单的创建和管理,事件处理以及提供了很多绘制3D图形的方法等等。
常用的函数如下:
glutInitWindowSize(int width,int height) 初始化窗口的大小
glutInitWindowPosition(int x,int y) 初始化窗口的坐标
glutCreateWindow(const char* title) 创建窗口
glutDisplayFunc(void (*func)(void)) 屏幕刷新时调用的函数,这个只会在创建窗口,缩放窗口等情况下执行
glutReshapeFunc(void (*func)(void)) 处理窗口大小改变的消息
glutIdleFunc(void (*func)(void)) 系统空闲的时候执行(在拖动窗口,缩放窗口等事件处理的时候不执行)
glutTimerFunc(unsigned int mills,void (*func)(void),int value) 定时器,在mills毫秒后执行,但是只执行一次函数。所以想让他定时执行,需要在函数的结尾重新调用glutTimerFunc。
glutMouseFunc(void (*func)(int button, int state, int x, int y)) 鼠标事件输入,state表示状态,button表示左右按键
glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)) 键盘事件输入,key表示按键的ASCII码
glutMainLoop() 进入GLUT事件循环
下面我们来看一个例子:
#include <gl\glut.h>
float z = 20.0;
float sub = 0.1;
void Render()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5,0.5,0.5);
glLoadIdentity();
gluLookAt(0.0,0.0,z, 0.0,0.0,0.0, 0.0,1.0,0.0);
glScalef(1.0,2.0,1.0);
glutWireCube(1.0);
glFlush();
}
void Update(int value)
{
z -=sub;
if(z < 5.0 || z > 20.0){
sub = -sub;
}
glutPostRedisplay();
glutTimerFunc(20,Update,0);
}
void ReShape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int arg, char** argv){
glutInitWindowSize(600,600);
glutInitWindowPosition(420,150);
glutCreateWindow("My OpenGL Window");
glutDisplayFunc(Render);
glutReshapeFunc(ReShape);
glutTimerFunc(20,Update,0);
glutMainLoop();
}
示例的内容很简单,在glutDisplayFunc中定义绘制的内容,主要是一个线框的立方体。然后通过glutTimerFunc定时器,来不停的更改视图矩阵的相机位置,前进后退。在glutTimerFunc中,通过glutPostRedisplay来刷新绘图。
效果图如下:
另外补充一点,由于原始的GLUT库不被维护,所以大家可以使用freeglut库,内容差不多,有一些补充和修改。
文章评论