1

私はC++で記述し、WindowsでOpenGLを使用しています。立方体を作成し、 「4」または「6」のテンキーを押し
て、y軸を中心に回転させたい(gluLookat()ではなくglRotate3f()を使用) 。
問題は、いずれかのキーを押すと、わずかな回転があり、しばらく停止してから、継続的に回転を開始することです。

glutkeyboardfuncを使用してこれを達成する方法はありますか?

そうでない場合、どのようにそれを達成することができますか?

4

1 に答える 1

1

独自のキー状態マップを維持し、タイマーで再描画をトリガーします。

// g++ main.cpp -o main -lglut -lGL -lGLU && ./main
#include <GL/glut.h>
#include <map>

bool paused = false;
std::map< unsigned char, bool > state;
void keyboard_down( unsigned char key, int x, int y )
{
    if( key == 'p' )
        paused = !paused;

    state[ key ] = true;
}

void keyboard_up( unsigned char key, int x, int y )
{
    state[ key ] = false;
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    double ar = w / h;
    glOrtho( -2 * ar, 2 * ar, -2, 2, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    static float angle = 0;
    if( state[ '6' ] )  angle -= 3;
    if( state[ '4' ] )  angle += 3;
    if( !paused )
        angle += 0.5;

    glPushMatrix();
    glRotatef( angle, 0, 0, 1 );

    glColor3ub( 255, 0, 0 );
    glBegin( GL_QUADS );
    glVertex2i( -1, -1 );
    glVertex2i(  1, -1 );
    glVertex2i(  1,  1 );
    glVertex2i( -1,  1 );
    glEnd();

    glPopMatrix();

    glutSwapBuffers();
}

void timer( int extra )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "Keyboard" );
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard_down );
    glutKeyboardUpFunc( keyboard_up );
    glutTimerFunc( 0, timer, 0 );
    glutIgnoreKeyRepeat( GL_TRUE );
    glutMainLoop();
    return 0;
}
于 2013-02-18T19:59:51.913 に答える