2017-06-29 5 views
0

Je veux dessiner un cylindre lorsque j'appuie sur la touche de barre d'espace.Comment dessiner une forme à l'aide de la touche à l'aide de GLUT?

Voici un extrait du code que j'ai en ce moment:

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; 
} 

Cependant, quand je presse la barre d'espace, le cylindre est pas dessiné. Je ne suis pas sûr de ce qu'il faut faire. Lorsque je copie le code que j'ai dans la méthode processKeys et le coller dans la méthode d'affichage , cela fonctionne très bien. Comment suis-je censé le faire?

+0

Je ne pense pas que vous êtes autorisé à tirer de partout, mais la fonction d'affichage. – HolyBlackCat

Répondre

1

Comme le nom de la fonction l'indique, vous dessinez vos objets à l'aide de la fonction display. Donc, pour réaliser ce que vous voulez, créez une variable booléenne (portée globale, par exemple) et utilisez-la pour contrôler si vous voulez ou non dessiner votre cylindre. Exemple:

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(); 
} 
+0

Merci, mais je ne peux dessiner qu'un cylindre en utilisant cette méthode. Comment puis-je créer un tout nouveau avec chaque touche unique? – OldMcDonald

+1

Vous pouvez utiliser un vecteur de transformations, donc après chaque pression, vous ajoutez une nouvelle transformation à ce vecteur et dans la fonction draw, vous intervertissez juste dessus – Amadeus