計(jì)算機(jī)圖形學(xué)大作業(yè)報(bào)告燈光紋理映射_第1頁
計(jì)算機(jī)圖形學(xué)大作業(yè)報(bào)告燈光紋理映射_第2頁
計(jì)算機(jī)圖形學(xué)大作業(yè)報(bào)告燈光紋理映射_第3頁
計(jì)算機(jī)圖形學(xué)大作業(yè)報(bào)告燈光紋理映射_第4頁
計(jì)算機(jī)圖形學(xué)大作業(yè)報(bào)告燈光紋理映射_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、大作業(yè)報(bào)告實(shí)驗(yàn)課程名稱:計(jì)算機(jī)圖形學(xué)學(xué)生姓名:班級(jí):學(xué)院(系):學(xué)生學(xué)號(hào):指導(dǎo)教師:成績:一、目的這次大作業(yè)是作為這學(xué)期的最后的一個(gè)考核,所以必須要用到所有的本學(xué)期學(xué)過的知識(shí),比如怎樣畫出三維圖形,怎樣在圖像上在圖像上添加紋理光照,怎樣使用鼠標(biāo)和鍵盤進(jìn)行人機(jī)交互等。二、主要功能模塊設(shè)計(jì)1 矩陣運(yùn)算模塊的設(shè)計(jì):功能描述:程序啟動(dòng)后,這部分功能模塊會(huì)為整個(gè)應(yīng)用程序提供算法支持,具體是矩陣直接的相互運(yùn)算,在2D向3D轉(zhuǎn)化過程中會(huì)起到很重要的作用。代碼設(shè)計(jì):floatvv(float*v1,float*v2)returnv10*v20+v11*v21+v12*v22;voidvxv(float*n,f

2、loat*v1,float*v2)n0=v11*v22-v12*v21;n1=v12*v20-v10*v22;n2=v10*v21-v11*v20;voidloadIdentity(Matrixm)Matrixidentity=1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;for(inti=0;i<4;i+)for(intj=0;j<4;j+)mij=identityij;voidpreMultiply(Matrixp,Matrixm)inti,j;Matrixt;for(i=0;i<4;i+)

3、for(j=0;j<4;j+)tij=pi0*m0j+pi1*m1j+pi2*m2j+pi3*m3j;for(i=0;i<4;i+)for(j=0;j<4;j+)mij=tij;2 顯示圖形模塊的設(shè)計(jì):功能描述:該模塊主要為所要畫的圖形進(jìn)行描述,是繪制圖形的主要函數(shù),通過調(diào)用這個(gè)功能模塊就能畫出用于顯示給用戶的圖形。代碼設(shè)計(jì):/2D圖形的display函數(shù)voiddisplay()glClear(GL_COLOR_BUFFER_BIT);if(n=1&&type=GL_LINE_STRIP)glBegin(GL_POINTS);glVertex2iv(vert

4、0);glColor3f(0,0.5,0.5);glVertex2i(width-vert00-1,vert01);glEnd();glColor3f(0,0.5,0.5);glBegin(GL_LINES);glVertex2i(width/2,0);glVertex2i(width/2,height-1);glEnd();glBegin(type);for(inti=0;i<n;i+)glVertex2i(width-verti0-1,verti1);glEnd();glColor3f(1,1,0);glBegin(type);for(inti=0;i<n;i+)glVerte

5、x2iv(verti);glEnd();glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay();/3D圖形的顯示函數(shù)voidmodelDisplay()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();floatM16;for(intr=0;r<4;r+)for(intc=0;c<4;c+)M4*c+r=CRMrc;glMultMatrixf(M);glScalef(zoom,zoom,zoom);drawQMesh()

6、;glPopMatrix();glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);glPopMatrix();glutSwapBuffers();3 鍵盤敲擊模塊功能描述:該功能主要為兩個(gè)窗體添加鍵盤敲擊事件,在2D窗體中主要添加了反走樣效果,清除所畫的圖,點(diǎn)線轉(zhuǎn)化功能,對(duì)于3D窗體主要添加了投影方式的變換,光源移動(dòng)的功能代碼設(shè)計(jì):/2D繪制窗體的鍵盤敲擊處理函數(shù)voidkeyboard(unsignedcharkey,intx,inty)switch

7、(key)case'a':antialiasing=!antialiasing;/反走樣效果if(antialiasing)glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);elseglDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);break;case'c':n=0;break;/清除界面功能case'l':type=GL_LINE_STRIP;break;/繪制線功能case'v':type=GL_POINTS;break;/繪制點(diǎn)功能glutPos

8、tRedisplay();/3D顯示窗體的鍵盤敲擊事件處理函數(shù):voidmodelKeyboard(unsignedcharkey,intx,inty)switch(key)case'o':glMatrixMode(GL_PROJECTION);/正投影glLoadIdentity();glOrtho(-4,4,-4,4,6,14);glMatrixMode(GL_MODELVIEW);break;case'p':glMatrixMode(GL_PROJECTION);/側(cè)投影,不過是默認(rèn)的glLoadIdentity();gluPerspective(45.0

9、,1.0,6.0,14.0);glMatrixMode(GL_MODELVIEW);break;case'm':lightPosition0=lightPosition0-0.5;/光源移動(dòng)break;case'n':lightPosition1=lightPosition1-0.5;break;case'z':lightPosition2=lightPosition2-0.5;break;case'k':glDisable(GL_FOG);break;glutPostRedisplay();4 鼠標(biāo)點(diǎn)擊模塊功能描述:該功能模塊主

10、要實(shí)現(xiàn)了對(duì)兩個(gè)窗體鼠標(biāo)事件的處理,對(duì)于3D窗體實(shí)現(xiàn)了鼠標(biāo)左鍵旋轉(zhuǎn),由鍵放大縮小的效果,2D窗體實(shí)現(xiàn)了左鍵畫點(diǎn),右鍵可以對(duì)已經(jīng)存在的點(diǎn)改變它的位置。代碼設(shè)計(jì):/3D窗體的鼠標(biāo)事件voidmodelMouse(intbutton,intstate,intx,inty)switch(button)caseGLUT_LEFT_BUTTON:if(state=GLUT_DOWN)cx=x;cy=h-1-y;dx=dy=0;left_button_down=true;elseleft_button_down=falsebreak;caseGLUT_RIGHT_BUTTON:if(state=GLUT_DO

11、WN)cx=x;cy=h-1-y;right_button_down=true;elseright_button_down=false;break;/2D窗體鼠標(biāo)事件voidmouse(intbutton,intstate,intx,inty)y=height-1-y;switch(button)caseGLUT_LEFT_BUTTON:if(state=GLUT_DOWN&&!rubberbanding)v=n+;vertv0=(x<width/2)?width/2:(x>=width)?width-1:x;vertv1=(y<0)?0:(y>=hei

12、ght)?height-1:y;rubberbanding=true;glutPostRedisplay();elserubberbanding=false;break;caseGLUT_RIGHT_BUTTON:if(state=GLUT_DOWN&&!rubberbanding&&(v=findVertex(x,y)!=-1)if(glutGetModifiers()=GLUT_ACTIVE_CTRL)for(inti=v;i<n-1;i+)vertv0=verti+10;verti1=verti+11;n-;elsevertv0=(x<widt

13、h/2)?width/2:(x>=width)?width-1:x;vertv1=(y<0)?0:(y>=height)?height-1:y;rubberbanding=true;glutPostRedisplay();elserubberbanding=false;break;功能截圖:利用鼠標(biāo)在界面上畫出原來的圖,截圖如下:按住“Z”后,上方的光照變化,截圖如下:23ayobject按住“Y”后,下方的光照效果發(fā)生變化,截圖如下:Diiploycbjeet使用鼠標(biāo)實(shí)現(xiàn)圖像方向的變化,截圖如下:使用鼠標(biāo)實(shí)現(xiàn)圖像大小的變化,截圖如下:放大:縮小三、心得通過對(duì)本次大作業(yè)試驗(yàn)的

14、編寫,更進(jìn)一步了解了OpenGL的用法,從計(jì)算機(jī)圖形學(xué)課程中可能收獲最多的并不是圖形學(xué)的一些基礎(chǔ)知識(shí),雖然這些很重要,但是真正有些成就感的還是用OpenGL開發(fā)出來的這些程序。特別是這個(gè)項(xiàng)目,和前面幾個(gè)只需抄抄代碼就能出來的實(shí)驗(yàn)相比,是需要好好動(dòng)動(dòng)腦筋的。在這個(gè)項(xiàng)目中需要處理鼠標(biāo)等設(shè)備的輸入,然后再根據(jù)輸入捕捉相應(yīng)的變化再進(jìn)行處理。這一塊對(duì)于我來說是比較困難的。在解決這個(gè)問題上花了不少的時(shí)間,在解決這個(gè)問題之后應(yīng)當(dāng)說后面的工作還是比較輕松的。以前覺得看到的游戲里面的畫面很是完美,現(xiàn)在我知道了這寫圖的制作方法,并且我也學(xué)會(huì)了怎樣制作簡單的三維圖片,加上對(duì)三維圖形的一些修飾,使簡單的圖形變得更好看

15、更精致。完整代碼如下:#include<gl/glut.h>#include<math.h>#defineQMeshSize256intwidth=400,height=600,vert1002,n=0,type=GL_LINE_STRIP,v;boolrubberbanding=false,antialiasing=false;floatQMesh100QMeshSize+13;GLfloatlightPosition口=-4.0,4.0,60,1.0;GLfloatamb口=0.3f,0.3f,0.3f,0.3f;GLfloatfrontDiffAmb口=0.95f

16、,0.3f,0.1f,1.0;GLfloatbackDiffAmb口=0.1f,0.3f,0.95f,1.0;GLfloatSpec口=0.45f,0.45f,0.45f,1.0;GLfloatSpecExp=15.0;boolleft_button_down=false,right_button_down=false;intw=600,h=600,winid,cx,cy,dx=0,dy=0;floatzoom=1.0;typedeffloatMatrix44;MatrixRM,CRM;voidinitQMesh()floatr;for(inti=0;i<n;i+)r=verti0-wi

17、dth/2.0;for(intj=0;j<QMeshSize;j+)QMeshij0=r*cos(3.14159*2*j/QMeshSize)/100;QMeshij1=(verti1-height/2.0)/100;QMeshij2=r*sin(3.14159*2*j/QMeshSize)/100;QMeshiQMeshSize0=QMeshi00;QMeshiQMeshSize1=QMeshi01;QMeshiQMeshSize2=QMeshi02;voiddisplay()glClear(GL_COLOR_BUFFER_BIT);if(n=1&&type=GL_LI

18、NE_STRIP)glBegin(GL_POINTS);glVertex2iv(vert0);glColor3f(0,0.5,0.5);glVertex2i(width-vert00-1,vert01);glEnd();glColor3f(0,0.5,0.5);glBegin(GL_LINES);glVertex2i(width/2,0);glVertex2i(width/2,height-1);glEnd();glBegin(type);for(inti=0;i<n;i+)glVertex2i(width-verti0-1,verti1);glEnd();glColor3f(1,1,0

19、);glBegin(type);for(inti1=0;i1<n;i1+)glVertex2iv(verti1);glEnd();glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay();voidkeyboard(unsignedcharkey,intx,inty)switch(key)case'a':antialiasing=!antialiasing;if(antialiasing)glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);elseglDi

20、sable(GL_BLEND);glDisable(GL_LINE_SMOOTH);break;case'c':n=0;break;case'l':type=GL_LINE_STRIP;break;case'v':type=GL_POINTS;break;glutPostRedisplay();intfindVertex(intx,inty)intdx,dy;for(inti=0;i<n;i+)dx=verti0-x;dy=verti1-y;if(dx*dx+dy*dy<16)returni;return-1;voidmouse(in

21、tbutton,intstate,intx,inty)y=height-1-y;switch(button)caseGLUT_LEFT_BUTTON:if(state=GLUT_DOWN&&!rubberbanding)v=n+;vertv0=(x<width/2)?width/2:(x>=width)?width-1:x;vertv1=(y<0)?0:(y>=height)?height-1:y;rubberbanding=true;glutPostRedisplay();elserubberbanding=false;break;caseGLUT_R

22、IGHT_BUTTON:if(state=GLUT_DOWN&&!rubberbanding&&(v=findVertex(x,y)!=-1)if(glutGetModifiers()=GLUT_ACTIVE_CTRL)for(inti=v;i<n-1;i+)vertv0=verti+10;verti1=verti+11;n-;elsevertv0=(x<width/2)?width/2:(x>=width)?width-1:x;vertv1=(y<0)?0:(y>=height)?height-1:y;rubberbanding=

23、true;glutPostRedisplay();elserubberbanding=false;break;voidmotion(intx,inty)if(rubberbanding)vertv0=(x<width/2)?width/2:(x>=width)?width-1:x;y=height-1-y;vertv1=(y<0)?0:(y>=height)?height-1:y;glutPostRedisplay();voidnormalize(float*v)floatm=sqrt(v0*v0+v1*v1+v2*v2);for(inti=0;i<3;i+)vi

24、=vi/m;floatvv(float*v1,float*v2)returnv10*v20+v11*v21+v12*v22;voidvxv(float*n,float*v1,float*v2)n0=v11*v22-v12*v21;n1=v12*v20-v10*v22;n2=v10*v21-v11*v20;voidloadIdentity(Matrixm)Matrixidentity=1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;for(inti=0;i<4;i+)for(intj=0;j<4;j+)m

25、ij=identityij;voidpreMultiply(Matrixp,Matrixm)inti,j;Matrixt;for(i=0;i<4;i+)for(j=0;j<4;j+)tij=pi0*m0j+pi1*m1j+pi2*m2j+pi3*m3j;for(i=0;i<4;i+)for(j=0;j<4;j+)mij=tij;voidrotate(floatangle,float*axis)floatv3=axis0,axis1,0,i3=1,0,0,k3=0,0,1;loadIdentity(RM);normalize(v);floatr1=(v1<0)?ac

26、os(vv(v,i):-acos(vv(v,i);MatrixRz=cos(r1),-sin(r1),0.0,0.0,sin(r1),cos(r1),0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;preMultiply(Rz,RM);floatr2=-acos(vv(axis,k);MatrixRy=cos(r2),0.0,sin(r2),0.0,0.0,1.0,0.0,0.0,-sin(r2),0.0,cos(r2),0.0,0.0,0.0,0.0,1.0;preMultiply(Ry,RM);MatrixR=cos(angle),-sin(angle),0

27、.0,0.0,sin(angle),cos(angle),0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;preMultiply(R,RM);MatrixR_y=cos(-r2),0.0,sin(-r2),0.0,0.0,1.0,0.0,0.0,-sin(-r2),0.0,cos(-r2),0.0,0.0,0.0,0.0,1.0;preMultiply(R_y,RM);MatrixR_z=cos(-r1),-sin(-r1),0.0,0.0,sin(-r1),cos(-r1),0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0;pre

28、Multiply(R_z,RM);preMultiply(RM,CRM);voiddrawQMesh()inti,j;floatv13,v23,norm3;glBegin(GL_QUADS);for(i=0;i<n-1;i+)for(j=0;j<QMeshSize;j+)v10=QMeshi+1j+10-QMeshij0;v11=QMeshi+1j+11-QMeshij1;v12=QMeshi+1j+12-QMeshij2;v20=QMeshi+1j0-QMeshij+10;v21=QMeshi+1j1-QMeshij+11;v22=QMeshi+1j2-QMeshij+12;vx

29、v(norm,v1,v2);glNormal3fv(norm);glVertex3fv(QMeshij);glVertex3fv(QMeshij+1);glVertex3fv(QMeshi+1j+1);glVertex3fv(QMeshi+1j);glEnd();voidmodelDisplay()glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();floatM16;for(intr=0;r<4;r+)for(intc=0;c<4;c+)M4*c+r=CRMrc;glMultMatrixf(M);glSca

30、lef(zoom,zoom,zoom);drawQMesh();glPopMatrix();glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);glPopMatrix();glutSwapBuffers();voidmodelKeyboard(unsignedcharkey,intx,inty)switch(key)case'o':glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(

31、-4,4,-4,4,6,14);glMatrixMode(GL_MODELVIEW);break;case'p':glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0,1.0,6.0,14.0);glMatrixMode(GL_MODELVIEW);break;case'x':lightPosition0=lightPosition0-0.5;break;case'X':lightPosition0=lightPosition0+0.5;break;case'y&

32、#39;:lightPosition1=lightPosition1-0.5;break;case'Y':lightPosition1=lightPosition1+0.5;break;case'z':lightPosition2=lightPosition2-0.5;break;case'Z':lightPosition2=lightPosition2+0.5;break;glutPostRedisplay();voidmodelMouse(intbutton,intstate,intx,inty)switch(button)caseGLUT_

33、LEFT_BUTTON:if(state=GLUT_DOWN)cx=x;cy=h-1-y;dx=dy=0;left_button_down=true;elseleft_button_down=false;break;caseGLUT_RIGHT_BUTTON:if(state=GLUT_DOWN)cx=x;cy=h-1-y;right_button_down=true;elseright_button_down=false;break;voidmodelMotion(intx,inty)floatv13,v23,axis3,angle,dx,dy;y=h-1-y;if(left_button_

34、down)dx=x-cx;dy=y-cy;if(dx!=0|dy!=0)v10=cx-w/2;v11=cy-h/2;v12=300.0;v20=x-w/2;v21=y-h/2;v22=300.0;vxv(axis,v1,v2);angle=sqrt(dx*dx+dy*dy)/200;normalize(axis);rotate(angle,axis);if(right_button_down)zoom=zoom-zoom*(y-cy)/250;cx=x;cy=y;glutPostRedisplay();voidmodelIdle(void)if(dx*dx+dy*dy>9)preMultiply(RM,CRM);glutPostRedisplay();voidmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);glutInitWindowSize(width,height);glutInitWindowPosition(50,100);glutCreateWindow("Editpolygons");glClearColor(0.0,0.0,0.0,0.0);glColor3f(1,1,0);glMatrixMode(GL_PR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論