这个过剩的球体不会旋转,为什么?使用 Visual C++ 2010

this glut sphere won't spin, why? using Visual c++ 2010

本文关键字:为什么 使用 Visual 2010 C++ 旋转      更新时间:2023-10-16

这是我正在使用的完整代码。球体不会像我期望的那样旋转。通常我用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 <<角度"来看,glut 只调用显示函数一次。我正在使用带有 GLUT

有几个选项:

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

或者,您可以将其设置为尽可能频繁地自动调用显示器,方法是将其设置为带有glutIdleFunc的空闲功能,如此处所述。

如果你要使用 Idle Func,我绝对建议您创建一个函数,例如 gameUpdatesimulationUpdate 来操纵角度,然后调用glutPostRedisplay以便可以渲染更改。

将其添加到主

glutIdleFunc( display );

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

事实上,球体正在正确旋转。但是,GLUT 尽可能少地调用显示函数:仅当窗口更改时才会调用它。

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

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

在您的主要功能中:

glutIdleFunc(idle);