圖形學(xué)課程設(shè)計(jì)內(nèi)容_第1頁(yè)
圖形學(xué)課程設(shè)計(jì)內(nèi)容_第2頁(yè)
圖形學(xué)課程設(shè)計(jì)內(nèi)容_第3頁(yè)
圖形學(xué)課程設(shè)計(jì)內(nèi)容_第4頁(yè)
圖形學(xué)課程設(shè)計(jì)內(nèi)容_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄一、選題背景11.1 背景及目的11.2 題目概述1二、算法設(shè)計(jì)12.1 數(shù)據(jù)結(jié)構(gòu)12.2 功能實(shí)現(xiàn)3三、程序及功能說(shuō)明33.1 鼠標(biāo)控制正方體的旋轉(zhuǎn)3四、結(jié)果分析5五、心得體會(huì)5六、附件56.1參考文獻(xiàn)56.2源程序6計(jì)算機(jī)與通信學(xué)院課程設(shè)計(jì)評(píng)分表9一、選題背景1.1 背景及目的計(jì)算機(jī)圖形學(xué)是近三十年來(lái)發(fā)展迅速、應(yīng)用廣泛的新興學(xué)科。它主要研究用計(jì)算機(jī)及圖形設(shè)備輸入、表示、修改、變換和輸出圖形的原理、算法和系統(tǒng)。它的主要的目的就是要利用計(jì)算機(jī)產(chǎn)生令人賞心悅目的真實(shí)感圖形。1.2 題目概述 本題:畫(huà)出一個(gè)正方體,并將它旋轉(zhuǎn)起來(lái)。主要應(yīng)實(shí)現(xiàn)以下4點(diǎn)基本要求:1用C/C+或VB實(shí)現(xiàn);2友好性:界

2、面要友好;3可讀性:源程序代碼清晰、有層次;4用鼠標(biāo)可以決定立方體旋轉(zhuǎn)速度的快慢。 題目難點(diǎn)在于實(shí)現(xiàn)可視化界面的交互、以及圖像的旋轉(zhuǎn)過(guò)程。分析題目可以得出程序可以大致分為兩個(gè)方面的工作內(nèi)容:1.畫(huà)出一個(gè)正方體。2.使正方體旋轉(zhuǎn)起來(lái)。通過(guò)在互聯(lián)網(wǎng)上查找資料,我決定使用OPENGL圖形庫(kù)來(lái)解決C/C+編寫(xiě)圖形界面困難的問(wèn)題。二、算法設(shè)計(jì)2.1 數(shù)據(jù)結(jié)構(gòu)2.1.1 opengl 及 windows 坐標(biāo)系OPENGL的三維坐標(biāo)系如圖1所示:XOY平面為屏幕所在WINDOWS的窗體坐標(biāo)如圖2所示:OXYZXYO圖1 OPENGL三維坐標(biāo)系 圖2WINDOWS窗體二維坐標(biāo)系2.1.2 大體設(shè)計(jì)方案綜上所

3、述,在本程序中。首先使用相關(guān)的WINDOWS API創(chuàng)建窗口,其次實(shí)現(xiàn)程序的相應(yīng)功能:使用OPENGL相應(yīng)庫(kù)函數(shù)畫(huà)出正方體。使之旋轉(zhuǎn)起來(lái)。在窗體中響應(yīng)鼠標(biāo)事件,控制正方體的旋轉(zhuǎn)。程序流程圖如圖3所示:WINMAIN主程序?qū)⒊绦蚣せ畈⑦M(jìn)入消息循環(huán)程序激活由CreateGLWindow()創(chuàng)建窗體創(chuàng)建窗體成功由函數(shù)InitGL()初始化OPENGL調(diào)用相關(guān)參數(shù)由DrawGLscene在窗體中實(shí)現(xiàn)繪圖旋轉(zhuǎn)程序完成由KillGLWindows銷毀窗口,推出消息循環(huán),結(jié)束程序。圖3 程序流程圖程序的大體內(nèi)容以及機(jī)構(gòu)已經(jīng)構(gòu)造成型,功能部分還需要進(jìn)一步的細(xì)化。顯然在消息循環(huán)中的內(nèi)容還遠(yuǎn)不止這些,還需加入響應(yīng)

4、以下事件:當(dāng)窗口大小發(fā)生變化時(shí),重置窗口。響應(yīng)鼠標(biāo)事件,并改變相對(duì)應(yīng)的參數(shù)值,來(lái)改變旋轉(zhuǎn)速度。響應(yīng)窗口中斷事件,如關(guān)閉事件、屏保事件。2.2 功能實(shí)現(xiàn)2.2.1 opengl的主體繪制工作首先使用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 清除屏幕和深度緩存,然后使用glLoadIdentity();重置當(dāng)前的模型觀察矩陣,確定繪制好圖形的位置glTranslatef(0.0f,0.0f,z);移入屏幕 z 個(gè)單位。函數(shù)glTranslatef(x, y, z)作用為沿著 X, Y 和 Z 軸移動(dòng);現(xiàn)在是本程序中最重要的語(yǔ)句:glRo

5、tatef(angle,0.0f,0.0f,0.0f),其中angle為每次旋轉(zhuǎn)的角度,之后分別是XYZ三個(gè)軸的旋轉(zhuǎn)分量,這三個(gè)旋轉(zhuǎn)分量構(gòu)成了三維坐標(biāo)軸中的旋轉(zhuǎn)法向量。glBegin(GL_QUADS);繪制四邊形(使用每4個(gè)連續(xù)的頂點(diǎn)定義一個(gè)四邊形的"填充圖元-GL_QUANS")。三、程序及功能說(shuō)明3.1 鼠標(biāo)控制正方體的旋轉(zhuǎn)上面我們介紹到旋轉(zhuǎn)函數(shù)的作用,來(lái)解決程序是要使正方體旋轉(zhuǎn)起來(lái)的問(wèn)題,程序還有一個(gè)要求就是,當(dāng)鼠標(biāo)在正方體表面的中心處拖動(dòng)旋轉(zhuǎn)時(shí),其旋轉(zhuǎn)的速度很慢,反之,當(dāng)鼠標(biāo)在表面的邊角處拽動(dòng)時(shí),其速度很快,這剛好符合人們實(shí)際中的習(xí)慣。 此功能用一下程序?qū)崿F(xiàn):Vo

6、id mouseMotion(int x, int y) float curPos3, dx, dy, dz; trackball_ptov(x, y, winWidth, winHeight, curPos);if(trackingMouse) dx = curPos0 - lastPos0; dy = curPos1 - lastPos1; dz = curPos2 - lastPos2; if (dx | dy | dz) angle = 90.0F * sqrt(dx*dx + dy*dy + dz*dz);axis0 = lastPos1*curPos2 - lastPos2*cur

7、Pos1;axis1 = lastPos2*curPos0 - lastPos0*curPos2;axis2 = lastPos0*curPos1 - lastPos1*curPos0; lastPos0 = curPos0;lastPos1 = curPos1;lastPos2 = curPos2; glutPostRedisplay();效果如下圖所示:四、結(jié)果分析程序解決了老師提出的問(wèn)題及相關(guān)的要求,能夠用鼠標(biāo)控制正方體的旋轉(zhuǎn)速度,以及旋轉(zhuǎn)方向。大致取得了滿意的結(jié)果。通過(guò)這次設(shè)計(jì),掌握了以下幾大方面的內(nèi)容:1WINDOWS消息消息機(jī)制。2OPENGL庫(kù)的調(diào)用方法,以及使用OPENG創(chuàng)建窗

8、口與WINDOWS的交互過(guò)程3OPENGL繪制圖形的基本過(guò)程。五、心得體會(huì)經(jīng)過(guò)兩個(gè)星期的課程設(shè)計(jì),我學(xué)到了很多東西,感覺(jué)自己就像一個(gè)學(xué)美術(shù)的藝術(shù)生一樣,可以畫(huà)出很多美麗的圖案,曾經(jīng)覺(jué)得計(jì)算機(jī)是那么的枯燥無(wú)味,而現(xiàn)在讓我改變了這種錯(cuò)誤觀念。只要你認(rèn)真的去體會(huì)其中的美和藝術(shù),你會(huì)覺(jué)得它是一門(mén)非常神奇的學(xué)科。它主要研究用計(jì)算機(jī)及圖形設(shè)備輸入、表示、修改、變換和輸出圖形的原理、算法和系統(tǒng)。它的主要的目的就是要利用計(jì)算機(jī)產(chǎn)生令人賞心悅目的真實(shí)感圖形。雖然我不是很了解這門(mén)學(xué)科,但是在同學(xué)和老師的幫助下,我充分的感受到了計(jì)算機(jī)圖形學(xué)給我們?nèi)粘I钪袔?lái)的便利以及那種意想不到的美感。謝謝學(xué)校和老師能給我們這樣

9、實(shí)踐的機(jī)會(huì)。這兩個(gè)星期卻是學(xué)到了得到了很多收獲。六、附件6.1參考文獻(xiàn)1.倪明田等 計(jì)算機(jī)圖形學(xué),北京大學(xué)出版社,20002.白建軍等 OpenGL三維圖形設(shè)計(jì)與制作,人民郵電出版社,19983 王汝傳.黃海平.計(jì)算機(jī)圖形學(xué)教程M. 北京:人民郵電出版社,2009.4 孔令德. 計(jì)算機(jī)圖形學(xué)教程M. 北京:清華大學(xué)出版社,2008.5 姜靈芝.C語(yǔ)言課程設(shè)計(jì)案例精編M.北京:清華大學(xué)出版社.2008.6 徐文鵬.計(jì)算機(jī)圖形學(xué).北京:機(jī)械工業(yè)出版社,2009.6.2源程序#include <math.h>#include <windows.h>#include <G

10、L/gl.h>#include <GL/glu.h>#include <gl/glaux.h>#include <stdio.h>#include <io.h>#include <GL/glut.h>#define bool int#define false 0#define true 1#define M_PI 3.1415926int winWidth, winHeight;float angle = 0.0, axis3, trans3;bool trackingMouse = false;bool redrawConti

11、nue = false;bool trackballMove = false;/* Draw the cube */GLfloat vertices3 = -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0, -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0;GLfloat colors3 = 0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,1.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0

12、, 0.0,1.0,1.0;void polygon(int a, int b, int c , int d, int face) /* draw a polygon via list of vertices */ glBegin(GL_POLYGON);glColor3fv(colorsa);glVertex3fv(verticesa);glVertex3fv(verticesb);glVertex3fv(verticesc);glVertex3fv(verticesd); glEnd();void colorcube(void) /* map vertices to faces */ po

13、lygon(1,0,3,2,0); polygon(3,7,6,2,1); polygon(7,3,0,4,2); polygon(2,6,5,1,3); polygon(4,5,6,7,4); polygon(5,4,0,1,5);float lastPos3 = 0.0F, 0.0F, 0.0F;int curx, cury;int startX, startY;voidtrackball_ptov(int x, int y, int width, int height, float v3) float d, a; v0 = (2.0F*x - width) / width; v1 = (

14、height - 2.0F*y) / height; d = (float) sqrt(v0*v0 + v1*v1); v2 = (float) cos(M_PI/2.0F) * (d < 1.0F) ? d : 1.0F); a = 1.0F / (float) sqrt(v0*v0 + v1*v1 + v2*v2); v0 *= a; v1 *= a; v2 *= a;voidmouseMotion(int x, int y) float curPos3, dx, dy, dz; trackball_ptov(x, y, winWidth, winHeight, curPos);if

15、(trackingMouse) dx = curPos0 - lastPos0; dy = curPos1 - lastPos1; dz = curPos2 - lastPos2; if (dx | dy | dz) angle = 90.0F * sqrt(dx*dx + dy*dy + dz*dz);axis0 = lastPos1*curPos2 - lastPos2*curPos1;axis1 = lastPos2*curPos0 - lastPos0*curPos2;axis2 = lastPos0*curPos1 - lastPos1*curPos0; lastPos0 = cur

16、Pos0;lastPos1 = curPos1;lastPos2 = curPos2; glutPostRedisplay();voidstartMotion(int x, int y) trackingMouse = true; redrawContinue = false; startX = x; startY = y; curx = x; cury = y; trackball_ptov(x, y, winWidth, winHeight, lastPos); trackballMove=true;voidstopMotion(int x, int y) trackingMouse =

17、false; if (startX != x | startY != y) redrawContinue = true; else angle = 0.0F; redrawContinue = false; trackballMove = false; void display(void) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /* view transform */ if (trackballMove) glRotatef(angle, axis0, axis1, axis2); colorcube(); glutSwapBuff

18、ers();void mouseButton(int button, int state, int x, int y)if(button=GLUT_RIGHT_BUTTON) exit(0);if(button=GLUT_LEFT_BUTTON)switch(state) case GLUT_DOWN:y=winHeight-y;startMotion(x,y);break;case GLUT_UP:stopMotion(x,y);break; void myReshape(int w, int h) glViewport(0, 0, w, h); winWidth = w; winHeight = h;void spinCube() if (redraw

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論