計算機圖形學課程設計(論文)-花園小屋設計_第1頁
計算機圖形學課程設計(論文)-花園小屋設計_第2頁
計算機圖形學課程設計(論文)-花園小屋設計_第3頁
計算機圖形學課程設計(論文)-花園小屋設計_第4頁
計算機圖形學課程設計(論文)-花園小屋設計_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGEXX大學計算機圖形學課程設計論文(花園小屋設計)院系:專業(yè):班級:學號:姓名:日期:年月日目錄一、系統(tǒng)的初始化 11.畫圖前的初始化 12.數(shù)據(jù)載入 12.1定義紋理 12.2光照的載入 52.3顯示列表的載入 53.對象模型的建立 63.1空間背景 63.2月亮 73.3小屋 83.4樹 93.5桌子和凳子 103.6噴泉 10二、場景光照及材質(zhì)屬性的設置 11三、交互設計 11四、程序運行效果圖 12第13頁共13頁一、系統(tǒng)的初始化1.畫圖前的初始化本程序中光照的使用,首先由于模擬的室外場景且四面和天空都是有紋理構(gòu)成,因此不能有明確的邊界,必須關(guān)閉光照;其次小屋和石桌及樹都僅展示材質(zhì),所以必須開啟光照。為了便于程序統(tǒng)一,所以默認情況下開啟光照、關(guān)閉紋理。glClearColor(0.1,0.4,0.8,0.0);glViewport(0,0,500,500); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix();glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE); glDepthFunc(GL_LESS); //深度測試glEnable(GL_DEPTH_TEST); qobj=gluNewQuadric(); loadlight();pondcaculate();glFrontFace(GL_CCW);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glPixelStorei(GL_UNPACK_ALIGNMENT,1);2.數(shù)據(jù)載入2.1定義紋理選擇圖片:結(jié)合數(shù)字圖像處理課程中隊bmp圖像讀取技術(shù),本程序使用的紋理是bmp位圖。為避免復雜的調(diào)色板所以處理一律使用24位圖;并且由于OpenGL紋理要求使用的寬和高都是2的n次冪。打開位圖文件后將其中的圖像數(shù)據(jù)存儲到內(nèi)存中們作為紋理數(shù)據(jù)的來源,由于位圖文件的像素樣式存儲順序為GBR,因此必須將其調(diào)整后方可以使用。使用glTexParaneteri和glTexImage2D定義紋理屬性。voidreadimage(char*filename,BYTE*imagedata)//所讀圖片均為24位bmp,且寬度補齊至四字節(jié)邊界{ BITMAPFILEHEADERbf;//文件頭 BITMAPINFOHEADERbi;//信息頭 intm_ImageWidth;//圖象寬度 intm_ImageHeight;//圖象高度 FILE*fp1;//文件指針,fp1為源文件 //打開文件,到文件指針 if((fp1=fopen(filename,"rb"))==NULL) { MessageBox(NULL,"文件打開錯誤","warning",MB_OK); } fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1);//讀取文件頭,讀取以后文件指針在文件頭末尾(即信息頭) fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1);//讀取信息頭 m_ImageWidth=bi.biWidth;//給圖象寬度賦值 m_ImageHeight=bi.biHeight;//給圖象高度賦值 fread(imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1);//讀取圖象數(shù)據(jù) fclose(fp1);}voidadjustimage(BYTE*imagedata,intw,inth){ BYTEtemp; for(inti=0;i<w*h;i++) { temp=imagedata[i*3]; imagedata[i*3]=imagedata[i*3+2]; imagedata[i*3+2]=temp; }}voidloadtexture(){//側(cè)面的紋理glGenTextures(5,&texName);glBindTexture(GL_TEXTURE_2D,texName);{ BYTEimagemoon[256][256][3]; //月亮的紋理 readimage("moon.bmp",&imagemoon[0][0][0]); adjustimage(&imagemoon[0][0][0],256,256); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagemoon);}{ BYTEimagesky[256][64][3]; readimage("starlow.bmp",&imagesky[0][0][0]); adjustimage(&imagesky[0][0][0],256,64); glBindTexture(GL_TEXTURE_2D,texName+1); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,64,0,GL_RGB,GL_UNSIGNED_BYTE,imagesky);}{ BYTEimagefloor[256][256][3];//地面的紋理 readimage("floor.bmp",&imagefloor[0][0][0]); adjustimage(&imagefloor[0][0][0],256,256); glBindTexture(GL_TEXTURE_2D,texName+2); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagefloor);}{ BYTEimagedoor[256][256][3]; //柵欄面的紋理 readimage("door.bmp",&imagedoor[0][0][0]); adjustimage(&imagedoor[0][0][0],256,256); glBindTexture(GL_TEXTURE_2D,texName+3); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagedoor);}{ BYTEimageroof[128][128][3];//屋頂?shù)募y理 readimage("roof.bmp",&imageroof[0][0][0]); adjustimage(&imageroof[0][0][0],128,128); glBindTexture(GL_TEXTURE_2D,texName+4); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,imageroof);}}2.2光照的載入使用一個方向光源,亮度稍暗。voidloadlight(){ GLfloatlight_ambient[]={0.8,0.8,0.8,1.0}; GLfloatlight_diffuse[]={0.6,0.6,0.6,1.0}; GLfloatlight_specular[]={0.6,0.6,0.6,1.0}; GLfloatlight_position[]={30.0,60.0,50.0,0.0}; glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);2.3顯示列表的載入本程序中大多數(shù)模型繪圖均用顯示裂變完成,在紋理載入之后,載入顯示列表,以供主繪圖函數(shù)display調(diào)用。 drawwalllist=glGenLists(1); glNewList(drawwalllist,GL_COMPILE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+3); glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,1);glVertex3f(150,100,-150); glTexCoord2f(0.0,1);glVertex3f(-150,100,-150); glTexCoord2f(0.35,0.35);glVertex3f(-150,100,-150); glTexCoord2f(0.35,1.0);glVertex3f(150,100,-150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(1.0,0.35);glVertex3f(-150,100,150); glEnd();3.對象模型的建立3.1空間背景空間由六個面的正長方體構(gòu)成,長和寬為300,高為200,在繪圖時按里面為逆時針繪制,關(guān)閉光照,直接貼紋理。voiddrawWalls() drawwalllist=glGenLists(1); glNewList(drawwalllist,GL_COMPILE); glDisable(GL_LIGHTING);//關(guān)閉光照,開啟二維紋理 glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+3);//貼四周的紋理 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,1);glVertex3f(150,100,-150); glTexCoord2f(0.0,1);glVertex3f(-150,100,-150); glTexCoord2f(0.35,0.35);glVertex3f(-150,100,-150); glTexCoord2f(0.35,1.0);glVertex3f(150,100,-150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(1.0,0.35);glVertex3f(-150,100,150); glEnd(); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+1);//貼天空的紋理 glBegin(GL_QUADS); glTexCoord2f(0.0,1.0);glVertex3f(150,100,-150); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(0.0,1.0);glVertex3f(150,100,150); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,150); glTexCoord2f(1.0,1.0);glVertex3f(-150,100,150); glTexCoord2f(1.0,1.0);glVertex3f(-150,100,-150); glTexCoord2f(0.0,1.0);glVertex3f(-150,100,150); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,-150); glEnd(); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+2);//貼地面的紋理 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,1.0);glVertex3f(-150,-100,150); glTexCoord2f(0.0,1.0);glVertex3f(150,-100,150); glEnd(); glDisable(GL_TEXTURE_2D);//關(guān)閉二維紋理光照,開啟光照 glEnable(GL_LIGHTING); glEndList();}3.2月亮月亮的繪制由一個gluSphere函數(shù)繪制,為使月亮看起來更真實。貼上紋理,在這里紋理坐標計算使用自動紋理生成。voidMoon(){ moonlist=glGenLists(1); glNewList(moonlist,GL_COMPILE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName); gluSphere(qobj,25,20,20); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEndList();}3.3小屋小屋的構(gòu)建是用glut庫中的glutSolidCone和glutSulidCube分別構(gòu)成屋頂和房體,屋頂上使用自動計算紋理坐標貼上紋理,窗子和門用正方體通過幾何變換構(gòu)成。voidroof(){ rooflist=glGenLists(1); glNewList(rooflist,GL_COMPILE); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+4); glutSolidCone(50,50,10,10); glTranslatef(-50,0,30); glutSolidCone(50,50,10,10); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); glEndList();}3.4樹樹是整個場景中較為復雜的部分,有三部分構(gòu)成,樹冠有一個球體構(gòu)成,樹干有一個上小下大的圓合成,樹下的小土坡由二維求值器生成。voidtree(){ treelist=glGenLists(1); glNewList(treelist,GL_COMPILE); glPopMatrix(); glPushMatrix(); material(0.2,0.1,0.1,0.2,0.1,0.1,0.0,0.0,0.0); glTranslatef(0,10,0); glRotatef(-90,1,0,0); gluCylinder(qobj,6,2,40,20,10); glPopMatrix(); glPushMatrix(); glTranslatef(0,75,0); material(0.1,0.3,0.1,0.1,0.3,0.1,0.0,0.0,0.0); glScalef(0.7,1,0.7); gluSphere(qobj,30,20,20); glPopMatrix(); glPushMatrix(); glScalef(0.6,1,0.6); glRotatef(-90,1,0,0); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+2); glEvalMesh2(GL_FILL,0,20,0,20); glDisable(GL_TEXTURE_2D); glEndList();}3.5桌子和凳子桌子和凳子由一個壓扁的正方體做桌面,用一個上小下大的圓臺做支柱;凳子由一個球體拉長在上面做一個正方體片構(gòu)成。桌子和凳子均使用一種暗灰色的材質(zhì),無鏡面反射。3.6噴泉噴泉程序的生成是用粒子運動。這段程序使用鏈表管理粒子的狀態(tài),每個粒子都有有關(guān)它們自身狀態(tài)的一個數(shù)據(jù)結(jié)構(gòu)。structparticle{floatt;//粒子的壽命floatv;//粒子的運動速度floatd;//粒子的運動方向floatx,y,z;//粒子的位置坐標floatxd,zd;//X和Z方向上的增量chartype;//粒子的狀態(tài)(移動或淡化)floata;//粒子淡化的alpha值s

溫馨提示

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

評論

0/150

提交評論