opengl實現--太陽、地球和月亮的運動模型及小球的自由落體運動.doc_第1頁
opengl實現--太陽、地球和月亮的運動模型及小球的自由落體運動.doc_第2頁
opengl實現--太陽、地球和月亮的運動模型及小球的自由落體運動.doc_第3頁
opengl實現--太陽、地球和月亮的運動模型及小球的自由落體運動.doc_第4頁
opengl實現--太陽、地球和月亮的運動模型及小球的自由落體運動.doc_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

實驗六1、 實驗目的和要求了解且掌握OpenGL中包含的有關三維變換的操作,并且做出模型視圖變換、投影變換和視見區變換的實例。2、 實驗內容1)在OpenGL中繪制太陽、地球和月亮的運動模型。2)在OpenGL中創建一個球體動畫,使球體在窗口內做自由落體運動,并在撞擊地面(窗口的下邊界)后能夠彈回原來的高度。3、 實驗步驟1) 相關算法及原理描述 矩陣堆棧在計算機圖形學中,所有的變換都是通過矩陣乘法來實現的,即將三維形體頂點構成的齊次坐標矩陣乘以三維變換矩陣就得到變換后的形體頂點的其次坐標矩陣,這樣只要求出形體三維變換矩陣,就可以得到變換后的形體。在OpenGL中,對象的變換也是通過矩陣來實現的。在進行矩陣操作前,需要指定當前操作的矩陣對象,可以使用函數glMatrixMode(GLenum mode); 定義。矩陣堆棧主要用來保存和恢復矩陣的狀態,主要用于具有層次結構的模型繪制中,以提高繪圖效率。利用函數void glPushMatrix(void);Void glPopMatrix(void); 實現矩陣堆棧的操作。矩陣堆棧是有深度的,如果超出了堆棧深度或當堆棧為空時試圖彈出棧頂矩陣,都會發生錯誤。可以用下面函數獲得堆棧深度的最大值: glGet(GL_MAX_MODELVIEW_STACK_DEPTH); glGet(GL_MAX_PROJECTION_STACK_DEPTH); 模型視圖變換模型視圖矩陣是一個4*4的矩陣,用于指定場景的視圖變換和幾何變換。在進行模型視圖矩陣操作前,必須調用函數glMatrixMode(GL_MODELVIEW)指定變換只能影響模型試圖矩陣。主要有以下兩種方法。121、直接定義矩陣利用函數 void glLoadMartrixfd(const TYPE *m);將m所指定的矩陣置為當前矩陣堆棧的棧頂矩陣。 122、利用高級矩陣函數 平移矩陣函數:void glTranslatedf(TYPE x,TYPE y,TYPE z); 用當前矩陣乘以平移矩陣。 旋轉矩陣函數 void glRotatedf(TYPE angle,TYPE x,TYPW y,TYPE z); 縮放矩陣函數 void glScaledf(TYPE x,TYPE y,TYPE z); 如不需要效果積累可調用重置矩陣函數void glLoadIdentity(void); 該函數將單位矩陣置為當前變換矩陣。 投影變換有兩種投影方式,不管調用哪種,必須調用glMAtrixMode(GL_PROJECTION);指定當前處理的矩陣是投影變換矩陣。131、正投影它的有限觀察空間是一個長方體,無論物體距離相機多遠,投影后的物體大小尺寸不變。正投影函數有兩個:void glOrtho(GLdouble left,GLdouble right,GLdouble botton,GLdouble top,GLdouble near,GLdouble far); void gluOrtho2D(GLdouble left,GLdouble right,GLdoubl botton,GLdouble top); 1.3.2、透視投影特點是距離視點近的物體大,距離視點遠的物體小,遠到極點即為消失。透視投影函數也有兩個: void glFrustum(GLdouble left,GLdouble Right,GLdouble botton,GLdouble top,GLdouble near,GLdouble far); void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);2) 程序調試、測試與運行結果分析 太陽、地球和月亮的運動模型 小球的自由落體運動4、 附錄(1)太陽、地球和月亮的運動模型#include static int day = 200;void display() glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75,1,1,400000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,-200000,200000, 0,0,0, 0,0,1); glColor3f(1,0,0);/sun glutSolidSphere(69600,20,20); glColor3f(0,0,1); glRotatef(day,0,0,-1); glTranslatef(150000,0,0);/earth glutSolidSphere(15945,20,20); glColor3f(1,1,0); glRotatef(day/30.0*360 - day, 0,0,-1); glTranslatef(38000,0,0);/moon glutSolidSphere(4345,20,20); glutSwapBuffers();void timer(int p) day +; if(day 360)day = 0; glutTimerFunc(50,timer,0); glutPostRedisplay();int main(int argc,char *argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow(earth,moon,sun); glutInitWindowSize(400,400); glutDisplayFunc(display); glutTimerFunc(50,timer,0); glutMainLoop(); return 0;(2)小球的自由落體運動#include#include#include#include#include#define PI 3.1415926double move=20.0;int i=0;int down=1;int count=1;double timeSpan=0;/下降到底所需時間double movey=0.0;double duration=0.0;/持續時間double length=0.0;clock_t start,end;void init(void)printf( init);GLfloat mat_specular=220.220,220.0,220.0,220.0;GLfloat mat_shininess=70.0;GLfloat light_position=0.0, 0.0, 0.0, -2.0; /r-l u-d f-bGLfloat ambientLight = 0.2f, 0.2f, 0.2f, 1.0f ;GLfloat diffuseLight = 0.6f, 0.6f, 0.6f, 1.0f ;GLfloat specular = 1.0f, 1.0f, 1.0f, 1.0f;glClearColor(0.3,0.8,0.8,0.0); /bgcglColor3ub(23, 17, 215);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST); /啟用深度測試void reshape(int w,int h)printf( reshape); glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w19.932) move=20;down=1;printf(%i,down);start=clock(); display(); glLoadIdentity();void MoveSphereDown()if(count=1)start=clock();count=0;end=clock();duration = (double)(end - start) /CLOCKS_PER_SEC;length=5*duration*duration; move=20-length;if(move-20) timeSpan=duration; /記下下降所經歷的時間move=-20;start=clock(); down=0; /向上運動 display(); glLoadIdentity();void TimerFunc2(int value)if(i=0) /leftGLfloat light_position=2.0,0.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=1) /left-upGLfloat light_position=2.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position); if(i=2) /upGLfloat light_position=0.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=3) /up-rightGLfloat light_position=-2.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=4) /rightGLfloat light_position=-2.0,0.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=5) /right-downGLfloat light_position=-2.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=6) /downGLfloat light_position=0.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=7) /down-leftGLfloat light_position=2.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);i=(+i)%8;printf(%i,i);glutTimerFunc(60,TimerFunc2,1);void TimerFunc1(int value)if(down=1)MoveSphereDown();if(down=0)MoveSphereUp();glutTimerFunc(10,TimerFunc1,0);int main(int argc,char *argv)glutInit(&argc,argv);glutInitDisplay

溫馨提示

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

評論

0/150

提交評論