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