} glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(600, 600); glutInitWindowPosition(50, 50); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(spinDisplay); glutMainLoop(); return 0; 2,采用opengl材质、光照技术完成一个在小盒内的运动小球,要求小球作为移动光源,观察运行效果。 代码:staticint spin = 0; void init(void) { } void display(void) { glPushMatrix(); // 光源与WireCube模型 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 效果和glTranslatef (0.0, GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 }; glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); //这里使用了LIGHT0的默认值 0.0, -5.0);一样 } glRotated((GLdouble)spin, 1.0, 0.0, 0.0); //同时旋转光源以及WireCube glLightfv(GL_LIGHT0, GL_POSITION, position); //光源是几何物体,通过ModelView变换可以移动旋转它 glTranslated(0.0, 0.0, 1.5); glDisable(GL_LIGHTING); glColor3f(0.0, 1.0, 1.0); glutSolidSphere(0.1, 40, 40);// WireCube模拟代表光源的位置 glEnable(GL_LIGHTING); glPopMatrix(); glutSolidTorus(0.28,1.5 , 8, 60); glPopMatrix(); glFlush(); void reshape(intw, inth) { } void mouse(intbutton, intstate, intx, inty) { switch (button) { caseGLUT_LEFT_BUTTON: } if (state == GLUT_DOWN) { } break; break; spin = (spin + 5) % 360; glutPostRedisplay(); glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); default: } void Idle() { } void keyboard(unsignedcharkey, intx, inty) { } 圆环代替箱子,小球上下运动作为光源 switch (key) { case 27: } exit(0); break; spin = (spin + 5) % 360; glutPostRedisplay(); Sleep(20); 五、实验分析与讨论 1.了解了简单的动画制作过程; 2.窗口放大之后旋转的速度变慢; 解释:最大化之后因为需要渲染的像素变多了,如果没锁帧的话帧数就会变少,于是就变慢了……就像工作量变多了完成时间要变长一样的。 教师评语: 签名: 日期:
成绩: