在 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 中使用箭头键移动一些形状 - 它缩小而不是移动的主要内容,如果未能解决你的问题,请参考以下文章
在使用 C++ 在 OpenGL 中移动形状时按时间自动旋转形状