-1

这是我正在使用的完整代码。球体不会像我期望的那样旋转。通常我用 Java 编程,所以也许这是我的 c++ 编程而不是 GLUT。

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <iostream>
using namespace std;

static float angle = 0;

void init(void) 
{
   GLfloat mat_specular[] = { 1.0, .5f, .5f, .5f };
   GLfloat mat_shininess[] = { 15.0 };
   GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);

   glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
   glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
   glLightfv(GL_LIGHT0, GL_POSITION, light_position);

   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
}

void display(void)
{

   cout << angle;
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glPushMatrix();
   glRotatef(90, 1, 0, 0);  
   glRotatef(angle, 0, 0, 1);
   glutSolidSphere (.5, 24, 24);
   glPopMatrix();   
   glFlush ();
   angle += 1;
   glutSwapBuffers();

}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity();


   glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);

   glutMainLoop();
   return 0;
}

从我的调试行 'cout << angle;' 看来 那个 glut 只调用一次显示函数。我正在使用带有 GLUT 的 Microsoft Visual C++ 2010

4

3 回答 3

0

将此添加到主

glutIdleFunc( display );

告诉 glut 在程序处于空闲状态时调用您的显示函数。

于 2012-11-14T00:04:51.750 回答
0

有几个选项:

您可以手动调用glutPostRedisplay以要求主循环再次调用您的显示函数,如此所述。

glutIdleFunc或者,您可以通过将其设置为空闲函数,将其设置为尽可能频繁地自动调用您的显示器,如此所述。

如果您要使用 Idle Func,我绝对建议您创建一个函数,例如gameUpdatesimulationUpdate在其中操纵角度然后调用glutPostRedisplay,以便可以呈现更改。

于 2012-11-14T00:09:19.067 回答
0

事实上,球体正在正确旋转。然而,GLUT 尽可能少地调用显示函数:只有在窗口发生变化时才会调用它。

要解决这个问题,您应该使用空闲功能。空闲函数是由 GLUT 连续调用的函数。您可以执行以下操作:

void idle() {
  angle += 1;
  glutPostRedisplay();
}

在你的主要功能中:

glutIdleFunc(idle);
于 2012-11-14T00:09:44.200 回答