太陽、月球、地球模型_第1頁
太陽、月球、地球模型_第2頁
太陽、月球、地球模型_第3頁
太陽、月球、地球模型_第4頁
太陽、月球、地球模型_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗六實驗目的與要求:實現(xiàn)太陽、地球、月球的運動模型。創(chuàng)建一個球體動畫,實現(xiàn)自由落體運動。實驗內容:通過不斷修改旋轉角度參數(shù)來實現(xiàn)天地運動;創(chuàng)建一個球體動畫,使其在窗口內做自由落體,并在撞擊到地面后彈回原來的高度實驗步驟:相關算法及原理描述:動畫的實現(xiàn)是通過不斷修改旋轉變換的角度參數(shù)來實現(xiàn)的。在實現(xiàn)動畫時,需要創(chuàng)建一個循環(huán),在每次調用顯示回調函數(shù)之前改變角度參數(shù)的值,使地球和月球看起來像繞著原子旋轉。為了不斷地調用顯示回調函數(shù),需要利用GLUT庫中的函數(shù):voidTimerFunc(unsignedintmsecs,(*func)(intvalue),intvalue);指定一個定時器回調函數(shù),即經過msecs毫秒后由GLUT調用指定的函數(shù),并將value值傳遞給它。被定時器調用的函數(shù)原型為:voidTimerFunction(intvalue);但是,這個函數(shù)與其他的回調函數(shù)不一樣,該函數(shù)只能調用一次。為了實現(xiàn)連續(xù)的動畫,必須在定時器函數(shù)中再次設置定時器回調函數(shù)。為了使動畫效果更好,需要使用雙緩存技術,以及深度測試函數(shù)。深度測試即當?shù)厍蚧蛟虑蜻\動到太陽的背面時,由于地球和月球是后繪制的,所以無法被太陽擋住,解決辦法是啟用深度測試。深度測試是一種移除被擋住表面的有效技術,它的過程是:繪制一個像素時,會給它分配一個值(稱為z值),這個值表示它與觀察者的距離。然后,如果需要在同一位置上繪制另一個像素,將比較新像素和已經保存在該位置的像素的z值。如果新像素的z值小,即它離觀察者更近因而在原來那個像素的前面,原來的像素就會被新像素擋住。這一操作在內部由深度緩沖區(qū)完成。為了啟用深度測試,只要調用函數(shù):glEnable(GL_DEPTH_TEST);打開深度測試功能。要使用深度測試,必須在創(chuàng)建窗口時指定其具有深度緩沖區(qū),代碼為:glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);并且,為了使深度緩沖區(qū)正常完成深度測試功能,在每次渲染場景時,必須使用函數(shù):glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);消除深度緩沖區(qū)。程序設計:主要用到的新函數(shù)glEnable(GL_DEPTH_TEST);啟用深度測試glutSolidSphere(50.0f,20,20);畫球體voidTimerFunc(intvalue)指定定時器回調函數(shù)測試結果:(1)、太陽、地球、月亮運動模型:(2)、小球自由落體實驗總結:通過此次的實驗了解怎么在opengl中實現(xiàn)動畫和深度測試。此次的實驗有一定的難度。特別是小球自由落體運動的動畫,開始的時候基本沒想法。通過查看資料,才對其有一點理解,但還不是很懂,只是在查閱的資料的基礎上做了一些修改,并沒有太大的改動。但是此次的實驗,完全可以和后面兩章的內容結合,使用光照模型,繪制出具有真實感的圖形。附錄:(1)、太陽、地球、月亮運動模型#include<gl/glut.h>floatfElect1=2.0f;//地球繞太陽的旋轉角度floatfElect2=24.0f;//月球繞地球的旋轉角度voidInitial(){glEnable(GL_DEPTH_TEST);//啟用深度測試glClearColor(0.0f,0.0f,0.0f,0.8f);//背景為黑色}voidChangeSize(intw,inth){GLfloatfAspect;if(0==h)h=1;glViewport(0,0,w,h);//設置視區(qū)尺寸glMatrixMode(GL_PROJECTION);//指定當前操作投影矩陣堆棧glLoadIdentity();//重置投影矩陣fAspect=(float)w/(float)h;//計算視區(qū)的寬高比gluPerspective(45.0f,fAspect,1.0f,1000.0f);//指定透視投影的觀察空間glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除顏色和深度緩沖區(qū)glMatrixMode(GL_MODELVIEW);//指定當前操作模型視圖矩陣堆棧glLoadIdentity();//重置模型視圖矩陣glTranslatef(0.0f,0.0f,-500.0f);//將圖形沿z軸負向移動//畫太陽 glColor3f(1.0f,0.0f,0.0f);glutSolidSphere(50.0f,20,20);//畫地球glColor3f(0.0f,0.0f,1.0f);glRotatef(23.27,0.0,0.0,1.0);//地球與太陽的黃赤交角glRotatef(fElect1,0.0f,1.0f,0.0f);glTranslatef(200.0f,0.0f,0.0f);glutSolidSphere(20.0f,20,20);//畫月球glPopMatrix();glPopMatrix();glRotatef(6.0f,1.0f,1.0f,1.0f);glRotatef(fElect2,0.0f,1.0f,0.0f);glColor3f(1.0f,1.0f,0.0f);glTranslatef(30.0f,0.0f,0.0f);glutSolidSphere(5.0f,20,20);glLoadIdentity();fElect1+=2.0f;//增加旋轉步長,產生動畫效果if(360.0f<fElect1)fElect1=2.0f;fElect2+=24.0f;if(360.0f<fElect2)fElect2=24.0f;glFlush();glutSwapBuffers();}voidTimerFunc(intvalue){glutPostRedisplay();glutTimerFunc(100,TimerFunc,1);//100毫秒后調用定時器回調函數(shù)}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//窗口使用RGB顏色,雙緩存和深度緩存 glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow("天體運動動畫");glutReshapeFunc(ChangeSize);glutDisplayFunc(Display);glutTimerFunc(500,TimerFunc,1);//指定定時器回調函數(shù)Initial();glutMainLoop();return0;}(2)、小球自由落體#include<GL/glut.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<math.h>#definePI3.1415926doublemove=10.0;inti=0;intdown=1;intcount=1;doubletimeSpan=0; //下降到底所需時間doublemovey=0.0;doubleduration=0.0; //持續(xù)時間doublelength=0.0;clock_tstart,end;voidinit(void){ printf("init"); glClearColor(0.0,1.0,0.0,0.0); glColor3ub(23,17,215); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST);//啟用深度測試}voidreshape(intw,inth){ printf("reshape");glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h) glOrtho(-12,12,-12*(GLfloat)(h)/(GLfloat)(w),12*(GLfloat)(h)/(GLfloat)(w),-1.0,1.0);elseglOrtho(-12*(GLfloat)(w)/(GLfloat)(h),12*(GLfloat)(w)/(GLfloat)(h),-12,12,-1.0,1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidinitDisplay(void){ printf("initDisplay()"); down=1; //向下運動 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0,20.0,0.0); glutSolidSphere(1.0,40,40); glutSwapBuffers();}voiddisplay(void){ printf("Display()"); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,move,0.0); glutSolidSphere(1.0,40,40); glutSwapBuffers();}voidMoveSphereUp(){ end=clock(); duration=(double)(end-start-16.0)/CLOCKS_PER_SEC; length=5*(timeSpan-duration)*(timeSpan-duration);move=20-length; if(move>9.932){ move=10; down=1; printf("%i",down); start=clock(); }display();glLoadIdentity(); }voidMoveSphereDown(){ if(count==1){ start=clock(); count=0; } end=clock(); duration=(double)(end-start)/CLOCKS_PER_SEC; length=5*duration*duration;move=10-length; if(move<-10){ timeSpan=duration;//記下下降所經歷的時間 move=-10; start=clock(); down=0;//向上運動 }display();glLoadIdentity();}voidTimerFunc2(intvalue){ if(i==0){//left GLfloatlight_position[]={2.0,0.0,0.0,0.0}; } if(i==1){//left-up GLfloatlight_position[]={2.0,2.0,0.0,0.0}; } if(i==2){//up GLfloatlight_position[]={0.0,2.0,0.0,0.0}; } if(i==3){//up-right GLfloatlight_position[]={-2.0,2.0,0.0,0.0}; } if(i==4){//right GLfloatlight_position[]={-2.0,0.0,0.0,0.0}; } if(i==5){//right-down GLfloatlight_position[]={-2.0,-2.0,0.0,0.0}; } if(i==6){//down GLfloatlight_positi

溫馨提示

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

評論

0/150

提交評論