版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p> 一.設(shè)計內(nèi)容與要求…………………………………………2</p><p> 1.1 總體目標(biāo)和要求……………………………………2</p><p> 1.2 內(nèi)容與要求…………………………………………2</p><p> 二.總體設(shè)計………………………
2、…………………………2</p><p> 2.1 球的消隱處理基本原理……………………………2</p><p> 2.2 具體設(shè)計實現(xiàn)………………………………………3</p><p> 三.詳細(xì)設(shè)計…………………………………………………3</p><p> 3.1 程序流程圖…………………………………………3</p>&
3、lt;p> 3.2調(diào)試后正確的程序清單…………………………… 5</p><p> 功能實現(xiàn)……………………………………………… 10</p><p> 4.1程序運行結(jié)果………………………………………10</p><p> 4.2 功能實現(xiàn)及分析……………………………………10</p><p> 總結(jié)………………………………
4、…………………… 11</p><p> 參考文獻(xiàn)……………………………………………… 11</p><p> 球體背面剔除消隱算法</p><p> 第1章 設(shè)計內(nèi)容與要求</p><p><b> 總體目標(biāo)和要求</b></p><p> 課程設(shè)計的目的:以圖形學(xué)算法為目標(biāo),深入研究
5、。繼而策劃、設(shè)計并實現(xiàn)一個能夠表現(xiàn)計算機(jī)圖形學(xué)算法原理的或完整過程的演示系統(tǒng),并能從某些方面作出評價和改進(jìn)意見。通過完成一個完整程序,經(jīng)歷策劃、設(shè)計、開發(fā)、測試、總結(jié)和驗收各階段,達(dá)到:</p><p> 鞏固和實踐計算機(jī)圖形學(xué)課程中的理論和算法;</p><p> 學(xué)習(xí)表現(xiàn)計算機(jī)圖形學(xué)算法的技巧;</p><p> 培養(yǎng)認(rèn)真學(xué)習(xí)、積極探索的精神;</p
6、><p> 具備通過具體的平臺實現(xiàn)圖形算法的設(shè)計、編程與調(diào)試的能力;</p><p> 完成對實驗結(jié)果分析、總結(jié)及撰寫技術(shù)報告的能力。</p><p> 總體要求:策劃、設(shè)計并實現(xiàn)一個能夠充分表現(xiàn)圖形學(xué)算法的演示系統(tǒng),界面要求美觀大方,能清楚地演示算法執(zhí)行的每一個步驟。</p><p> 開發(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> ?。?)實現(xiàn)矢量點積與叉積運算;</p><p>
8、;<b> ?。?)透視投影變換</b></p><p> (4)曲面體經(jīng)緯線劃分方法</p><p><b> 功能要求:</b></p><p> ?。?)繪制球體線框模型的透視投影圖,使用背面剔除算法實現(xiàn)動態(tài)消隱;</p><p> (2)通過右鍵菜單顯示消隱效果,右鍵菜單有兩個選項:未
9、消隱與消隱;</p><p> ?。?)使用鍵盤的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體;</p><p> ?。?)單擊左鍵增加視距,右擊縮短視距;</p><p><b> 第2章 總體設(shè)計</b></p><p> 2.1 球的消隱處理基本原理</p><p> 球體的曲面通常采用一組網(wǎng)格
10、多邊形來表示,即把曲面離散成許多小平面片,用平面逼近曲面,一般使用許多四邊形來逼近曲面。網(wǎng)格四邊形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起來就越光滑。一般根據(jù)實際需要來確定合適的逼近精度即網(wǎng)格多邊形數(shù)目。當(dāng)曲面表示為一組網(wǎng)格多邊形時,消隱處理的主要工作是確定各網(wǎng)格多邊形的可見性,由此可用平面立體的算法對曲面進(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è)兩個參數(shù)a和β對球面進(jìn)行網(wǎng)格化,當(dāng)相鄰的曲線參數(shù)分別為a
12、1、a2、β1、β2時,構(gòu)成四邊形網(wǎng)格P0P1P2P3,其外法線N表示如下:</p><p> N= P0P1×P1P2</p><p> 對N進(jìn)行單位化:n={nx,ny,nz}= n/|N|</p><p> 若設(shè)視方向為S,其平行于y軸: S={0,1,0}</p><p> ?、?n·S= ny≥0,網(wǎng)格可見
13、,畫出;</p><p> ?、?n·S= ny<0,網(wǎng)格不可見,不畫 </p><p> 2.2 具體設(shè)計實現(xiàn)</p><p> (1) 掌握運行環(huán)境Visual C++編程、調(diào)試方法,熟練掌握OpenGL的使用,并能將兩者相結(jié)合完成實驗設(shè)計;</p><p> (2) 理解球體背面剔除消隱算法的基本原理;</p
14、><p> (3) 利用OpenGL中的函數(shù)繪制一個線框球并顯示出來。具體方案如下:</p><p> ?。╝)先通過透視投影變換繪制出小四邊形平面片,進(jìn)行球體線框模型的繪制。</p><p> ?。╞)完成球體的繪制后,進(jìn)行設(shè)置球體的旋轉(zhuǎn)效果,根據(jù)球體背面剔除消隱算法來完成球體的動態(tài)消隱。</p><p> ?。╟)創(chuàng)建右鍵菜單顯示消隱效果,
15、右鍵菜單有未消隱和消隱兩個選項。</p><p> (d)設(shè)置使用鍵盤的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體。</p><p> (e)設(shè)置單擊鼠標(biāo)左鍵增加視距,右擊縮短視距。</p><p> ?。╢)編寫主函數(shù),然后編寫以上思想的子函數(shù),對整個程序進(jìn)行基本的代碼編寫,分模塊完成所要求的各個功能,最后進(jìn)行代碼的運行和調(diào)試。</p><p>
16、<b> 第3章 詳細(xì)設(shè)計</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);//激活深度測試</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 ) ;//實心球</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) //對屏幕窗口的形狀進(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ù)菜單選項來執(zhí)行的動作</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);//在菜單中添加選項</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
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;//減一個角度</p><p> glutPostRedisplay();//重畫<
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;//加一個角度</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)實現(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); //注冊重繪函數(shù)</p><p> glutReshapeFunc(reshape);//注冊改變窗口形狀函數(shù) </p><p> glutKeyboardFunc(keyboard);//注冊鍵盤動作函數(shù)</p>
52、<p> glutSpecialFunc(keyboard1);//注冊特殊鍵盤動作函數(shù)</p><p> glutIdleFunc(display);//設(shè)置空閑時調(diào)用的函數(shù)</p><p> glutMouseFunc(mouse);//注冊鼠標(biāo)動作函數(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> 功能實現(xiàn)</b></p><p><b> 4.1程序運行結(jié)果<
54、/b></p><p><b> 運行結(jié)果如下圖所示</b></p><p> 消隱前 消隱后</p><p> 4.2 功能實現(xiàn)及分析</p><p> 此次程序設(shè)計運用計算機(jī)圖形學(xué)所學(xué)到的知識,基本完成了課程設(shè)計所要求的功能。以下為本
55、實驗?zāi)軐崿F(xiàn)的功能:</p><p> (1) 繪制了一個球體線框模型的透視投影圖,并使用背面剔除算法實現(xiàn)動態(tài)消隱,利用 glutWireSphere(r, 45, 30 ) ;函數(shù)初始化一個線框球,球體圍繞z軸分割45次,沿著z軸分割30 次</p><p> (2) 通過右鍵菜單顯示消隱效果,右鍵菜單有兩個選項:未消隱與消隱,主要利用processMenuEvents()函數(shù)和c
56、reateGLUTMenus()實現(xiàn)。processMenuEvents()函數(shù)體是一個典型的switch語句。</p><p> (3) 使用鍵盤的上下左右控制鍵旋轉(zhuǎn)消隱前后的球體;上鍵由內(nèi)向外旋轉(zhuǎn),下鍵由外向內(nèi)旋轉(zhuǎn),左鍵向左旋轉(zhuǎn),右鍵向右旋轉(zhuǎn)。</p><p> (4) 單擊左鍵增加視距,右擊縮短視距,同時利用鍵盤字母“i”實現(xiàn)球體的縮小,字母“o”控制球體的放大,字母“x”為退出
57、窗口界面。</p><p><b> 第5章 總結(jié)</b></p><p> 課程設(shè)計是對所學(xué)課程的一個綜合應(yīng)用,是對所學(xué)課程掌握全面與否的檢驗。由于對OpenGL算法與VC++編程不是很熟悉,在設(shè)計過程中遇到了一些困難。不過通過老師、同學(xué)的指導(dǎo),以及自己查閱相關(guān)資料,這些疑惑就全部解決了,因此課程設(shè)計才得以順利完成。</p><p>
58、本次計算機(jī)圖形學(xué)的課程設(shè)計,使我對圖形學(xué)有了更深一步的認(rèn)識,深切感受到圖形學(xué)在如今的廣泛應(yīng)用,學(xué)到了許多新知識。OpenGL的圖形繪制函數(shù)有多種,我通過查詢資料一一弄懂各個函數(shù)的含義。然后根據(jù)消隱知識,掌握球體消隱算法的基本原理和算法思想,進(jìn)而實現(xiàn)了球體的動態(tài)消隱。</p><p> 在程序設(shè)計過程中也存在不足,由于自身編程經(jīng)驗的缺乏,開始時遇到了一些困難。比如用程序?qū)崿F(xiàn)上下左右鍵盤對球體的控制,查了很多資料還
59、是沒找到,最后在同學(xué)的幫助下輕易的完成。認(rèn)識到自己的不足,在以后的學(xué)習(xí)中我會努力改正。</p><p><b> 參考文獻(xiàn)</b></p><p> 1、計算機(jī)圖形學(xué) 徐文鵬 機(jī)械工業(yè)出版社 2009.02</p><p> 2、計算機(jī)圖形學(xué)實踐教程 孔令德 清華大學(xué)出版社 2008.05 </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- plc廢品自動剔除課程設(shè)計
- rsa算法課程設(shè)計報告
- rsa算法課程設(shè)計報告
- rsa算法實現(xiàn)課程設(shè)計報告
- 蟻群算法課程設(shè)計報告
- 算法分析與設(shè)計課程設(shè)計報告
- 蟻群算法課程設(shè)計報告
- 課程設(shè)計---電梯調(diào)度算法設(shè)計報告
- 銀行家算法課程設(shè)計報告
- 廢瓶剔除機(jī)的機(jī)械手課程設(shè)計
- 磁盤調(diào)度算法程序課程設(shè)計報告
- 銀行家算法課程設(shè)計報告
- 磁盤調(diào)度算法程序課程設(shè)計報告
- 算法課程設(shè)計
- 課程設(shè)計報告----內(nèi)排序算法比較
- 磁盤調(diào)度算法程序課程設(shè)計報告
- 算法課程設(shè)計
- 列主消元法課程設(shè)計
- c實現(xiàn)關(guān)鍵路徑算法課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告
評論
0/150
提交評論