1

所以我有这个显示立方体的OpenGL程序

gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

它允许用户使用输入沿 x、y 和 z 轴修改/旋转它。现在它看起来工作得很好,但是,一旦根据用户输入显示图像(无论是沿 x、y 或 z 轴旋转),它就会终止。

我怎样才能修改这个程序,以便您可以在不终止的情况下旋转它?如在第一次输入期间仅显示第一次旋转。

或者说简单点,如何让用户实时地沿着 x、y 和 z 轴旋转这个立方体?

//cube.cpp
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
using namespace std;
void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}
void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
   /* viewing transformation  */
      /* Move about the x, y and z axis*/
   cout << "Type x, y or z to rotatate the cube about that respective axis by 5 degrees." << endl;
   char input;
   cin >> input;
   if (input == 'x')
   {
      gluLookAt (5.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   }
   else if (input == 'y')
   {
      gluLookAt (0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   }
   else if (input == 'z')
   {
      gluLookAt (0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   }
   else
   {
      gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   }
     // gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */ 
   glutWireCube (1.0);
   glFlush ();
}
void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}
int main(int argc, char** argv)
{   
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}
4

1 回答 1

3

使用 GLUT 的键盘处理而不是iostreams:

#include <GL/glut.h>

float rx = 0;
float ry = 0;
float rz = 0;
void display()
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
    glTranslatef( 0, 0, -3 );

    glColor3f (1.0, 1.0, 1.0);
    glScalef (1.0, 2.0, 1.0);
    glRotatef( -rx, 1, 0, 0 );
    glRotatef( -ry, 0, 1, 0 );
    glRotatef( -rz, 0, 0, 1 );
    glutWireCube (1.0);

    glutSwapBuffers();
}

void keyboard( unsigned char key, int x, int y )
{
    if( key == 'x' ) rx += 5;
    if( key == 'y' ) ry += 5;
    if( key == 'z' ) rz += 5;
}

void timer( int extra )
{
    // run display() every 16ms or so
    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

int main(int argc, char** argv)
{   
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize (500, 500); 
    glutCreateWindow(argv[0]);

    glShadeModel (GL_FLAT);

    glutDisplayFunc(display); 
    glutKeyboardFunc( keyboard );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
于 2013-04-09T04:02:37.663 回答