计算机图形学Opengl实现二维图形的…

来源:互联网 发布:ubuntu crontab 日志 编辑:程序博客网 时间:2024/05/21 13:54

 实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动),请首先读懂代码,再修改代码,实现矩形在窗口内沿着水平线匀速移动。为了实现这类要求,要做的就是将已经给出的旋转的代码块部分修改为平移的实现方法,完成在X轴方向上的水平匀速移动,在这个过程中还学习了不停的正方向和负方向上的匀速循环移动。效果如下图:

 

计算机图形学Opengl实现二维图形的匀速平移

计算机图形学Opengl实现二维图形的匀速平移

【注】代码如下:

#include<windows.h>

#include <GL/glut.h>

#include<GL/glu.h>

#include<GL/gl.h>

#include <stdlib.h>

 

static GLfloat spin -35.0;

static GLint status 1;

 

void display(void)

{

   glClear(GL_COLOR_BUFFER_BIT);

   glPushMatrix();

   //glRotatef(spin, 0.0, 0.0, 1.0);

   glTranslatef(spin, 0.0, 0.0);//注意这里的spin为静态的全局变量

   glColor3f(0.5, 0.5, 0.5);

   glRectf(-10.0, -10.0, 10.0, 10.0);

   glPopMatrix();

 

   glutSwapBuffers();//PS:区别于glFlush();

}

 

void spinDisplay(void)

{

    if (spin >= 30)

        status -1;

    else if(spin<=-35)

        status 1;

   spin += status*0.05;//这一行代码用来控制移动的速度

   glutPostRedisplay();//使spin不停的变换,有些类似一个循环

}

 

void init(void)

{

   glClearColor (0.0, 0.0, 0.0, 0.0);

   glShadeModel (GL_FLAT);

//本行代码表明了颜色为单颜色方式,就是不适用混合色,后一种颜色覆盖前一种设置。

}

 

void reshape(int w, int h)

{

   glViewport (0, 0, (GLsizei) w, (GLsizei) h);//视口的大小的设置

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity();

   glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);//二维裁剪窗口函数

   glMatrixMode(GL_MODELVIEW);

   glLoadIdentity();

}

 

void mouse(int button, int state, int x, int y)//鼠标的左右键按下时的响应事件

{

   switch (button) {

      case GLUT_LEFT_BUTTON:

         if (state == GLUT_DOWN)

            glutIdleFunc(spinDisplay);

         break;

      case GLUT_MIDDLE_BUTTON:

      case GLUT_RIGHT_BUTTON:

         if (state == GLUT_DOWN)

            glutIdleFunc(NULL);

         break;

      default:

         break;

   }

}

 

 

int main(int argc, char** argv)

{

   glutInit(&argc, argv);

   glutInitDisplayMode (GLUT_DOUBLE GLUT_RGB);

   glutInitWindowSize (400, 400);

   glutInitWindowPosition (100, 100);

   glutCreateWindow ("矩形平移效果");

   init ();

   glutDisplayFunc(display);//调用初始化的图形函数

   glutReshapeFunc(reshape);//调用开始变换的图形函数

   glutMouseFunc(mouse);//调用鼠标的响应函数

   glutMainLoop();

   return 0;   

}

原创粉丝点击