Opengl / Glut键盘输入故障

问题描述 投票:0回答:1

我有一个任务要在屏幕上绘制一个金字塔,然后在按键盘上的'k'键之后旋转。一切正常,除了旋转部分,因为该程序似乎没有注意到我按下该键。代码如下:

void changeSize(int w, int h) {


    if(h == 0)
        h = 1;

    float ratio = w * 1.0 / h;


    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();


    glViewport(0, 0, w, h);

    // Set perspective
    gluPerspective(45.0f ,ratio, 1.0f ,1000.0f);

    // return to the model view matrix mode
    glMatrixMode(GL_MODELVIEW);
}


void renderScene(void) {

    // clear buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // set the camera
    glLoadIdentity();
    gluLookAt(5.0,5.0,5.0,
              0.0,0.0,0.0,
              0.0f,2.0f,0.0f);

// put the geometric transformations here

// put drawing instructions here

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

    glBegin(GL_LINES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-100.0f, 0.0f, 0.0f);
        glVertex3f( 100.0f, 0.0f, 0.0f);

        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(0.0f, -100.0f, 0.0f);
        glVertex3f(0.0f, 100.0f, 0.0f);

        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(0.0f, 0.0f, -100.0f);
        glVertex3f(0.0f, 0.0f, 100.0f);
    glEnd();

    //triangulos da base
    glBegin(GL_TRIANGLES);
        glColor3f(255.0f,255.0f,255.0f);
        glVertex3f(1.0f,0.0f,1.0f);
        glVertex3f(-1.0f,0.0f,-1.0f);
        glVertex3f(-1.0f,0.0f,1.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
        glVertex3f(1.0f,0.0f,1.0f);
        glVertex3f(1.0f,0.0f,-1.0f);
        glVertex3f(-1.0f,0.0f,-1.0f);
    glEnd();

    //triangulos das faces

    glBegin(GL_TRIANGLES);
        glVertex3f(1.0f,0.0f,1.0f);
        glVertex3f(0.0f,2.0f,0.0f);
        glVertex3f(-1.0f,0.0f,1.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
        glVertex3f(1.0f,0.0f,-1.0f);
        glVertex3f(0.0f,2.0f,0.0f);
        glVertex3f(1.0f,0.0f,1.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
        glVertex3f(1.0f,0.0f,-1.0f);
        glVertex3f(0.0f,2.0f,0.0f);
        glVertex3f(-1.0f,0.0f,-1.0f);
    glEnd();

    glBegin(GL_TRIANGLES);
        glVertex3f(-1.0f,0.0f,-1.0f);
        glVertex3f(0.0f,2.0f,0.0f);
        glVertex3f(-1.0f,0.0f,1.0f);
    glEnd();



    // End of frame
    glutSwapBuffers();

}

// write function to process keyboard events

void rotate (unsigned char key, int x, int y) {
    if (key == 'k') 
        glRotatef(45,1.0,1.0,0.0);


        glutPostRedisplay();
}




int main(int argc, char **argv) {

// init GLUT and the window
    glutInit(&argc, argv);
     glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(1200,1200);
glutCreateWindow("CG@DI-UM");

// Required callback registry 
    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);


// put here the registration of the keyboard callbacks
    glutKeyboardFunc(rotate);

//  OpenGL settings
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

// enter GLUT's main cycle
glutMainLoop();

return 0;

}

似乎我的程序甚至都没有注意到我按下键。我尝试只打印被按下的键,而且效果很好,所以我真的在这里迷路了。

opengl glut opengl-compat
1个回答
0
投票

glRotatefrotate中似乎没有任何作用,因为glLoadIdentity()renderScene的开头被调用。实际上,glRotatef会更改当前矩阵,但是在渲染场景(glRotatef)时,renderScene会将glLoadIdentity()加载到当前矩阵。无论如何,对输入事件回调中的当前矩阵进行更改是一种不好的风格。在glLoadIdentity()中渲染场景之前,请更改输入事件中变量的状态和值,并使用变量设置当前模型视图矩阵。

添加全局可变角度:

Identity matrix

更改renderScene中变量的值。例如:

float angle = 0.0f;

并将旋转应用于renderScene中的当前矩阵:

void rotate (unsigned char key, int x, int y) {
    if (key == 'k') 
        angle += 45.0f;
        glutPostRedisplay();
}
© www.soinside.com 2019 - 2024. All rights reserved.