下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p> 一.設(shè)計(jì)內(nèi)容與要求…………………………………………2</p><p> 1.1 總體目標(biāo)和要求……………………………………2</p><p> 1.2 內(nèi)容與要求…………………………………………2</p><p> 二.總體設(shè)計(jì)………………………
2、…………………………2</p><p> 2.1 球的消隱處理基本原理……………………………2</p><p> 2.2 具體設(shè)計(jì)實(shí)現(xiàn)………………………………………3</p><p> 三.詳細(xì)設(shè)計(jì)…………………………………………………3</p><p> 3.1 程序流程圖…………………………………………3</p>&
3、lt;p> 3.2調(diào)試后正確的程序清單…………………………… 5</p><p> 功能實(shí)現(xiàn)……………………………………………… 10</p><p> 4.1程序運(yùn)行結(jié)果………………………………………10</p><p> 4.2 功能實(shí)現(xiàn)及分析……………………………………10</p><p> 總結(jié)………………………………
4、…………………… 11</p><p> 參考文獻(xiàn)……………………………………………… 11</p><p> 球體背面剔除消隱算法</p><p> 第1章 設(shè)計(jì)內(nèi)容與要求</p><p><b> 總體目標(biāo)和要求</b></p><p> 課程設(shè)計(jì)的目的:以圖形學(xué)算法為目標(biāo),深入研究
5、。繼而策劃、設(shè)計(jì)并實(shí)現(xiàn)一個(gè)能夠表現(xiàn)計(jì)算機(jī)圖形學(xué)算法原理的或完整過(guò)程的演示系統(tǒng),并能從某些方面作出評(píng)價(jià)和改進(jìn)意見(jiàn)。通過(guò)完成一個(gè)完整程序,經(jīng)歷策劃、設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、總結(jié)和驗(yàn)收各階段,達(dá)到:</p><p> 鞏固和實(shí)踐計(jì)算機(jī)圖形學(xué)課程中的理論和算法;</p><p> 學(xué)習(xí)表現(xiàn)計(jì)算機(jī)圖形學(xué)算法的技巧;</p><p> 培養(yǎng)認(rèn)真學(xué)習(xí)、積極探索的精神;</p
6、><p> 具備通過(guò)具體的平臺(tái)實(shí)現(xiàn)圖形算法的設(shè)計(jì)、編程與調(diào)試的能力;</p><p> 完成對(duì)實(shí)驗(yàn)結(jié)果分析、總結(jié)及撰寫(xiě)技術(shù)報(bào)告的能力。</p><p> 總體要求:策劃、設(shè)計(jì)并實(shí)現(xiàn)一個(gè)能夠充分表現(xiàn)圖形學(xué)算法的演示系統(tǒng),界面要求美觀大方,能清楚地演示算法執(zhí)行的每一個(gè)步驟。</p><p> 開(kāi)發(fā)環(huán)境:Viusal C++ 6.0</p
7、><p><b> 1.2 內(nèi)容與要求</b></p><p> 球體背面剔除消隱算法</p><p><b> 內(nèi)容:</b></p><p> ?。?)掌握背面剔除消隱算法原理;</p><p> ?。?)實(shí)現(xiàn)矢量點(diǎn)積與叉積運(yùn)算;</p><p>
8、;<b> ?。?)透視投影變換</b></p><p> ?。?)曲面體經(jīng)緯線劃分方法</p><p><b> 功能要求:</b></p><p> ?。?)繪制球體線框模型的透視投影圖,使用背面剔除算法實(shí)現(xiàn)動(dòng)態(tài)消隱;</p><p> ?。?)通過(guò)右鍵菜單顯示消隱效果,右鍵菜單有兩個(gè)選項(xiàng):未
9、消隱與消隱;</p><p> ?。?)使用鍵盤(pán)的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體;</p><p> ?。?)單擊左鍵增加視距,右擊縮短視距;</p><p><b> 第2章 總體設(shè)計(jì)</b></p><p> 2.1 球的消隱處理基本原理</p><p> 球體的曲面通常采用一組網(wǎng)格
10、多邊形來(lái)表示,即把曲面離散成許多小平面片,用平面逼近曲面,一般使用許多四邊形來(lái)逼近曲面。網(wǎng)格四邊形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起來(lái)就越光滑。一般根據(jù)實(shí)際需要來(lái)確定合適的逼近精度即網(wǎng)格多邊形數(shù)目。當(dāng)曲面表示為一組網(wǎng)格多邊形時(shí),消隱處理的主要工作是確定各網(wǎng)格多邊形的可見(jiàn)性,由此可用平面立體的算法對(duì)曲面進(jìn)行消隱處理。</p><p><b> 球面的參數(shù)方程為:</b>&l
11、t;/p><p> x=R· sina·cosβ</p><p> y=R· sina· sinβ (0≤a≤π, 0≤β≤2π)</p><p><b> z=R· cosa</b></p><p> 設(shè)兩個(gè)參數(shù)a和β對(duì)球面進(jìn)行網(wǎng)格化,當(dāng)相鄰的曲線參數(shù)分別為a
12、1、a2、β1、β2時(shí),構(gòu)成四邊形網(wǎng)格P0P1P2P3,其外法線N表示如下:</p><p> N= P0P1×P1P2</p><p> 對(duì)N進(jìn)行單位化:n={nx,ny,nz}= n/|N|</p><p> 若設(shè)視方向?yàn)镾,其平行于y軸: S={0,1,0}</p><p> ?、?n·S= ny≥0,網(wǎng)格可見(jiàn)
13、,畫(huà)出;</p><p> ② n·S= ny<0,網(wǎng)格不可見(jiàn),不畫(huà) </p><p> 2.2 具體設(shè)計(jì)實(shí)現(xiàn)</p><p> (1) 掌握運(yùn)行環(huán)境Visual C++編程、調(diào)試方法,熟練掌握OpenGL的使用,并能將兩者相結(jié)合完成實(shí)驗(yàn)設(shè)計(jì);</p><p> (2) 理解球體背面剔除消隱算法的基本原理;</p
14、><p> (3) 利用OpenGL中的函數(shù)繪制一個(gè)線框球并顯示出來(lái)。具體方案如下:</p><p> ?。╝)先通過(guò)透視投影變換繪制出小四邊形平面片,進(jìn)行球體線框模型的繪制。</p><p> ?。╞)完成球體的繪制后,進(jìn)行設(shè)置球體的旋轉(zhuǎn)效果,根據(jù)球體背面剔除消隱算法來(lái)完成球體的動(dòng)態(tài)消隱。</p><p> ?。╟)創(chuàng)建右鍵菜單顯示消隱效果,
15、右鍵菜單有未消隱和消隱兩個(gè)選項(xiàng)。</p><p> ?。╠)設(shè)置使用鍵盤(pán)的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體。</p><p> ?。╡)設(shè)置單擊鼠標(biāo)左鍵增加視距,右擊縮短視距。</p><p> ?。╢)編寫(xiě)主函數(shù),然后編寫(xiě)以上思想的子函數(shù),對(duì)整個(gè)程序進(jìn)行基本的代碼編寫(xiě),分模塊完成所要求的各個(gè)功能,最后進(jìn)行代碼的運(yùn)行和調(diào)試。</p><p>
16、<b> 第3章 詳細(xì)設(shè)計(jì)</b></p><p><b> 3.1 程序流程圖</b></p><p><b> 程序主流程圖</b></p><p> 3.2調(diào)試后正確的程序清單</p><p> #include <GL/glut.h></p&
17、gt;<p> #include <stdlib.h></p><p> #define NO_XIAOYIN 1</p><p> #define XIAOYIN 2</p><p> static float a=1.0f,b=0.0f,c=0.0f;</p><p> GLfloat rtri,r
18、=1.0f; //旋轉(zhuǎn)角度</p><p> bool bXiaoyin = true;</p><p> void init(void) </p><p><b> {</b></p><p> glClearColor(0.0f, 0.0f, 0.0f, 0.0f);</p><p>
19、; glShadeModel(GL_SMOOTH);//設(shè)為smooth處理方式</p><p> glEnable(GL_DEPTH_TEST);//激活深度測(cè)試</p><p><b> }</b></p><p> void display(void)</p><p><b> {</b&
20、gt;</p><p> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); </p><p> //清除顏色緩存和深度緩存</p><p> glLoadIdentity();</p><p> glTranslatef(-1.0f,0.0f,-4.0f);//控制球的位置和
21、大小</p><p> glRotatef(rtri,a,b,c);//旋轉(zhuǎn)</p><p> glColor3f(0.0f,1.0f,0.0f);//控制球的顏色</p><p> if(bXiaoyin)</p><p> glutWireSphere(r, 45, 30 ) ; //初始化線框球 球體圍繞z軸分割45&l
22、t;/p><p> 次,球體沿著z軸分割30次</p><p><b> else </b></p><p><b> {</b></p><p> glDisable(GL_TEXTURE_2D);</p><p> glColorMask(0,0,0,0);<
23、/p><p> glEnable(GL_DEPTH_TEST);</p><p> glDepthFunc(GL_LESS);</p><p> glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);</p><p> glPolygonOffset(1.1f, 4.0f);</p><p
24、> glEnable (GL_POLYGON_OFFSET_FILL); </p><p> //auxSolidSphere(1.0);</p><p> glutSolidSphere (r, 45, 30 ) ;//實(shí)心球</p><p> glDisable (GL_POLYGON_OFFSET_FILL);</p>&
25、lt;p> glColorMask(1, 1, 1, 1);</p><p> glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); </p><p> //auxSolidSphere(1.0);</p><p> glutSolidSphere (r, 45, 30 ) ; </p>&
26、lt;p><b> }</b></p><p> glutSwapBuffers(); //交換雙緩存</p><p><b> }</b></p><p> void reshape (int width, int height) //對(duì)屏幕窗口的形狀進(jìn)行調(diào)整</p><p>
27、;<b> {</b></p><p> glViewport(0, 0, width, height); </p><p> glMatrixMode(GL_PROJECTION);</p><p> glLoadIdentity();</p><p> gluPerspective(45.0f, (GLfl
28、oat)width/(GLfloat)height, 0.1f, 100.0f);</p><p> glMatrixMode(GL_MODELVIEW);</p><p> glLoadIdentity();</p><p><b> }</b></p><p> void processMenuEvents(
29、int option)//此函數(shù)處理根據(jù)菜單選項(xiàng)來(lái)執(zhí)行的動(dòng)作</p><p><b> {</b></p><p> switch (option) {</p><p><b> case 1:</b></p><p> bXiaoyin = true;</p><p&
30、gt; glutPostRedisplay();</p><p><b> break;</b></p><p><b> case 2:</b></p><p> bXiaoyin = false;</p><p> glutPostRedisplay();</p><
31、;p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> void createGLUTMenus()//創(chuàng)建菜單</p><p><b> {</b></p
32、><p><b> int menu;</b></p><p> menu = glutCreateMenu(processMenuEvents);</p><p> glutAddMenuEntry("消隱",XIAOYIN);//在菜單中添加選項(xiàng)</p><p> glutAddMenuEnt
33、ry("未消隱",NO_XIAOYIN);</p><p> glutAttachMenu(GLUT_RIGHT_BUTTON);</p><p><b> }</b></p><p> void keyboard(unsigned char key, int x, int y) ////鍵盤(pán)控制球體的縮放</p
34、><p><b> {</b></p><p> switch (key)</p><p><b> {</b></p><p><b> case 'o':</b></p><p><b> r+=0.1f;</b
35、></p><p> glutPostRedisplay();</p><p><b> break;</b></p><p><b> case 'i':</b></p><p><b> r-=0.1f;</b></p><
36、p> glutPostRedisplay();</p><p><b> break;</b></p><p><b> case 'x':</b></p><p><b> exit(0);</b></p><p><b> brea
37、k;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> v
38、oid keyboard1(int key,int x,int y)</p><p><b> {</b></p><p> switch(key)</p><p><b> {</b></p><p> case GLUT_KEY_LEFT://向左旋轉(zhuǎn)</p><p&
39、gt;<b> a=0.0f;</b></p><p><b> b=1.0f;</b></p><p><b> c=0.0f;</b></p><p> rtri-=2.0f;//減一個(gè)角度</p><p> glutPostRedisplay();//重畫(huà)<
40、;/p><p><b> break;</b></p><p> case GLUT_KEY_RIGHT://向右旋轉(zhuǎn)</p><p><b> a=0.0f;</b></p><p><b> b=1.0f;</b></p><p><b&g
41、t; c=0.0f;</b></p><p> rtri+=2.0f;//加一個(gè)角度</p><p> glutPostRedisplay();</p><p><b> break;</b></p><p> case GLUT_KEY_UP://向上旋轉(zhuǎn)</p><p>
42、<b> a=1.0f;</b></p><p><b> b=0.0f;</b></p><p><b> c=0.0f;</b></p><p> rtri-=2.0f;</p><p> glutPostRedisplay();</p><p
43、><b> break;</b></p><p> case GLUT_KEY_DOWN://向下旋轉(zhuǎn)</p><p><b> a=1.0f;</b></p><p><b> b=0.0f;</b></p><p><b> c=0.0f;<
44、/b></p><p> rtri+=2.0f;</p><p> glutPostRedisplay();</p><p><b> break;</b></p><p><b> default:</b></p><p><b> break;&
45、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p> void mouse(int button, int state, int x, int y)//用鼠標(biāo)實(shí)現(xiàn)放大縮小</p><p><b> {</b>&
46、lt;/p><p> switch (button)</p><p><b> {</b></p><p> case GLUT_LEFT_BUTTON:</p><p><b> r+=0.1f;</b></p><p> glutPostRedisplay();&l
47、t;/p><p><b> break;</b></p><p> case GLUT_RIGHT_BUTTON:</p><p><b> r-=0.1f;</b></p><p> glutPostRedisplay();</p><p><b> bre
48、ak;</b></p><p><b> default:</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p>
49、int main(int argc, char** argv)</p><p><b> {</b></p><p> glutInit(&argc, argv);</p><p> glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);</p><p
50、> //使用雙緩存模式和深度緩存</p><p> glutInitWindowSize(800, 500); //窗口大小</p><p> glutInitWindowPosition(200,200);//窗口在屏幕的位置</p><p> glutCreateWindow("球體消隱");</p><p&
51、gt;<b> init();</b></p><p> glutDisplayFunc(display); //注冊(cè)重繪函數(shù)</p><p> glutReshapeFunc(reshape);//注冊(cè)改變窗口形狀函數(shù) </p><p> glutKeyboardFunc(keyboard);//注冊(cè)鍵盤(pán)動(dòng)作函數(shù)</p>
52、<p> glutSpecialFunc(keyboard1);//注冊(cè)特殊鍵盤(pán)動(dòng)作函數(shù)</p><p> glutIdleFunc(display);//設(shè)置空閑時(shí)調(diào)用的函數(shù)</p><p> glutMouseFunc(mouse);//注冊(cè)鼠標(biāo)動(dòng)作函數(shù)</p><p> createGLUTMenus();</p><p
53、> glutMainLoop(); //進(jìn)入主循環(huán)等待事件發(fā)生</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 功能實(shí)現(xiàn)</b></p><p><b> 4.1程序運(yùn)行結(jié)果<
54、/b></p><p><b> 運(yùn)行結(jié)果如下圖所示</b></p><p> 消隱前 消隱后</p><p> 4.2 功能實(shí)現(xiàn)及分析</p><p> 此次程序設(shè)計(jì)運(yùn)用計(jì)算機(jī)圖形學(xué)所學(xué)到的知識(shí),基本完成了課程設(shè)計(jì)所要求的功能。以下為本
55、實(shí)驗(yàn)?zāi)軐?shí)現(xiàn)的功能:</p><p> (1) 繪制了一個(gè)球體線框模型的透視投影圖,并使用背面剔除算法實(shí)現(xiàn)動(dòng)態(tài)消隱,利用 glutWireSphere(r, 45, 30 ) ;函數(shù)初始化一個(gè)線框球,球體圍繞z軸分割45次,沿著z軸分割30 次</p><p> (2) 通過(guò)右鍵菜單顯示消隱效果,右鍵菜單有兩個(gè)選項(xiàng):未消隱與消隱,主要利用processMenuEvents()函數(shù)和c
56、reateGLUTMenus()實(shí)現(xiàn)。processMenuEvents()函數(shù)體是一個(gè)典型的switch語(yǔ)句。</p><p> (3) 使用鍵盤(pán)的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體;上鍵由內(nèi)向外旋轉(zhuǎn),下鍵由外向內(nèi)旋轉(zhuǎn),左鍵向左旋轉(zhuǎn),右鍵向右旋轉(zhuǎn)。</p><p> (4) 單擊左鍵增加視距,右擊縮短視距,同時(shí)利用鍵盤(pán)字母“i”實(shí)現(xiàn)球體的縮小,字母“o”控制球體的放大,字母“x”為退出
57、窗口界面。</p><p><b> 第5章 總結(jié)</b></p><p> 課程設(shè)計(jì)是對(duì)所學(xué)課程的一個(gè)綜合應(yīng)用,是對(duì)所學(xué)課程掌握全面與否的檢驗(yàn)。由于對(duì)OpenGL算法與VC++編程不是很熟悉,在設(shè)計(jì)過(guò)程中遇到了一些困難。不過(guò)通過(guò)老師、同學(xué)的指導(dǎo),以及自己查閱相關(guān)資料,這些疑惑就全部解決了,因此課程設(shè)計(jì)才得以順利完成。</p><p>
58、本次計(jì)算機(jī)圖形學(xué)的課程設(shè)計(jì),使我對(duì)圖形學(xué)有了更深一步的認(rèn)識(shí),深切感受到圖形學(xué)在如今的廣泛應(yīng)用,學(xué)到了許多新知識(shí)。OpenGL的圖形繪制函數(shù)有多種,我通過(guò)查詢(xún)資料一一弄懂各個(gè)函數(shù)的含義。然后根據(jù)消隱知識(shí),掌握球體消隱算法的基本原理和算法思想,進(jìn)而實(shí)現(xiàn)了球體的動(dòng)態(tài)消隱。</p><p> 在程序設(shè)計(jì)過(guò)程中也存在不足,由于自身編程經(jīng)驗(yàn)的缺乏,開(kāi)始時(shí)遇到了一些困難。比如用程序?qū)崿F(xiàn)上下左右鍵盤(pán)對(duì)球體的控制,查了很多資料還
59、是沒(méi)找到,最后在同學(xué)的幫助下輕易的完成。認(rèn)識(shí)到自己的不足,在以后的學(xué)習(xí)中我會(huì)努力改正。</p><p><b> 參考文獻(xiàn)</b></p><p> 1、計(jì)算機(jī)圖形學(xué) 徐文鵬 機(jī)械工業(yè)出版社 2009.02</p><p> 2、計(jì)算機(jī)圖形學(xué)實(shí)踐教程 孔令德 清華大學(xué)出版社 2008.05 </p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- plc廢品自動(dòng)剔除課程設(shè)計(jì)
- rsa算法課程設(shè)計(jì)報(bào)告
- rsa算法課程設(shè)計(jì)報(bào)告
- rsa算法實(shí)現(xiàn)課程設(shè)計(jì)報(bào)告
- 蟻群算法課程設(shè)計(jì)報(bào)告
- 算法分析與設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 蟻群算法課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)---電梯調(diào)度算法設(shè)計(jì)報(bào)告
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 廢瓶剔除機(jī)的機(jī)械手課程設(shè)計(jì)
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 算法課程設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告----內(nèi)排序算法比較
- 磁盤(pán)調(diào)度算法程序課程設(shè)計(jì)報(bào)告
- 算法課程設(shè)計(jì)
- 列主消元法課程設(shè)計(jì)
- c實(shí)現(xiàn)關(guān)鍵路徑算法課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告
聯(lián)系客服
本站為文檔C2C交易模式,即用戶(hù)上傳的文檔直接被用戶(hù)下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知眾賞文庫(kù),我們立即給予刪除!
- 備案號(hào): 經(jīng)營(yíng)許可證編號(hào):浙ICP備20018660號(hào)
-
Copyright ? 2013-2023 眾賞文庫(kù)版權(quán)所有 違法與不良信息舉報(bào)電話:15067167862
評(píng)論
0/150
提交評(píng)論