計算機圖形學總結(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,y1和x2,y2分別為矩形對角線頂點座標
繪製直線:
glBegin(GL_LINES);//畫線命令,x1,y1和x2,y2分別為直線段端點座標
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glEnd();
畫三角形:
glBegin(GL_TRIANGLES);//畫三角形命令,x1,y1,x2,y2和x3,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
2、glrotatef(Q,x,y,z)//Q為逆時針方向旋轉的角度度數(0~360),(x,y,z)為旋轉軸的方向向量
//(x,y,z)=(0,0,1)時代表沿Z軸方向旋轉;(x,y,z)=(1,0,0)代表沿x軸方向旋轉
//(x,y,z)=(0,1,0)代表沿y軸方向旋轉
//預設繞原點旋轉
3、glscalef(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.某圖形繞任意點(cx,cy)旋轉ALPHA://如果不是繞原點旋轉,就要進行三部曲
清屏
glMatrixMode(GL_MODELVIEW);//設定矩陣模式為模型變換模式,表示在世界座標系下
glLoadIdentity();//將當前矩陣設定為單位矩陣
glTranslatef(cx,cy,0);//平移回去
glRotatef(ALPHA,0,0,1); //繞原點旋轉ALPHA角度
glTranslatef(-cx,-cy,0);//平移回原點
DrawSomeShape();
重新整理
//總而言之,就兩種情況,就是繞原點旋轉或者繞任意點旋轉
//而要繞任意點旋轉就要進行三部曲,三部曲中的cx,cy就是你所要旋轉的點
//如果不進行三部曲,預設情況下就是整個圖形繞著原點旋轉
//具體是自轉還是公轉,就要看你所繞的點和你所畫的圖形的想對位置了
3.某圖形繞任意點(cx,cy)縮放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個矩陣,否則就會出錯。