工程既其他的文件等不再解释,请看前面的文章。
//设置矩形旋转的角度
static GLfloat spin = 0.0f;
//
void spinDisplay(void)
{
spin = spin + 2.0f;
if(spin > 360.0f)
spin = spin - 360.0f;
//刷新界面
glutPostRedisplay();
}
//函数在窗口改变大小的时候被调用,传入参数分别是窗口的长和高
void reshape(int w, int h)
{
//viewport并非必须调用,缺省是屏幕大小,指定需要作业的屏幕大小,不能大于窗口大小。
glViewport(0.0f, 0.0f, (GLsizei)w, (GLsizei)h);
//指定下面矩阵操作函数操作的矩阵。
glMatrixMode(GL_PROJECTION);
//恢复单位矩阵
glLoadIdentity();
//创建一个正交平行的视景体,这个其实gl中坐标的的大小,分别代表x,y,z,每组两个,比如前两个代表x的最大负值和最大正值。
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, -1.0f, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//鼠标事件的回调函数,参数如下:
//button表示鼠标的键,有三个
// GLUT_LEFT_BUTTON
// GLUT_MIDDLE_BUTTON
// GLUT_RIGHT_BUTTON
//state有表示鼠标的事件,是按下还是松开
// GLUT_DOWN
// GLUT_UP
//x 和 y表示鼠标事件发生的坐标,是普通的屏幕坐标,不是opengl中的坐标,既x是从左向右依次变大,从0开始,y是从上到下,从0开始。
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_RIGHT_BUTTON:
if (state == GLUT_DOWN) {
glutIdleFunc(NULL);
}
default:
break;
}
}
void display(void)
{
//使用当前设置的颜色清屏,如果不这么做,你得到的是一个很花,并且没有规律的背景
glClear(GL_COLOR_BUFFER_BIT);
//把当前的矩阵压入堆栈
glPushMatrix();
//对以后的图像都做一个旋转,旋转是绕Z轴整方向,做逆时针做角度为spin的旋转。
glRotatef(spin, 0.0f, 0.0f, 1.0f);
//设置当前的使用的颜色
glColor3f(0.0f, 0.0f, 1.0f);
glRectf(-25.0f, -25.0f, 25.0f, 25.0f);
//恢复矩阵。
glPopMatrix();
//强制把上面的命令都开始执行,使用了GLUT_DOUBLE模式,因此调用glutSwapBuffers
//glFlush();
glutSwapBuffers();
}
void init(void)
{
//指定屏幕清除颜色。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//指定图像的着色方式。
glShadeModel(GL_FLAT);
}
int main (int argc, char * argv[])
{
//glut严格的说不是opengl的一部分,是为了支持使用opengl的程序方便的创建和管理窗口而做的,
//下面是它的初始化工作,一般情况下,我们需要把main函数的argv前面的const修饰词去掉,以减少一个警告
glutInit(&argc, argv);
//初始化窗口的显示模式,使用双缓冲系统,颜色使用rgb,
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
//初始化窗口大小为400*400
glutInitWindowSize(250, 250);
//初始化窗口的为止为x = 100,y = 100
glutInitWindowPosition(100, 100);
//创建标题为test的窗口
glutCreateWindow("test");
//初始化opengl
init();
//设置显示回调函数
glutDisplayFunc(display);
//设置窗口大小变化的时候的回调函数。
glutReshapeFunc(reshape);
//鼠标事件的回调函数。
glutMouseFunc(mouse);
//程序开始运行。
glutMainLoop();
//严格的说,下面这句话不会执行到,只是为了符合iso标准C的格式。
return 0;
}