旋转矩形例程 from OpenGL红宝书
#include "stdafx.h"
#include <GL/glut.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);
glPushMatrix();//矩阵堆栈的压入
glRotatef(spin,0.0,0.0,1.0);
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(); //标记当前窗口需要重新绘制,通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板
}
void reshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);//设置视口,视窗的大小,就好像我们的眼睛,glut的内核将向这个函数传递2个参数:width和height
glMatrixMode(GL_PROJECTION);//glMatrixMode 指明哪一个矩阵为当前矩阵。
//GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。
glLoadIdentity();//将当前矩阵置换为单位矩阵。
glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);//GL_MODELVIEW指明模型视景矩阵。
glLoadIdentity();//标记当前窗口需要重新绘制··
}
void mouse(int button,int state,int x,int y)
{
switch (button)
{
case GLUT_LEFT_BUTTON: //相当于“如果鼠标左键被按下或者被放开
if (state == GLUT_DOWN) //相当于“如果某个鼠标键被按下,相对应的就是GLUT_UP
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(argv [0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);//标示当窗口的大小发生改变时应该采取什么行动
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}