题目:在场景中画一个三角形,让这个三角形绕着垂直于它的中心轴不停的自动旋转。
(首先需要使用一个双缓冲区。双缓冲区通过在后一个缓冲区里绘画,并不停交换前后缓冲区(可见缓冲区),来产生平滑的动画,使用双缓冲区可以有效的预防闪烁。)
可以使用定时器来做,当然也可以不使用定时器,可以使用GLUT提供的一个函数:glutIdleFunc.这个函数使另一个函数在程序空闲的时候就会被调用。
#include <GL/glut.h>
#include "stdlib.h"
double angle=0.0;
void Init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
}
void display(void)
{
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(angle,0.0,0.0,1.0);
glBegin(GL_TRIANGLES);
glColor4f(1.0,0.0,0.0,1.0);
glVertex3f(-1.73,-1.0,0.0);
glColor4f(0.0,1.0,0.0,1.0);
glVertex3f(1.73,-1.0,0.0);
glColor4f(0.0,0.0,1.0,1.0);
glVertex3f(0.0,2.0,0.0);
glEnd();
glutSwapBuffers();
angle+=1.0;
glLoadIdentity();
}
void reshape(int w,int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 0.1, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard (unsigned char key, int x, int y)
{
switch(key)
{
case 27: // 按ESC键时退出程序
exit (0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE| GLUT_DEPTH);
glutInitWindowPosition(200, 200);
glutInitWindowSize(300, 300);
glutCreateWindow("OpenGL程序");
Init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(display); // 这里让程序空闲时调用display
glutKeyboardFunc(keyboard);
//glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}