void display(void) { 画图 }
void init(void) { 初始化(指定当前矩阵、重置当前矩阵、定义视景...) }
int main(int argc,char **argv) {
1、gultInit(int *argc, char **argv)——对glut初始化,在调用其他任何GLUT函数之前
2、glutInitDisplayMode(unsigned int mode)——指定颜色模式(GLUT_RGBA/颜色索引)和(或)缓冲(GLUT_DOUBLE/GLUT_SINGLE/GLUT_DEPTH...)
3、glutInitWindowPosition(int x,int y)——窗口位置
4、glutInitWindowSize(int width,int size)——大小
5、glutCreateWindow(char *string)——创建窗口 string为名字,在调用glutMainlLoop()之前窗口不显示
6、init()——自己定义的初始化函数
7、glutDisplayFunc(void (*func)(void))——注册回调函数(自己定义),并执行
8、glutMainlLoop()——显示窗口
return 0;
}
用于注册处理输入事件回调函数的函数
1、glutReshapeFunc(void (*func)(int w,int h))——窗口大小改变时的行动
2、glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))——将键盘与函数关联(按下/释放)
3、glutMouseFunc(void (*func)(int button, int state, int x, int y))——将鼠标与函数关联(按下/释放)
4、glutMotionFunc(void (*func)(int x, int y))——按下鼠标一个按钮移动鼠标时的动作
实例:
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
static GLfloat spin=0.0;
void init(void) {
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);//清除缓冲区,GL_COLOR_BUFFER_BIT颜色缓冲;GL_DEPTH_BUFFER_BIT深度缓冲;GL_ACCUM_BUFFER_BIT累积缓冲;GL_STENCIL_BUFFER_BIT模板缓冲
glPushMatrix();//保存当前矩阵
glRotatef(spin,0.0,0.0,1.0);//矩阵旋转,spin为角度,以向量(x,y.z)为轴glTranslatef(x,y,z)在x,y,z上平移,glScalef(x,y,z)将x,y,z轴缩放
glColor3f(1.0,1.0,1.0);
glRectf(-25.0,-25.0,25.0,25.0);//画矩形
glPopMatrix();//弹出所存矩阵
glutSwapBuffers();
}
void spinDisplay(void) {
spin = spin+2.0;
if(spin>360.0)
spin=spin-360.0;
glutPostRedisplay();
}
void reshape(int w, int h) {
glViewport(0,0,(GLsizei)w,(GLsizei)h);//把视景体截取的图像按怎样的宽和高显示
glMatrixMode(GL_PROJECTION);//指定当前矩阵GL_PROJECTION投影矩阵;GL_MODELVIEW模型视景矩阵;GL_TEXTURE纹理矩阵
glLoadIdentity();//重置当前矩阵为单位矩阵
glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);//用什么样的视景截取图像(left,right,button,top,near,far)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button, int state, int x, int y) {
switch (button) {
case GLUT_LEFT_BUTTON:
if(state==GLUT_DOWN)
glutIdleFunc(spinDisplay);//空闲处理
break;
case GLUT_MIDDLE_BUTTON:
if(state==GLUT_DOWN)
glutIdleFunc(NULL);//禁用此函数
break;
default:
break;
}
}
int main(int argc, char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow("mywindow");
init();
glutDisplayFunc(display);//回调函数注册函数
glutReshapeFunc(reshape);//注册函数
glutMouseFunc(mouse);//注册函数
glutMainLoop();
return 0;
}
结果: