如何在OpenGL和GLUT中为键触发的旋转设置动画?

我想在C中使用GLUT在OpenGL中旋转一个简单的立方体。当我按下一个键时会发生旋转。

如果我使用glRotatef(angle, 0.0f, 1.0f, 0.0f) ,立方体将立即旋转而不需要动画。 我想慢慢旋转它,所以完成旋转大约需要2秒钟。

创建一个键盘回调,切换bool和更新角度的计时器回调:

 #include  char spin = 0; void keyboard( unsigned char key, int x, int y ) { if( key == ' ' ) { spin = !spin; } } float angle = 0; void timer( int value ) { if( spin ) { angle += 3; } glutTimerFunc( 16, timer, 0 ); glutPostRedisplay(); } void display() { double w = glutGet( GLUT_WINDOW_WIDTH ); double h = glutGet( GLUT_WINDOW_HEIGHT ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45, w / h, 0.1, 10 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); gluLookAt( 2, 2, 2, 0, 0, 0, 0, 0, 1 ); glColor3ub( 255, 0, 0 ); glRotatef( angle, 0, 0, 1 ); glutWireCube( 1 ); glutSwapBuffers(); } int main( int argc, char **argv ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE ); glutInitWindowSize( 640, 480 ); glutCreateWindow( "GLUT" ); glutDisplayFunc( display ); glutKeyboardFunc( keyboard ); glutTimerFunc( 0, timer, 0 ); glutMainLoop(); return 0; }