opengl實(shí)現(xiàn)--太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型及小球的自由落體運(yùn)動(dòng).doc_第1頁(yè)
opengl實(shí)現(xiàn)--太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型及小球的自由落體運(yùn)動(dòng).doc_第2頁(yè)
opengl實(shí)現(xiàn)--太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型及小球的自由落體運(yùn)動(dòng).doc_第3頁(yè)
opengl實(shí)現(xiàn)--太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型及小球的自由落體運(yùn)動(dòng).doc_第4頁(yè)
opengl實(shí)現(xiàn)--太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型及小球的自由落體運(yùn)動(dòng).doc_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn)六1、 實(shí)驗(yàn)?zāi)康暮鸵罅私馇艺莆誒penGL中包含的有關(guān)三維變換的操作,并且做出模型視圖變換、投影變換和視見(jiàn)區(qū)變換的實(shí)例。2、 實(shí)驗(yàn)內(nèi)容1)在OpenGL中繪制太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型。2)在OpenGL中創(chuàng)建一個(gè)球體動(dòng)畫(huà),使球體在窗口內(nèi)做自由落體運(yùn)動(dòng),并在撞擊地面(窗口的下邊界)后能夠彈回原來(lái)的高度。3、 實(shí)驗(yàn)步驟1) 相關(guān)算法及原理描述 矩陣堆棧在計(jì)算機(jī)圖形學(xué)中,所有的變換都是通過(guò)矩陣乘法來(lái)實(shí)現(xiàn)的,即將三維形體頂點(diǎn)構(gòu)成的齊次坐標(biāo)矩陣乘以三維變換矩陣就得到變換后的形體頂點(diǎn)的其次坐標(biāo)矩陣,這樣只要求出形體三維變換矩陣,就可以得到變換后的形體。在OpenGL中,對(duì)象的變換也是通過(guò)矩陣來(lái)實(shí)現(xiàn)的。在進(jìn)行矩陣操作前,需要指定當(dāng)前操作的矩陣對(duì)象,可以使用函數(shù)glMatrixMode(GLenum mode); 定義。矩陣堆棧主要用來(lái)保存和恢復(fù)矩陣的狀態(tài),主要用于具有層次結(jié)構(gòu)的模型繪制中,以提高繪圖效率。利用函數(shù)void glPushMatrix(void);Void glPopMatrix(void); 實(shí)現(xiàn)矩陣堆棧的操作。矩陣堆棧是有深度的,如果超出了堆棧深度或當(dāng)堆棧為空時(shí)試圖彈出棧頂矩陣,都會(huì)發(fā)生錯(cuò)誤。可以用下面函數(shù)獲得堆棧深度的最大值: glGet(GL_MAX_MODELVIEW_STACK_DEPTH); glGet(GL_MAX_PROJECTION_STACK_DEPTH); 模型視圖變換模型視圖矩陣是一個(gè)4*4的矩陣,用于指定場(chǎng)景的視圖變換和幾何變換。在進(jìn)行模型視圖矩陣操作前,必須調(diào)用函數(shù)glMatrixMode(GL_MODELVIEW)指定變換只能影響模型試圖矩陣。主要有以下兩種方法。121、直接定義矩陣?yán)煤瘮?shù) void glLoadMartrixfd(const TYPE *m);將m所指定的矩陣置為當(dāng)前矩陣堆棧的棧頂矩陣。 122、利用高級(jí)矩陣函數(shù) 平移矩陣函數(shù):void glTranslatedf(TYPE x,TYPE y,TYPE z); 用當(dāng)前矩陣乘以平移矩陣。 旋轉(zhuǎn)矩陣函數(shù) void glRotatedf(TYPE angle,TYPE x,TYPW y,TYPE z); 縮放矩陣函數(shù) void glScaledf(TYPE x,TYPE y,TYPE z); 如不需要效果積累可調(diào)用重置矩陣函數(shù)void glLoadIdentity(void); 該函數(shù)將單位矩陣置為當(dāng)前變換矩陣。 投影變換有兩種投影方式,不管調(diào)用哪種,必須調(diào)用glMAtrixMode(GL_PROJECTION);指定當(dāng)前處理的矩陣是投影變換矩陣。131、正投影它的有限觀察空間是一個(gè)長(zhǎng)方體,無(wú)論物體距離相機(jī)多遠(yuǎn),投影后的物體大小尺寸不變。正投影函數(shù)有兩個(gè):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、透視投影特點(diǎn)是距離視點(diǎn)近的物體大,距離視點(diǎn)遠(yuǎn)的物體小,遠(yuǎn)到極點(diǎn)即為消失。透視投影函數(shù)也有兩個(gè): 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) 程序調(diào)試、測(cè)試與運(yùn)行結(jié)果分析 太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型 小球的自由落體運(yùn)動(dòng)4、 附錄(1)太陽(yáng)、地球和月亮的運(yùn)動(dòng)模型#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)小球的自由落體運(yùn)動(dòng)#include#include#include#include#include#define PI 3.1415926double move=20.0;int i=0;int down=1;int count=1;double timeSpan=0;/下降到底所需時(shí)間double movey=0.0;double duration=0.0;/持續(xù)時(shí)間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); /啟用深度測(cè)試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; /記下下降所經(jīng)歷的時(shí)間move=-20;start=clock(); down=0; /向上運(yùn)動(dòng) 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論