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

iostreams の代わりに GLUT のキーボード処理を使用します。

#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 に答える