简单一个opengl程序,2D图形移动

很早打算系统的学习一下opengl,但是由于课程以及学习算法占据了时间,一直没能开始,,现在这段时间开始弄opengl了,这几天看正在看《Opengl 变成指南 第8版》,首先看了GLSL写shader。这里先使用固定管线写个简单的小例子试试,然后开始进行可编程管线。

这个小例子很简单,就是在2D平面画个正方形,然后左右移动。

思路很简单,主要是两个函数,draw 和 move,draw负责绘制,move负责移动的控制,然后设置两个回调函数,glutDisplayFunc和glutIdleFunc,这样在空闲的时候就会调用move函数,设置移动信息,然后发送一个重新显示的信号,这样就能回调draw函数进行在移动后的新位置重新绘制。

#include <gl/glew.h>#include <gl/glut.h>#include <iostream>#include <cstdlib>using namespace std;GLfloat rtx = 0, rty = 0, rtz = 0;void init(){glLoadIdentity();glClearColor(0.0, 0.0, 0.0, 0.0);}void draw(void){glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();glTranslatef(rtx, rty, rtz);glBegin(GL_QUADS);glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(-0.5f, 0.5f);glColor3f(0.0f, 1.0f, 0.0f);glVertex2f(0.5f, 0.5f);glColor3f(0.0f, 0.0f, 1.0f);glVertex2f(0.5f, -0.5f);glColor3f(0.5f, 0.5f, 0.5f);glVertex2f(-0.5f, -0.5f);glEnd();glPopMatrix();glutSwapBuffers();}void move(){static GLfloat step = 0.0002;if (rtx + step > 0.5 || rtx + step < -0.5)step = -step;rtx += step;glutPostRedisplay();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(100, 100);glutInitWindowSize(300, 300);glutCreateWindow("test");init();glutDisplayFunc(draw);glutIdleFunc(move);glutMainLoop();return 0;}

下面这个例子是glut响应用户键盘输入的小例子,主要就是依据用户按下的方向键来左右上下移动正方形。

#include <gl/glew.h>#include <gl/glut.h>#include <cstdio>#include <cstdlib>using namespace std;GLfloat rtx = 0.0f, rty = 0.0f, rtz = 0.0f;GLfloat step = 0.05;GLfloat exp = 1e-3;void init(){glLoadIdentity();glClearColor(0.0, 0.0, 0.0, 0.0);}void draw(void){glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();printf("%f %f %f\n", rtx, rty, rtz);glTranslatef(rtx, rty, rtz);glBegin(GL_QUADS);glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(-0.5f, 0.5f);glColor3f(0.0f, 1.0f, 0.0f);glVertex2f(0.5f, 0.5f);glColor3f(0.0f, 0.0f, 1.0f);glVertex2f(0.5f, -0.5f);glColor3f(0.5f, 0.5f, 0.5f);glVertex2f(-0.5f, -0.5f);glEnd();glPopMatrix();glutSwapBuffers();}/* special key defined in glut#define GLUT_KEY_F11#define GLUT_KEY_F22#define GLUT_KEY_F33#define GLUT_KEY_F44#define GLUT_KEY_F55#define GLUT_KEY_F66#define GLUT_KEY_F77#define GLUT_KEY_F88#define GLUT_KEY_F99#define GLUT_KEY_F1010#define GLUT_KEY_F1111#define GLUT_KEY_F1212#define GLUT_KEY_LEFT100#define GLUT_KEY_UP101#define GLUT_KEY_RIGHT102#define GLUT_KEY_DOWN103#define GLUT_KEY_PAGE_UP104#define GLUT_KEY_PAGE_DOWN105#define GLUT_KEY_HOME106#define GLUT_KEY_END107#define GLUT_KEY_INSERT108*/void processKeyBoard(int key, int x, int y){switch (key){case GLUT_KEY_LEFT:if (rtx – step > -0.53)rtx -= step;break;case GLUT_KEY_RIGHT:if (rtx + step < 0.53)rtx += step;break;case GLUT_KEY_UP:if (rty + step < 0.53)rty += step;break;case GLUT_KEY_DOWN:if (rty – step > -0.53)rty -= step;break;default:break;}glutPostRedisplay();return;}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(100, 100);glutInitWindowSize(600, 600);glutCreateWindow("test");init();glutDisplayFunc(draw);//glutIdleFunc(move);glutSpecialFunc(processKeyBoard);glutMainLoop();return 0;}

坚硬的城市里没有柔软的爱情,生活不是林黛玉,

简单一个opengl程序,2D图形移动

相关文章:

你感兴趣的文章:

标签云: