移动时从视图中消失的三角形

时间:2011-12-13 08:14:21

标签: glut

我正在编写一个程序,当用户点击鼠标时绘制一个正方形,然后用户可以向上,向下,向左和向右移动它。用户移动对象时的问题是隐藏

任何人都可以帮助我。

这是代码示例

    #include <GL/glut.h>      
    #include<iostream.h>

    #define ORTHO_SCALE 10.

    GLint triangle_vertices[] = {15, 20,30, 20,10, 15};
    GLint triangle_vertices2[] = {50, 70,80, 90,100, 130};

    struct {
        struct {
            struct {
                GLfloat x, y;
            } pos;
            GLfloat rot;
        } triangle;
    } sceneinfo;
    void clearScreen()
    {

            glutSwapBuffers();

        glColor3f (1.0, 1.0, 1.0);

        int ver[]={38,0,1143,0,1143,800,38,1105};
        glPushMatrix();
        glEnableClientState( GL_VERTEX_ARRAY );


        glVertexPointer(2, GL_INT, 0, ver);
        glDrawArrays(GL_QUADS, 0, 4);
        glDisableClientState(GL_VERTEX_ARRAY);
        glPopMatrix();


            glutSwapBuffers();

    }
    void mouse(int btn, int state, int x, int y)
    {
        if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
            exit(0);
        if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
        {   
            glutSwapBuffers();

            glPushMatrix();



            glTranslatef(sceneinfo.triangle.pos.x, sceneinfo.triangle.pos.y, 0);



            glEnableClientState(GL_VERTEX_ARRAY);
            glVertexPointer(2, GL_INT, 0, triangle_vertices2);
            glDrawArrays(GL_TRIANGLES, 0, 3);

            glPopMatrix();

            glutSwapBuffers();
        }

    }
    void display(void);
    void special(int key, int x, int y);
    void init (void)
    {
        glClearColor (1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.

        glMatrixMode (GL_PROJECTION);       // Set projection parameters.

        gluOrtho2D (0.0, 200.0, 0.0, 150.0);
    }
    int main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

        glutCreateWindow("test");

        init();

        glutDisplayFunc(display);
        glutSpecialFunc(special);
        glutMouseFunc(mouse);
        glutMainLoop();

        return 0;
    }

    void display(void)
    {

        glColor3f(0.0, 0.0, 0.0);//set color of object


        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



        glPushMatrix();



        glTranslatef(sceneinfo.triangle.pos.x, sceneinfo.triangle.pos.y, 0.);

        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_INT, 0, triangle_vertices);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glPopMatrix();

        glutSwapBuffers();
    }


    void special(int key, int x, int y)
    {
        switch(key) {
        case GLUT_KEY_LEFT:
            sceneinfo.triangle.pos.x -= 0.2;
            break;
        case GLUT_KEY_RIGHT:
            sceneinfo.triangle.pos.x += 0.2;
            break;
        case GLUT_KEY_UP:
            sceneinfo.triangle.pos.y += 0.2;
            break;
        case GLUT_KEY_DOWN:
            sceneinfo.triangle.pos.y -= 0.2;
            break;
        }

    glutPostRedisplay();


}

1 个答案:

答案 0 :(得分:1)

我没有使用过剩,但我可以看到两个潜在的问题:

  1. 您可能不应该使用mouse()函数。此外,你在这里交换缓冲区两次,这不会产生理想的结果。

  2. 您似乎没有在任何地方初始化sceneinfo,但这会从一开始就影响渲染。

  3. 后续步骤:初始化sceneinfo,以便您知道它包含有效值并从mouse()函数中删除绘图代码。如果你仍然有问题,我会使用调试器(或者在最坏的情况下写入日志)来查看sceneinfo.triangle.pos发生了什么 - 它的增长速度可能比预期的要快得多,具体取决于键盘输入的方式处理。