如何使用GLUT在按键上绘制形状?

时间:2017-06-29 14:48:33

标签: c++ opengl glut glew

我想按空格键时画一个圆柱体。

这是我现在所拥有的代码的摘录:

void draw_cylinder(GLfloat radius,
    GLfloat height,
    GLubyte R,
    GLubyte G,
    GLubyte B)
{
    GLfloat x = 0.0;
    GLfloat y = 0.0;
    GLfloat angle = 0.0;
    GLfloat angle_stepsize = 0.1;

    /** Draw the tube */
    glColor3ub(R - 40, G - 40, B - 40);
    glBegin(GL_QUAD_STRIP);
    angle = 0.0;
    while (angle < 2 * 3.141) {
        x = radius * cos(angle);
        y = radius * sin(angle);
        glVertex3f(x, y, height);
        glVertex3f(x, y, 0.0);
        angle = angle + angle_stepsize;
    }
    glVertex3f(radius, 0.0, height);
    glVertex3f(radius, 0.0, 0.0);
    glEnd();

    /** Draw the circle on top of cylinder */
    glColor3ub(R, G, B);
    glBegin(GL_POLYGON);
    angle = 0.0;
    while (angle < 2 * 3.141) {
        x = radius * cos(angle);
        y = radius * sin(angle);
        glVertex3f(x, y, height);
        angle = angle + angle_stepsize;
    }
    glVertex3f(radius, 0.0, height);
    glEnd();
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW); 
}

void reshape(GLsizei width, GLsizei height) {  
    if (height == 0) height = 1;
    GLfloat aspect = (GLfloat)width / (GLfloat)height;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();            
    gluPerspective(35.0f, aspect, 0.1f, 100.0f);
}

void processKeys(unsigned char key, int x, int y) {

    if (key == 32) { // space key
        glLoadIdentity();
        glTranslatef(0.0, -0.4, -5.0);
        glRotatef(-90, 0.4, 0.0, 0.0);
        draw_cylinder(0.3, 1.0, 255, 160, 100);
    }
    glutPostRedisplay();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);            // Initialize GLUT
    glutInitDisplayMode(GLUT_DOUBLE); // Enable double buffered mode
    glutInitWindowSize(640, 480);   // Set the window's initial width & height
    glutInitWindowPosition(50, 50); // Position the window's initial top-left corner

    glutCreateWindow(title);          // Create window with the given title
    glutKeyboardFunc(processKeys);
    glutDisplayFunc(display);       // Register callback handler for window re-paint event
    glutReshapeFunc(reshape);       // Register callback handler for window re-size event
    initGL();                       // Our own OpenGL initialization
    glutMainLoop();                 // Enter the infinite event-processing loop

    return 0;
}

但是,当我按空格键时,不会绘制圆柱体。我不知道该怎么做。当我复制 processKeys 方法中的代码并将其粘贴到 display 方法时,它可以正常工作。 我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

正如函数名称所示,您使用display函数绘制对象。因此,为了实现您想要的,创建一个布尔变量(例如全局范围)并使用它来控制是否要绘制圆柱体。例如:

bool cylinder_draw = false;

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW); 
    if ( cylinder_draw ) {
        glLoadIdentity();
        glTranslatef(0.0, -0.4, -5.0);
        glRotatef(-90, 0.4, 0.0, 0.0);
        draw_cylinder(0.3, 1.0, 255, 160, 100);
    }
}

void processKeys(unsigned char key, int x, int y) {

    if (key == 32) { // space key
        cylinder_draw = true;
    }
    glutPostRedisplay();
}