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

Posted

技术标签:

【中文标题】如何使用 GLUT 在按键上绘制形状?【英文标题】:How do I draw a shape on key press using GLUT? 【发布时间】:2017-06-29 14:48:33 【问题描述】:

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

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

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】:

正如函数名所说,您使用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();

【讨论】:

谢谢,但我只能用这种方法画一个圆柱体。如何每次按键都创建一个全新的? 您可以使用转换向量,因此每次按下后,您都会向该向量添加一个新的转换,并且在绘图功能中,您只需对其进行交互

以上是关于如何使用 GLUT 在按键上绘制形状?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 GLUT 的键盘进行简单的 2D 形状移动

GLUT OpenGL - 仅使用 GL_POINTS 绘制形状

请问C# winform如何实现将一个不规则形状的图片弄成按键?

使用 Haskell 程序在 Mac 上出现 Glut 错误

C++ OpenGL/Glut 无法绘制

在 OpenGL 中绘制多个形状