-1

これは私が使用している完全なコードです。思ったように球が回転しません。通常、私は Java でプログラミングしているので、GLUT ではなく C++ プログラミングである可能性があります。

#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 で Microsoft Visual C++ 2010 を使用しています

4

3 に答える 3

0

いくつかのオプションがあります:

here に記載されているように、手動で呼び出しglutPostRedisplayてメインループに表示関数を再度呼び出すように依頼できます

glutIdleFuncまたは、ここに記載されているように、でアイドル関数として設定することにより、できるだけ頻繁にディスプレイを自動的に呼び出すように設定できます

Idle Func を使用する場合は、角度を操作して THEN を呼び出すgameUpdateなどの関数を作成し、変更をレンダリングできるようにすることをお勧めします。simulationUpdateglutPostRedisplay

于 2012-11-14T00:09:19.067 に答える
0

これをメインに追加

glutIdleFunc( display );

これは、プログラムがアイドル状態のときに表示関数を呼び出すように glut に指示します。

于 2012-11-14T00:04:51.750 に答える
0

実際、球体は適切に回転しています。ただし、GLUT は表示関数をできるだけ少なく呼び出します。ウィンドウが変更された場合にのみ呼び出されます。

これを解決するには、idle 関数を使用する必要があります。アイドル関数は、GLUT によって連続して呼び出される関数です。次のようなことができます:

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

そしてあなたの主な機能で:

glutIdleFunc(idle);
于 2012-11-14T00:09:44.200 に答える