電子科大實驗4-三維圖形程序設計_第1頁
電子科大實驗4-三維圖形程序設計_第2頁
電子科大實驗4-三維圖形程序設計_第3頁
電子科大實驗4-三維圖形程序設計_第4頁
電子科大實驗4-三維圖形程序設計_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗報告課程名稱:三維圖形設計學院:計算機科學與工程專業(yè):計算機科學與技術(shù)指導教師:周川學生姓名:學號:實驗成績:日期:2014年5月26日電子科技大學計算機學院實驗中心電 子 科 技 大 學實 驗 報 告一、實驗四:OpenGL紋理映射編程實驗二、實驗室名稱:主樓A2-412 實驗時間:2014年5月26日 三、實驗目的:1、理解OpenGL紋理映射的相關原理;2、掌握與紋理映射相關的OpenGL API函數(shù)及其用法;3、熟悉紋理映射設置的基本步驟。四、實驗原理:1. openGL圖形編程技術(shù)原理2. 紋理映射、紋理參數(shù)設置、紋理坐標的自動生成、紋理對象、數(shù)字紋理、圖片紋理、光照、變換、菜單

2、。3.BMP知識:【基本組成】BMP文件是windows采用的圖形文件格式,以像素為基本單位。一般由4部分組成,位圖文件頭,位圖信息頭,彩色表(24位不用彩色表),圖像數(shù)據(jù)?!窘獯a相關】1) windows.h中有BITMAPFILEHEADER和BITMAPINFOHEADER表示位圖文件頭和位圖信息頭。2) 一般BMP的24位圖像是以BGR存儲的,處理時需要注意。3) 一般BMP圖像是從下到上,從左到右進行描述;PHOTOSHOP中有翻轉(zhuǎn)行序(flip row over),采用了解碼方便的從上到下從左到右描述,但處理時必須注意圖像數(shù)據(jù)是相反的,高度是負值。4) 如果一個圖像水平線字節(jié)數(shù)不是

3、4的倍數(shù),這行就用空字節(jié)補齊,通常是ASCII 0。4. gluBuild2DMipmaps對BMP圖片要求很低,任意大小都行,但是不太穩(wěn)定。glTexImage2D支持64,128,256分辨率BMP,其他大小的可能會出現(xiàn)問題,穩(wěn)定。五、實驗內(nèi)容:(一)編程任務1繪制一個具有紋理和光照的房間為在第三次實驗中生成的房間(如上圖)添加數(shù)字圖像生成的紋理。要求:1、 使用紋理對象;2、 墻壁、地板和天花板的數(shù)字圖像生成的紋理要不相同;3、 屋內(nèi)至少有一個點光源;4、 可用右鍵菜單交互式的開啟或關閉場景光照和紋理;5、 可用右鍵菜單設置紋理環(huán)境(GL_REPLACE和GL_MODULATE)。分析這

4、兩種方式中哪種適宜于有光照的環(huán)境下。(二)編程任務2繪制一個具有背景紋理的鐘表為在第二次次實驗中生成的鐘表上添加數(shù)字圖像生成的紋理或者圖片紋理。六、實驗器材(設備、元器件):電腦型號戴爾 System Inspiron N4110 筆記本電腦操作系統(tǒng) Windows 8 專業(yè)版 64位 ( DirectX 11 )軟件環(huán)境 Microsoft Visual Studio Express 2012 for Windows Desktop OpenGL Glut3.7七、實驗步驟:1.利用第三次實驗的光照房間,去除多余功能。2.用紋理對象和數(shù)字紋理進行貼圖。 3.利用第二次實驗的鐘表,去除多余功能

5、。4.用紋理對象和如下BMP圖片紋理進行貼圖(PSCS6生成,大小480480px,24位位圖)。BMP貼圖圖片(G:/clockbg.bmp)BMP格式參數(shù)(無翻轉(zhuǎn)行序)八、實驗數(shù)據(jù)及結(jié)果分析:(一)紋理房間1. 代碼:#include#include#define W 500/窗口寬#define H 500/窗口高/材質(zhì)屬性結(jié)構(gòu)定義typedef struct matattrGLfloat ambient4;GLfloat diffuse4;GLfloat specular4;GLfloat shininess;matattr;/各種材質(zhì)數(shù)據(jù)設置matattr ball=0.2,0.3,

6、0.3,1.0,0.3,0.3,0.85,1.0,0.5,0.5,0.81,1.0,50.0;matattr cone=0.3,0.0,0.0,1.0,0.6,0.0,0.0,1.0,0.8,0.6,0.6,1.0,50.0;matattr wall=0.2,0.5,0.5,1.0,0.2,0.5,0.5,1.0,0.9,0.9,0.9,1.0,100.0;matattr ceiling=0.5,0.5,0.7,1.0,0.5,0.5,0.9,1.0,0.9,0.9,0.9,1.0,100.0;matattr ground=0.9,0.0,0.4,1.0,0.9,0.0,0.4,1.0,0.9

7、,0.9,0.9,1.0,100.0;matattr light=1.0,1.0,0.1,1.0,1.0,1.0,0.1,1.0,0.8,0.8,0.2,1.0,50.0;/0光照(點光源)屬性GLfloat position0=-2.0,3.0,8.0,1.0;GLfloat ambient0=0.1,0.1,0.1,1.0;GLfloat diffuse0=1.0,1.0,0.8,1.0;GLfloat specular0=1.0,1.0,1.0,1.0;/法向量GLfloat normals3=1.0,0.0,0.0,0.0,1.0,0.0,0.0,-1.0,0.0,0.0,-1.0,0

8、.0,0.0,0.0,-1.0,0.0,0.0,1.0;/全局光照參數(shù)設置(不使用默認的全局光)GLfloat global_ambient=0.5,0.5,0.5,1.0;/圖片貼圖數(shù)組GLubyte image443;GLubyte image2443;GLubyte image3443;GLuint TextureIDList 3;GLUquadric *p;/=/=/賦予材質(zhì)函數(shù)void evmat(matattr *mat)glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat-ambient);glMaterialfv(GL_FRONT_AND_

9、BACK,GL_DIFFUSE,mat-diffuse);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat-specular);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mat-shininess);/創(chuàng)建房間void CreateWall()glBindTexture(GL_TEXTURE_2D,TextureIDList1);/調(diào)已經(jīng)加載進內(nèi)存的紋理對象evmat(&wall);glNormal3fv(normals0);glBegin(GL_POLYGON);/前面glTexCoord2f(0.0,0

10、.0);glVertex3f(-5.0,-5.0,0.0);glTexCoord2f(0.0,15.0);glVertex3f(-5.0,5.0,0.0);glTexCoord2f(15.0,15.0);glVertex3f(-5.0,5.0,10.0);glTexCoord2f(15.0,0.0);glVertex3f(-5.0,-5.0,10.0);glEnd();glNormal3fv(normals1);glBegin(GL_POLYGON);/左邊glTexCoord2f(0.0,0.0);glVertex3f(5.0,-5.0,0.0);glTexCoord2f(0.0,15.0)

11、;glVertex3f(5.0,-5.0,10.0);glTexCoord2f(15.0,15.0);glVertex3f(-5.0,-5.0,10.0);glTexCoord2f(15.0,0.0);glVertex3f(-5.0,-5.0,0.0);glEnd();glNormal3fv(normals2);glBegin(GL_POLYGON);/右邊glTexCoord2f(0.0,0.0);glVertex3f(5.0,5.0,0.0);glTexCoord2f(0.0,15.0);glVertex3f(-5.0,5.0,0.0);glTexCoord2f(15.0,15.0);gl

12、Vertex3f(-5.0,5.0,10.0);glTexCoord2f(15.0,0.0);glVertex3f(5.0,5.0,10.0);glEnd();glNormal3fv(normals3);glBegin(GL_POLYGON);/后面glTexCoord2f(0.0,0.0);glVertex3f(5.0,-5.0,0.0);glTexCoord2f(0.0,15.0);glVertex3f(5.0,5.0,0.0);glTexCoord2f(15.0,15.0);glVertex3f(5.0,5.0,10.0);glTexCoord2f(15.0,0.0);glVertex3

13、f(5.0,-5.0,10.0);glEnd();void CreateCeiling()glBindTexture(GL_TEXTURE_2D,TextureIDList2);/調(diào)已經(jīng)加載進內(nèi)存的紋理對象evmat(&ceiling); glNormal3fv(normals4);glBegin(GL_POLYGON);glTexCoord2f(0.0,0.0);glVertex3f(-5.0,-5.0,10.0);glTexCoord2f(0.0,10.0);glVertex3f(5.0,-5.0,10.0);glTexCoord2f(10.0,10.0);glVertex3f(5.0,5

14、.0,10.0);glTexCoord2f(10.0,0.0);glVertex3f(-5.0,5.0,10.0);glEnd();void CreateGround()glBindTexture(GL_TEXTURE_2D,TextureIDList0);/調(diào)已經(jīng)加載進內(nèi)存的紋理對象evmat(&ground); glNormal3fv(normals5);glBegin(GL_POLYGON);glTexCoord2f(0.0,0.0);glVertex3f(-5.0,-5.0,0.0);glTexCoord2f(0.0,15.0);glVertex3f(5.0,-5.0,0.0);glT

15、exCoord2f(15.0,15.0);glVertex3f(5.0,5.0,0.0);glTexCoord2f(15.0,0.0);glVertex3f(-5.0,5.0,0.0);glEnd();void CreateFurnishings()evmat(&cone);glPushMatrix();glTranslatef(-4.0,-2.0,0.0);glutSolidCone(1.0,2.0,80,50);evmat(&ball);glTranslatef(1.0,2.0,1.0);gluSphere(p,1.0,80,50);glPopMatrix();void CreateLig

16、ht()glLightfv(GL_LIGHT0,GL_POSITION,position0);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse0);glLightfv(GL_LIGHT0,GL_SPECULAR,specular0);glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);void CreateWorld()CreateLight();CreateWall();CreateCeiling();CreateGround();CreateFurnishings();/主display函數(shù)void display()glClear

17、(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(80.0,1.0,1.0,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(4.5,0.0,5.0, 0.0,0.0,5.0, 0.0,0.0,1.0);CreateWorld();glutSwapBuffers();/菜單void mainmenu(int id)switch(id)case 1:glEnable(GL_

18、LIGHT0);break;case 2:glDisable(GL_LIGHT0);break;case 3:glEnable(GL_TEXTURE_2D);break;case 4:glDisable(GL_TEXTURE_2D);break;case 5:glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);break;case 6:glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_REPLACE);break;glutPostRedisplay();/初始化函數(shù)void init()i

19、nt i,j,t;glEnable(GL_DEPTH_TEST);/選0號,1號光照glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glLightModelfv(GL_LIGHT_MODEL_AMBIENT,global_ambient);p=gluNewQuadric();gluQuadricDrawStyle(p, GLU_FILL);/計算貼圖數(shù)組for (i=0;i4;i+)for (j=0;j4;j+)t=0;if (i2 &j=2 &j=2)t=255;imageij0=(GLubyte)t;imageij1=(GLubyte)t;imageij

20、2=(GLubyte)t;for (i=0;i4;i+)for (j=0;j4;j+)t=(j(4-i)?100:200;image2ij0=(GLubyte)t;image2ij1=(GLubyte)t-20;image2ij2=(GLubyte)t+20;for (i=0;i4;i+)for (j=0;j4;j+)t=60;if (i=j & i!=0 & j!=3)t=180;image3ij0=(GLubyte)t;image3ij1=(GLubyte)t-10;image3ij2=(GLubyte)t+10;/貼圖參數(shù)設置glEnable(GL_TEXTURE_2D);glTexEn

21、vf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);glGenTextures(3,TextureIDList);/分配紋理號/-0號給地板-glBindTexture(GL_TEXTURE_2D,TextureIDList0);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,image);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D

22、,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/-1號給墻壁-glBindTexture(GL_TEXTURE_2D,TextureIDList1);glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,image2);glTexParameterf(

23、GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/-2號給天花板-glBindTexture(GL_TEXTURE_2D,TextureIDList2);glTexImage2D(GL_T

24、EXTURE_2D,0,GL_RGB,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,image3);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEARES

25、T);/創(chuàng)建菜單glutCreateMenu(mainmenu);glutAddMenuEntry(開啟點光源,1);glutAddMenuEntry(關閉點光源,2);glutAddMenuEntry(使用紋理,3);glutAddMenuEntry(去除紋理,4);glutAddMenuEntry(紋理環(huán)境:modulate調(diào)制,5);glutAddMenuEntry(紋理環(huán)境:replace替換,6);glutAttachMenu(GLUT_RIGHT_BUTTON);void main(int argc,char *argv)glutInit(&argc,argv);glutInitD

26、isplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow( );glutDisplayFunc(display);init();glutMainLoop(); 2. 結(jié)果:初始效果圖 關閉點光源去除紋理調(diào)制模式替換模式菜單展示3. 分析:完成了要求;調(diào)制模式更適合與光照,因為會和表面的材質(zhì)參數(shù)進行結(jié)合。(二)鐘表紋理1. 代碼:#include#include#include#includetypedef un

27、signed char byte;GLUquadric *p;struct tm* localTime; int hour, minute, second;byte *image;GLuint ID;int LoadBitmap(const char *file)GLuint ID;int width,height,i;byte t;FILE *fp;BITMAPFILEHEADER FileHeader;BITMAPINFOHEADER InfoHeader;fp=fopen(file,rb);if (!fp)/文件能否打開printf(文件打開失??!);fclose(fp);return

28、-1;fread(&FileHeader,sizeof(BITMAPFILEHEADER),1,fp);if (FileHeader.bfType!=0x4D42)/BMP文件類型校驗printf(不是BMP標準圖像!);fclose(fp);return -1;fread(&InfoHeader,sizeof(BITMAPINFOHEADER),1,fp);width=InfoHeader.biWidth;height=InfoHeader.biHeight;if (InfoHeader.biSizeImage=0)/確保圖像數(shù)據(jù)大小 InfoHeader.biSizeImage=width

29、*height*3;fseek(fp,FileHeader.bfOffBits,SEEK_SET);/移動指針到圖像image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage);/為圖像分配內(nèi)存if (!image)free(image);printf(沒有足夠的內(nèi)存!);fclose(fp);return -1;fread(image,1,InfoHeader.biSizeImage,fp);for (i=0;itm_hour;minute=localTime-tm_min;second=localTime-tm_sec;void pro

30、cessHourhand()glPushMatrix();glRotatef(hour*30.0+minute*0.5,0.0,0.0,-1.0);createHourhand();glPopMatrix();void processMinutehand()glPushMatrix();glRotatef(minute*6.0+second*0.1,0.0,0.0,-1.0);createMinutehand();glPopMatrix();void processSecondhand()glPushMatrix();glRotatef(second*6.0,0.0,0.0,-1.0);createSecondhand();glPopMatrix();void display(void) glClear(GL_COLOR_BUFFER_BIT);createWatch();processHourhand();processMinuteh

溫馨提示

  • 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

提交評論