Reputation: 574
I want to draw a cylinder when I press the spacebar key.
This is an excerpt of the code I have right now:
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;
}
However, when I press the spacebar, the cylinder is not drawn. I'm not sure of what to do. When I copy the code I have in the processKeys method and paste it into the display method, it works fine. How am I supposed to do it?
Upvotes: 0
Views: 3197
Reputation: 10655
As the function name says, you draw your objects using display
function. So, in order to achieve what you want, create a boolean variable (global scope, for example) and use it to control if you want or not to draw your cylinder. Example:
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();
}
Upvotes: 1