![太陽系運行動畫_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b1.gif)
![太陽系運行動畫_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b2.gif)
![太陽系運行動畫_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b3.gif)
![太陽系運行動畫_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b4.gif)
![太陽系運行動畫_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/20/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b/1fbc3afe-a2df-4a9e-8fdd-d5c99c7fc24b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目 錄大學(xué)計算機科學(xué)與技術(shù)學(xué)院課程設(shè)計報告2009 2010學(xué)年第二學(xué)期課程名稱 計算機圖形學(xué) 設(shè)計題目 實現(xiàn)太陽系運行動畫 學(xué)生姓名 學(xué) 號 專業(yè)班級 指導(dǎo)教師 2010 年 6 月 29 日目 錄目 錄II第1章設(shè)計內(nèi)容與要求11.1總體目標和要求11.2內(nèi)容與要求1第2章 總體設(shè)計22.1 實驗原理2(1) 平移變換2(2) 旋轉(zhuǎn)變換22.2 動畫實現(xiàn)原理2第3章 詳細設(shè)計33.1 球體繪制33.2 鍵盤命令33.3 旋轉(zhuǎn)功能43.4 球體的顯示43.5 程序缺陷5第4章 功能實現(xiàn)64.1月亮繞著地球轉(zhuǎn),地球繞著太陽轉(zhuǎn)64.2 鍵盤命令實現(xiàn)64.3主要的程序清單7第5章 總結(jié)10參考文獻
2、10第1章 基礎(chǔ)知識第1章 設(shè)計內(nèi)容與要求1.1 總體目標和要求目標:以圖形學(xué)算法為目標,深入研究。繼而策劃、設(shè)計并實現(xiàn)一個能夠表現(xiàn)計算機圖形學(xué)算法原理的或完整過程的演示系統(tǒng),并能從某些方面作出評價和改進意見。通過完成一個完整程序,經(jīng)歷策劃、設(shè)計、開發(fā)、測試、總結(jié)和驗收各階段,達到:1)鞏固和實踐計算機圖形學(xué)課程中的理論和算法;2)學(xué)習(xí)表現(xiàn)計算機圖形學(xué)算法的技巧;3)培養(yǎng)認真學(xué)習(xí)、積極探索的精神??傮w要求:策劃、設(shè)計并實現(xiàn)一個能夠充分表現(xiàn)圖形學(xué)算法的演示系統(tǒng),界面要求美觀大方,能清楚地演示算法執(zhí)行的每一個步驟。1.2 內(nèi)容與要求內(nèi)容:(1)掌握動畫基本原理;(2)實現(xiàn)三維幾何變換及其組合;功能
3、要求:(1)利用glutWireSphere創(chuàng)建太陽、地球、月亮三個球體;(2)編寫三維旋轉(zhuǎn)變換矩陣實現(xiàn)“月亮繞著地球轉(zhuǎn),地球繞著太陽轉(zhuǎn)”的效果;第2章 總體設(shè)計第2章 總體設(shè)計2.1 實驗原理設(shè)計利用VC+OpenGL作為開發(fā)平臺設(shè)計程序,實現(xiàn)三維幾何變換及其組合等各項功能。OpenGL的基本幾何變換函數(shù)介紹如下:(1) 平移變換平移變換函數(shù)如下:void glTranslatefd(TYPE x,TYPE y,TYPE z);三個函數(shù)參數(shù)就是目標分別沿三個軸向平移的偏移量。這個函數(shù)表示用這三個偏移量生成的矩陣乘以當前矩陣。當參數(shù)是(0.0,0.0,0.0)時,表示對函數(shù)glTranslat
4、e*()的操作是單位矩陣,也就是對物體沒有影響。(2) 旋轉(zhuǎn)變換旋轉(zhuǎn)變換函數(shù)如下:void glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z);函數(shù)中第一個參數(shù)是表示目標沿從點(x,y,z)到原點的方向逆時針旋轉(zhuǎn)的角度,后三個參數(shù)是旋轉(zhuǎn)的方向點坐標。這個函數(shù)表示用這四個參數(shù)生成的矩陣乘以當前矩陣。當角度參數(shù)是0.0時,表示對物體沒有影響。2.2 動畫實現(xiàn)原理雙緩存技術(shù):這項技術(shù)能使你執(zhí)行繪圖代碼時能夠在一個屏幕之外的緩沖區(qū)內(nèi)進行渲染,然后用交換命令把圖形放到屏幕上。雙緩沖技術(shù)有兩種用途,第一個是有些復(fù)雜的圖形可能要花很長的時間繪制,而你又不希望圖像繪制的所有
5、步驟都被看見,使用雙緩沖技術(shù)就可以合成一幅圖像并在完成后才顯示出來。用戶永遠不會看到不完整的圖像,只有整幅圖像準備就緒之后才會把它在瞬間置于屏幕之上。雙緩沖技術(shù)的第二個用處是制作動畫。每一幀都在畫面外的緩沖區(qū)繪制,完成之后再交換到屏幕上。OpenGL支持雙緩沖,但是并不是真正用來交換前臺緩沖區(qū)和后臺緩沖區(qū)的。實際上,每個OpenGL支持的窗口系統(tǒng)都可以通過一個函數(shù)調(diào)用glutSwapBuffers();來實現(xiàn)前后緩沖區(qū)之間的交換。本此課程設(shè)計使用了雙緩存模式,程序在空閑時一直不停的調(diào)用display函數(shù),這個函數(shù)繪制完圖像后,改變旋轉(zhuǎn)的角度,然后交換雙緩存,這樣,每畫完一幀就交換,形成了動畫。
6、另外,使用了深度緩存,激活了深度測試,這樣,被遮擋的面就不會顯示,大家可以把激活深度緩存的一行去掉看看效果。大家還可以改變變換的方式,達到不同的效果。第3章 詳細設(shè)計第3章 詳細設(shè)計3.1 球體繪制繪制球體需要用到Opengl的函數(shù)如下:void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); 是畫線框球函數(shù)。實體繪制函數(shù)中,radius表示球體的半徑,slices表示球體圍繞z軸分割的數(shù)目,stacks表示球體沿著z軸分割的數(shù)目。 其中太陽、地球和月亮都是用glutWireSphere函數(shù)畫的。利用glutWireSp
7、here函數(shù)可以畫出立體感的線框圖。代碼如下:glutWireSphere( 50.f, 80, 80 );繪制太陽glutWireSphere( 20.f, 40, 40 );繪制地球glutWireSphere(7, 10, 10);繪制月球3.2 鍵盤命令為了更好的實現(xiàn)交互,添加了“”、“”、“”和“”四個鍵盤命令??梢砸圆煌慕嵌葋砜慈齻€球體的相對運動。運用SpecialKeys(int key, int x, int y)函數(shù)的參數(shù)來控制以太陽為中心的球體的旋轉(zhuǎn),函數(shù)主要代碼如下:if(key = GLUT_KEY_UP) xRot -= 5.0f; if(key = GLUT_KE
8、Y_DOWN) xRot += 5.0f; if(key = GLUT_KEY_LEFT) yRot -= 5.0f; if(key = GLUT_KEY_RIGHT) yRot += 5.0f; if(xRot > 360.0f) xRot = 0.0f; if(xRot < -1.0f) xRot = 359.0f; if(yRot > 360.0f) yRot = 0.0f; if(yRot < -1.0f) yRot = 359.0f;當按下四個鍵中的任何一個時,球體的相應(yīng)的xRot或yRot加上或減去5.0f的角度,當xRot > 360.0f或yRot
9、 > 360.0f時就表示轉(zhuǎn)了一圈,重新置零;xRot < -1.0f或yRot < -1.0f時就會變回359.0f,可以繼續(xù)旋轉(zhuǎn)。3.3 旋轉(zhuǎn)功能程序?qū)崿F(xiàn)的具體功能:月亮繞著地球轉(zhuǎn),地球繞著太陽轉(zhuǎn)。glRotatef( earthAngle, 0, 0, 1 );此函數(shù)表示繞著Z軸旋轉(zhuǎn)earthAngle角度,有由當?shù)厍蛐D(zhuǎn)角度超過360時會重新置零,代碼如下:earthAngle += 0.1; if ( earthAngle >= 360 )earthAngle -= 360;月球繞地球旋轉(zhuǎn)實現(xiàn)函數(shù)glRotatef(earthAngle/30.0*360.0,
10、 0.0f, 0.0f, -1.0f);由于地球繞著太陽轉(zhuǎn)的方向和月球繞著地球轉(zhuǎn)的方向相反所以函數(shù)最后一個參數(shù)為-1,又月球繞著地球轉(zhuǎn)大概一個月,所以第一個參數(shù)為earthAngle/30.0*360.0,月球繞著地球轉(zhuǎn)的速度是地球繞公轉(zhuǎn)的12倍。3.4 球體的顯示當三個球體顯示在屏幕上是,在變換窗體的大小時,為了避免顯示的圖形的變形,所以程序添加了一個ChangeSize( GLsizei w, GLsizei h )子程序。在程序中用到有兩個比較重要的投影變換函數(shù),glViewport和glOrtho。glOrtho函數(shù):glOrtho(left, right, bottom, top,
11、near, far), left表示視景體左面的坐標,right表示右面的坐標,bottom表示下面的,top表示上面的。glOrtho是創(chuàng)建一個正交平行的視景體。 一般用于物體不會因為離屏幕的遠近而產(chǎn)生大小的變換的情況。假設(shè)有一個球體,半徑為1,圓心在(0, 0, 0),那么,我們設(shè)定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一個寬高都是3的框框把這個球體整個都裝了進來。 如果設(shè)定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一個寬是1.5, 高是3的框框把整個球體的右面裝進來;如果設(shè)定glOrth
12、o(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一個寬和高都是1.5的框框把球體的右上角裝了進來。glViewport函數(shù):glOrtho函數(shù)只是負責(zé)使用什么樣的視景體來截取圖像,并不負責(zé)使用某種規(guī)則把圖像呈現(xiàn)在屏幕上。glViewport主要完成這樣的功能。它負責(zé)把視景體截取的圖像按照怎樣的高和寬顯示到屏幕上。假設(shè)用一個正方形截面的視景體截取的圖像,但是拉伸到屏幕上顯示的時候顯示屏變寬了, 倒是顯示的時候把一個正方形的圖像“活生生的給拉寬了”。就會產(chǎn)生變形。這樣,就需要調(diào)整OpenGL顯示屏。因為用的正方形的視景體,所以雖然窗體是那么寬,但是只用其中的長就夠了。實現(xiàn)代碼
13、:GLfloat nRange = 250.0f;/ 大小 if(h = 0) h = 1;/ 為窗口尺寸設(shè)置視角 glViewport(0, 0, w, h); /重設(shè)投影映射矩陣堆 glMatrixMode(GL_PROJECTION);/設(shè)置當前矩陣為模型視圖矩陣 glLoadIdentity(); / 重置當前指定的矩陣為單位矩陣 if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange); else glOrtho (-nRange*w/h, nRange*w/h, -nRang
14、e, nRange, -nRange, nRange); glMatrixMode(GL_MODELVIEW); glLoadIdentity();SetupRC()函數(shù)為顯示的設(shè)置函數(shù),有設(shè)置清空顏色,選擇平坦或光滑漸變模式,或被遮住的部分不繪制。3.5 程序缺陷本程序?qū)崿F(xiàn)的功能是太陽、地球和月亮的旋轉(zhuǎn)問題,雖然程序?qū)崿F(xiàn)了,但是還有不足之處。第一:程序的功能不能實現(xiàn)地球的公轉(zhuǎn)軌道不是真正的公轉(zhuǎn)軌道,月球的也不可以。第二:地球的公轉(zhuǎn)周期和月球繞地球轉(zhuǎn)的周期的關(guān)系不是很精確。第三:地球和月球雖然自轉(zhuǎn),但是方向是隨機的,不能確定。第4章 功能實現(xiàn)第4章 功能實現(xiàn)4.1月亮繞著地球轉(zhuǎn),地球繞著太陽轉(zhuǎn)
15、4.2 鍵盤命令實現(xiàn)4.3主要的程序清單#include "GL/glut.h"#include <math.h>#include <stdio.h>static GLfloat xRot = 100.0f;static GLfloat yRot = 0.0f;void SpecialKeys(int key, int x, int y);void ChangeSize( GLsizei w, GLsizei h );void SetupRC();void RenderScene() glClear(GL_COLOR_BUFFER_BIT | GL_
16、DEPTH_BUFFER_BIT);/清空顏色緩沖區(qū),填充的顏色由 glClearColor( 0, 0.0, 0.0, 1 ); 指定為黑色 glPushMatrix();將當前矩陣壓入堆棧 glRotatef(xRot, 1.0f, 0.0f, 0.0f);/x,y,z 定義的是轉(zhuǎn)動軸的位置,模型位置和軸位置越遠,轉(zhuǎn)的越慢,要是軸穿過模型中心,就是自傳 glRotatef(yRot, 0.0f, 1.0f, 0.0f);/繪制太陽 glColor3f( 1.0f, 1.0f, 0.0f );/黃色 glutWireSphere( 50.f, 80, 80 );/畫太陽 /繪制地球stati
17、c GLfloat earthAngle = 0; const GLfloat RADIUS = 100.f;/繞著太陽轉(zhuǎn)的半徑范圍 glRotatef( earthAngle, 0, 0, 1 );/x,y,z 定義的是轉(zhuǎn)動軸的位置,模型位置和軸位置越遠,轉(zhuǎn)的越慢,要是軸穿過模型中心,就是自傳 glTranslatef( 100.f, 100.f, 0 );/物體將在(0.0f,0.0f,0.0f)的位置繪制 glColor3f( 0.1f, 0.1f, 0.7f );/顏色 glutWireSphere( 20.f, 40, 40 ); / 繪制“月亮” glColor3f(1.0f, 1
18、.0f, 1.0f); glRotatef(earthAngle/30.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(RADIUS/3, 0.0f, 0.0f); glutWireSphere(7, 10, 10);/轉(zhuǎn)轉(zhuǎn)轉(zhuǎn)轉(zhuǎn) earthAngle += 0.1; if ( earthAngle >= 360 ) earthAngle -= 360; printf( "Angle:%fn", earthAngle ); glPopMatrix();彈出先前所壓矩陣 glutSwapBuffers();/雙緩沖int main(in
19、t argc, char* argv) glutInit(&argc, argv);/對GLUT進行初始化,本函數(shù)必須在GLUT使用之前被調(diào)用。 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);/設(shè)置顯示方式 glutInitWindowSize (1250, 700);/設(shè)置窗口大小 glutInitWindowPosition (1, 1);/設(shè)置窗口在屏幕中的位置 glutCreateWindow( "計算機-07-4-張坤" );/創(chuàng)建窗口,參數(shù)作為標題 glutDisplayFunc( Re
20、nderScene ); glutIdleFunc (RenderScene); /glutIdleFunc 表示在CPU空閑的時間調(diào)用某一函數(shù) glutReshapeFunc( ChangeSize ); glutSpecialFunc( SpecialKeys ); SetupRC(); glutMainLoop();/設(shè)置一個消息循環(huán) return 1;void SetupRC() glClearColor( 0, 0, 0, 1.0 ); glShadeModel( GL_SMOOTH );/選擇平坦或光滑漸變模式。GL_SMOOTH為后者 glEnable(GL_DEPTH_TEST
21、);/被遮住的部分不繪制void ChangeSize( GLsizei w, GLsizei h ) GLfloat nRange = 250.0f;/ 大小 if(h = 0) h = 1;/ 為窗口尺寸設(shè)置視角 glViewport(0, 0, w, h); /重設(shè)投影映射矩陣堆 glMatrixMode(GL_PROJECTION);/設(shè)置當前矩陣為模型視圖矩陣 glLoadIdentity(); / 重置當前指定的矩陣為單位矩陣 if (w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange); else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange); glMatrixMode(GL_MODELVIEW); glLoadIdentity
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版數(shù)學(xué)八年級上冊15.4.1《提公因式法因式分解》聽評課記錄
- 人教版七年級地理上冊:4.2《世界的語言和宗教》聽課評課記錄1
- 八年級歷史上聽課評課記錄《第一單元第1課鴉片戰(zhàn)爭》聽課評課記錄
- 用維修基金維修電梯主機軸承合同
- 生態(tài)項目投資合作協(xié)議書(2篇)
- 人教版數(shù)學(xué)八年級上冊聽評課記錄15.2.1《分式的乘除》
- 部編版八年級道德與法治下冊第五課《我國基本制度》第3課時《基本政治制度》聽課評課記錄
- 北師大版數(shù)學(xué)一年級上冊第一單元《生活中的數(shù) 第3課時 玩具》聽評課記錄
- 北師大版數(shù)學(xué)五年級上冊《軸對稱再認識(一)》聽評課記錄2
- 冀教版數(shù)學(xué)七年級下冊《數(shù)學(xué)活動 拼圖與分解因式》聽評課記錄
- 初中數(shù)學(xué)教學(xué)“教-學(xué)-評”一體化研究
- 2012年安徽高考理綜試卷及答案-文檔
- 《游戲界面設(shè)計專題實踐》課件-知識點5:圖標繪制準備與繪制步驟
- 自動扶梯安裝過程記錄
- MOOC 材料科學(xué)基礎(chǔ)-西安交通大學(xué) 中國大學(xué)慕課答案
- 智慧供熱管理系統(tǒng)方案可行性研究報告
- 帕金森病的言語康復(fù)治療
- 中國城市居民的健康意識和生活方式調(diào)研分析報告
- 上海星巴克員工手冊
- 貓狗創(chuàng)業(yè)計劃書
- 復(fù)產(chǎn)復(fù)工試題含答案
評論
0/150
提交評論