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

Posted

技术标签:

【中文标题】在 OpenGL 中使用箭头键移动一些形状 - 它缩小而不是移动【英文标题】:Make some shapes in OpenGL to be moved with arrow keys - it zooms out instead of moving 【发布时间】:2016-05-15 20:14:04 【问题描述】:

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

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

#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;

也许是轴的东西,但不知道我应该改变什么。

有什么帮助吗?

【问题讨论】:

你为什么叫glutSpecialFunc而不是glutKeyboardFunc 【参考方案1】:

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

反正问题就出在这里。

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

【讨论】:

非常感谢!抱歉代码不好,我以老师给我的一些示例为基础。我应用了您描述的更改,并且此举正在发挥作用。只有一个问题:按一些键后,形状在移动,但是从一点开始,形状就变形了,占据了整个屏幕。有什么想法可以解决吗?如果您需要将最终代码复制/粘贴给您,请告诉我。

以上是关于在 OpenGL 中使用箭头键移动一些形状 - 它缩小而不是移动的主要内容,如果未能解决你的问题,请参考以下文章

如何用箭头键使形状移动?

当我在OpenGL中按下一个键时无法绘制形状

在使用 C++ 在 OpenGL 中移动形状时按时间自动旋转形状

Python之OpenGL笔记(22):箭头控制平面直角坐标系中的圆圈移动

尝试使用箭头键和 WASD 同时移动两个对象

在 OpenGL 中移动 3d 形状