c - 如何在 OpenGL 和 GLUT 中制作由按键触发的旋转动画?

标签 c opengl glut

我想使用 C 中的 GLUT 在 OpenGL 中旋转一个简单的立方体。当我按下某个键时,就会发生旋转。

如果我使用glRotatef(angle, 0.0f, 1.0f, 0.0f),立方体将立即旋转,而无需动画。我想慢慢地旋转它,这样大约需要 2 秒才能完成旋转。

最佳答案

创建一个切换 bool 值的键盘回调和一个更新角度的计时器回调:

#include <GL/glut.h>

char spin = 0;
void keyboard( unsigned char key, int x, int y )
{
    if( key == ' ' )
    {
        spin = !spin;
    }
}

float angle = 0;
void timer( int value )
{
    if( spin )
    {
        angle += 3;
    }

    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

void display()
{
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 45, w / h, 0.1, 10 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt( 2, 2, 2, 0, 0, 0, 0, 0, 1 );

    glColor3ub( 255, 0, 0 );
    glRotatef( angle, 0, 0, 1 );
    glutWireCube( 1 );

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}

关于c - 如何在 OpenGL 和 GLUT 中制作由按键触发的旋转动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396485/

相关文章:

c++ - 如何在 GLUT 上加载 bmp 以将其用作纹理?

C - switch 语句中作为 case 的函数参数

javascript - 从 Maya 场景到 WebGL 动画,从哪里开始?

c++ - 调用 glDrawElements 导致访问冲突

python - 使用不同的显示opengl

c++ - OpenGL (glut) - 提高像素放置精度

c - 过剩/OpenGL : how to bind array of coordinates to mesh object to traslate/rotate them

c - 如何从动态字符串中删除换行符

c - 应该在每次 fclose 之后使用 fsync 吗?

c - 如何使用函数将字符串添加到结构中?