1. 程式人生 > >計算機圖形學總結(2D)

計算機圖形學總結(2D)

計算機圖形學要用到的主要工具就是:OPENGL

一:圖形程式設計入門

1.視窗的設定

glutInitWindowPosition(int x, int y);//為視窗指定初始位置,視窗左上角在螢幕上的位置為(x,y),如果不寫該函式,預設為(0,0)

glutInitWindowSize(int width, int height); //設定視窗大小,如果不寫該函式,表示視窗的大小為預設大小300*300

glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB); //設定顯示模式;

//GLUT_DOUBLE:雙緩衝(繪製圖形指令在一個緩衝區完成,速度非常快,在繪圖指令完成之後,再通過交換指令把完成的圖形即    顯示在螢幕上,這樣避免了圖形的不完整,同時效率很高)

//GLUT_SINGLE:單緩衝(直接在視窗繪製圖形,效率低,如果電腦慢,會出現閃爍)

//GLUT_DEPTH:視窗使用深度快取

//一般opnegl繪圖都用雙緩衝,單緩衝一般只用於顯示單獨的非動態的圖形。

2.背景色的設定

glClearColor(r,g,b,alpha);//設定背景顏色,此函式放在display()中,並且放在glClear(GL_COLOR_BUFFRT_BIT);語句的前面

glClear(GL_COLOR_BUFFRT_BIT);//重新整理顏色緩衝區;

3.基本圖形的繪製

繪製函式一般放置在清屏語句

glClear(GL_COLOR_BUFFER_BIT);//重新整理顏色緩衝區;

和重新整理語句之間

glFlush();//用於重新整理命令佇列和緩衝區,使所有尚未被執行的OpenGL命令得到執行;

矩形繪製glRectf(x1,y1,x2,y2);//畫矩形,x1,y1x2,y2分別為矩形對角線頂點座標

繪製直線:

          glBegin(GL_LINES);//畫線命令,x1,y1x2,y2分別為直線段端點座標

glVertex2f(x1,y1);

glVertex2f(x2,y2);

glEnd();

畫三角形:

          glBegin(GL_TRIANGLES);//畫三角形命令,x1,y1x2,y2x3,y3分別為三角形頂點座標

glVertex2f(x1,y1

);

glVertex2f(x2,y2);

glVertex2f(x3,y3);

glEnd();

點繪製:

glPointSize(2.0)//點的大小設定

glBegin(GL_POINTS);

glColor3f(1.0,1.0,1.0);//分別設定不同的顏色

glVertex2f(-0.5,-0.5);

glColor3f(1.0,0.0,1.0);

glVertex2f(-0.5,0.5);

glEnd()

直線/三角形/四邊形繪製:

glLineWidth(2.0);

glBegin(GL_LINES);

glBegin(GL_LINE_STRIP);

glBegin(GL_LINE_LOOP);

glBegin(GL_TRIANGLES);

glBegin(GL_TRIANGLE_STRIP);

glBegin(GL_TRIANGLE_FAN);

glBegin(GL_QUADS);

glBegin(GL_TRIANGLE_STRIP);

glEnd();

多邊形:

glBegin(GL_POLYGON);

glVertex2f(-0.5,0.5);

glVertex2f(-0.5,-0.5);

glColor3f(1.0,1.0,1.0);

glVertex2f(0,-0.5);

glColor3f(1.0,1.0,0.0);

glVertex2f(0.5,-0.5);

glVertex2f(0.5,0.5);

glEnd();

圓盤繪製:

GLUquadricObj *disk;//定義二次曲面物件

disk=gluNewQuadric();//生成二次去面對像

gluDisk(disk,0.8,1,50,50);//內徑0.8,外徑1,盤心在原點

球的繪製:

glutSolidSphere(1,80,80);//半徑為1的球,球心在原點

繪圖色的設定:

        glColor3f(r,g,b);//設定繪圖色r,g,b,取值範圍:[0,1],可以為浮點數。如果想單獨為某個圖形指定顏色就要放在glBegin()和glEnd()之間

二:OPENGL簡單的動畫

1.在display函式中新增   多邊形模式設定語句:   glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//線框模式 GL_FRONT:設定正面模式 GL_BACK:設定反面模式       GL_FRONT_AND_BACK:設定正反面的模式   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //填充模式   glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); //點模式

2.新增線寬語句:

  glLineWidth(2.0); //設定線寬 想要對每個圖形分別設定線寬,放在每個圖形的glBegin()函式前面即可,值不能設定太大,否則看不出效果

  void glutIdleFunc((*f) (void))//註冊閒置響應函式,用於後臺處理,當其他的事情處於掛起時,就可以執行函式f,通常利用它可實現簡單動畫。

  glutPostRedisplay();//重畫函式,相當於重新呼叫Display(),改編後的變數得以傳給繪製函式

三:簡單的鍵盤互動

1.在主函式裡新增鍵盤註冊回撥函式

glutKeyboardFunc(mykeyboard);//mykeyboard函式是自己定義的函式

此函式可放在 glutDisplayFunc(display);後面。

2.main函式裡添加註冊視窗變化函式

glutReshapeFunc(myreshape);//myreshape函式自己定義

(放在glutMainLoop()之前)

3.裁剪視窗設定函式:

gluOrtho2D(xwmin,xwmax,ywmin,ywmax);

  // xwmin,xwmax,ywmin,ywmax為裁剪視窗在世界座標系的位置,分別為x最小,x最大,y最小,y最大。其實就是繪圖的座標

4.視區設定函式:

  glViewport(startx,starty,viewport_width,viewport_height);

繪圖區顯示視窗中位置,以螢幕座標系為參考

startx,starty,viewport_width,viewport_height分別為繪圖區在顯示視窗的起點位置, 以及繪圖區的寬度和高度

四:滑鼠互動

1.在主程式註冊滑鼠響應和滑鼠移動子函式

glutMouseFunc(mymouse);

  glutMotionFunc(mymotion);

  放在display註冊之後和mainloop之前

五:圖形變換

1.gltranslatef(x,y,z)//x,y,z分別代表x,y,z方向的平移量,對於2D圖形,z=0

2glrotatef(Q,x,y,z)//Q為逆時針方向旋轉的角度度數(0~360),(xyz)為旋轉軸的方向向量

                     //(x,y,z=(001)時代表沿Z軸方向旋轉;(x,y,z=100)代表沿x軸方向旋轉

                           //(x,y,z=010)代表沿y軸方向旋轉

                           //預設繞原點旋轉

3glscalef(x,y,z)//x,y,z分別表示x,y,z方向的比例因子。對於2D圖形,z=0。比例因子取-1時,產生對稱變換

程式碼示例:

1.某圖形沿水平方向垂直方向分別平移Tx,Ty段距離:

  清屏

  glMatrixMode(GL_MODELVIEW);//設定矩陣模式為模型變換模式,表示在世界座標系下

  glLoadIdentity();//將當前矩陣設定為單位矩陣

  glTranslatef(Tx,Ty,0);

  DrawSomeShape();

重新整理

2.某圖形任意點cxcy)旋轉ALPHA://如果不是繞原點旋轉,就要進行三部曲

清屏

glMatrixMode(GL_MODELVIEW);//設定矩陣模式為模型變換模式,表示在世界座標系下

glLoadIdentity();//將當前矩陣設定為單位矩陣

glTranslatef(cx,cy,0);//平移回去

glRotatef(ALPHA,0,0,1); //繞原點旋轉ALPHA角度

glTranslatef(-cx,-cy,0);//平移回原點

DrawSomeShape();

重新整理

//總而言之,就兩種情況,就是繞原點旋轉或者繞任意點旋轉

//而要繞任意點旋轉就要進行三部曲,三部曲中的cx,cy就是你所要旋轉的點

//如果不進行三部曲,預設情況下就是整個圖形繞著原點旋轉

//具體是自轉還是公轉,就要看你所繞的點和你所畫的圖形的想對位置了

3.某圖形任意點cxcy)縮放Sx,Sy比例因子//如果不是繞原點縮放,也要進行三部曲

清屏

glMatrixMode(GL_MODELVIEW);//設定矩陣模式為模型變換模式,表示在世界座標系下

glLoadIdentity();//將當前矩陣設定為單位矩陣

glTranslatef(cx,cy,0);//平移回去

glScalef(Sx,Sy,1);//繞原點水平縮放係數Sx,垂直縮放係數Sy

glTranslatef(-cx,-cy,0);//平移回原點

DrawSomeShape();

重新整理

//當需要對單獨的影象進行變換的時候,應該把畫圖函式,轉換函式全部都放在glPushMatrix(void)和glPopMatrix(void)之間。

4.void glPushMatrix(void)

功能:把當前操作矩陣壓入矩陣堆疊,記住當前所在的位置。

複製活動棧頂的當前矩陣並將其存入第二個棧位置

5.void glPopMatrix(void)

功能:當前操作矩陣出棧,它下面的矩陣作為當前矩陣,返回到以前所在的位置。

破壞棧頂矩陣,棧的第二個矩陣成為當前矩陣。如果要彈出棧頂,棧內至少要有2個矩陣,否則就會出錯。