1. 程式人生 > >計算機圖形學Opengl實現二維圖形的…

計算機圖形學Opengl實現二維圖形的…

 實現了一個矩形在視窗中勻速轉動(單擊滑鼠右鍵停止轉動),請首先讀懂程式碼,再修改程式碼,實現矩形在視窗內沿著水平線勻速移動。為了實現這類要求,要做的就是將已經給出的旋轉的程式碼塊部分修改為平移的實現方法,完成在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;   

}