繁体   English   中英

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

[英]How do I draw a shape on key press using GLUT?

当我按下空格键时,我想绘制一个圆柱体。

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

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方法中时,它可以正常工作。 我应该怎么做?

就像函数名称所说的那样,您可以使用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM