在 OpenGL 中制作一些形状以使用箭头键移动 - 它缩小而不是移动

Make some shapes in OpenGL to be moved with arrow keys - it zooms out instead of moving

好吧,我在 GLUT 项目中有以下 C 代码(我使用 CodeBlocks)。 它绘制一些 2D 形状(类似于 Robot :p )。

我想用键盘箭头键移动整个绘图形状。我写了以下内容,但由于某种原因,当我按下箭头键时,它似乎缩放 in/out。它不动。

#include <GL/glut.h>

GLuint head_x1=5, head_y1=30, head_x2=15, head_y2=30, head_x3=15,head_y3=40, head_x4=5,head_y4=40;

// shape
GLuint listID;
void MrRobot(GLsizei displayListID)
{
    glNewList(displayListID,GL_COMPILE);

    //Save current colour state
    glPushAttrib(GL_CURRENT_BIT);

    // body
    glColor3f(0.5,0.5,0.5);
    glBegin(GL_POLYGON);
    glVertex2f(0,10);
    glVertex2f(20,10);
    glVertex2f(20,30);
    glVertex2f(0,30);
    glEnd();

    // head
    glColor3f(0,0,1);
    glBegin(GL_POLYGON);
    glVertex2f(head_x1,head_y1);
    glVertex2f(head_x2,head_y2);
    glVertex2f(head_x3,head_y3);
    glVertex2f(head_x4,head_y4);
    glEnd();

    // legs
    glColor3f(1,0,0);
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(10,10);
    glVertex2f(20,0);
    glVertex2f(10,-5);
    glVertex2f(0,0);
    glEnd();

    // right hand
    glColor3f(0,1,0);
    glBegin(GL_TRIANGLES);
    glVertex2f(20,30);
    glVertex2f(30,27.5);
    glVertex2f(20,25);
    glEnd();

    // left hand
    glColor3f(0,1,0);
    glBegin(GL_TRIANGLES);
    glVertex2f(-10,27.5);
    glVertex2f(0,30);
    glVertex2f(0,25);
    glEnd();

    //Recall saved colour state
    glPopAttrib();

    glEndList();
}

void display()
{
    glClearColor(0,0,0,0);

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1,0,0);

    //Defining a modelview transform matrix
    glScalef(0.3,0.3,0.3);

    //Execute the display list (the modelview matrix will be applied)
    glCallList(listID);

    glFlush();
}

void keyboard(unsigned char key,int x, int y)
{
    printf("\nKeyboard event detected. \nCharacter key: %c\nMouse pointer position: x=%d y=%d",key,x,y);

    if (key==GLUT_KEY_UP)
    {
        head_y1++;
        head_y2++;
        head_y3++;
        head_y4++;
    }
    if (key==GLUT_KEY_DOWN)
    {
        head_y1--;
        head_y2--;
        head_y3--;
        head_y4--;
    }
    if (key==GLUT_KEY_LEFT)
    {
        head_x1--;
        head_x2--;
        head_x3--;
        head_x4--;
    }
    if (key==GLUT_KEY_RIGHT)
    {
        head_x1++;
        head_x2++;
        head_x3++;
        head_x4++;
    }

    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitWindowPosition(50,50);
    glutInitWindowSize(800,600);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutCreateWindow("Mr Robot");

    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-5,35,-5,30);

    listID=glGenLists(1);

    MrRobot(listID);

    glutDisplayFunc(display);
    glutSpecialFunc(keyboard);
    glutMainLoop();

    return 0;
}

也许与轴有关,但不知道我应该更改什么。

有什么帮助吗?

嗯,有很多问题。您编写 OpenGL 的方式似乎有点不同。

总之就是问题所在。

  • 之所以缩放,是因为每次调用显示时,您都在调用 glScalef(0.3, 0.3, 0.3); 而没有加载单位矩阵。
  • 此外,当您按下一个键时,增量正在发生,但您甚至没有在 display 函数中调用 MrRobot()。您只在 main 函数
  • 中调用过一次
  • 同样在你调用 display 之前你必须调用 glMatrixMode(GL_MODELVIEW); 否则你所做的所有转换都会影响 GL_PROJECTION 矩阵