計算機圖形學課程設(shè)計報告書_第1頁
計算機圖形學課程設(shè)計報告書_第2頁
計算機圖形學課程設(shè)計報告書_第3頁
計算機圖形學課程設(shè)計報告書_第4頁
計算機圖形學課程設(shè)計報告書_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./《計算機圖形學》實驗報告題目:3D真實感場景繪制:郭繼杰學號:2014214168班級:地信141學院:理學院指導(dǎo)老師:解山娟日期:2017年1月1日實驗?zāi)康慕Y(jié)合一學期所學計算機圖形學知識,基于專業(yè)背景,使用OpenGL繪制簡單的3D真實感圖形場景。實驗要求應(yīng)用光柵化算法、多邊形裁剪計算以及消隱算法在場景繪制中,其中真實感場景繪制包括顏色模型、紋理模型、霧化模型、運動模型以及環(huán)境光、漫反射、鏡面反射等光照模型設(shè)置。實驗小組及任務(wù)分工小組成員任務(wù)分工金城紋理貼圖,顏色模型,霧化模型郭繼杰運動模型,光照模型黎達材料收集,代碼整合實驗容1.實驗前期工作前期工作經(jīng)過小組成員充分討論,資料收集,最終確定小組實驗?zāi)0鍨橐韵聝煞鶊鼍?。目標是實現(xiàn)一艘簡單3D帆船模型以及一輛3D小車模型2.程序編譯環(huán)境:VisualStudio20123.光照模型建立過程光照模型建立流程圖:3.1設(shè)置光照模型相應(yīng)指數(shù)3.2打開光源光照模型設(shè)計過程有兩點注意的是:1、glShadeModel函數(shù)用于控制opengl中繪制指定兩點間其他點顏色的過渡模式,參數(shù)一般為GL_SMOOTH、GL_FLAT,如果兩點的顏色相同,使用兩個參數(shù)效果相同,如果兩點顏色不同,GL_SMOOTH會出現(xiàn)過渡效果,GL_FLAT則只是以指定的某一點的單一色繪制其他所有點。glShadeModel<GL_FLAT>著色模式glShadeModel<GL_SMOOTH>著色模式〔可以看出GL_SMOOTH模式下顏色更加光滑2、需要使用光照模型時必須啟用,glEnable<GL_LIGHTING>〔啟用燈源、glEnable<GL_LIGHT0>〔啟用光源,否則所有燈光效果都會無效。效果對比如下圖所示?!参磫⒂脽艄狻矄⒂脽艄狻参磫⒂脽艄狻矄⒂脽艄?.顏色模型建立過程1.設(shè)定多邊形圖形:OpenGL利用glBegin<>函數(shù)畫圖形樣式,里面的參數(shù)表示圖形樣式,這里以glBegin<GL_QUADS>為例,GL_QUADS表示繪制由四個頂點組成的一組單獨的四邊形。2.設(shè)定顏色:OpenGL利用glColor3f<a,b,c>函數(shù)設(shè)置圖形顏色,里面的參數(shù)表示設(shè)定顏色的顏色。3.坐標設(shè)定:OpenGL利用glVertex3f<a,b,c>函數(shù)設(shè)置圖形坐標,里面的參數(shù)表示坐標的位置。以跑道顏色模型為例:〔未使用顏色模型〔使用顏色模型5.霧化模型建立過程霧是生活中比較常見的現(xiàn)象,有了霧化模型,場景會比較逼真。1.建立過程及參數(shù)設(shè)定如下:2.其中,設(shè)置霧氣起始位置與結(jié)束位置可以使霧氣濃度隨運動模型變化。3.效果對比〔未使用霧化〔使用霧化4.實驗存在不足之處,由于本實驗的場景繪制不是特別接近真實感,所以霧化模型的效果不是很好。6.運動模型建立過程1.本次實驗的運動模型主要由鍵盤按鍵響應(yīng)發(fā)生。2.設(shè)定鍵盤按鍵響應(yīng)函數(shù)voidspecialKeyBoard<intkey,intx,inty>在主函數(shù)入口設(shè)定設(shè)置當前窗口的特定鍵的回調(diào)函數(shù)glutSpecialFunc<specialKeyBoard>;glTranslatef<0,0,0.1+delta_v>;//表示將當前圖形向x軸平移0,向y軸平移0,向z軸平移0.1+delta,表示物體在這個坐標的時候開始繪制。glutPostRedisplay<>;在圖像繪制的所有操作之后,要加入glutPostRedisplay<>函數(shù)來重繪圖像。實現(xiàn)物體的移動glRotatef<1,0,1,0>;//,旋轉(zhuǎn)角度函數(shù),表示小車往〔0,1,0向量方向逆時針旋轉(zhuǎn)1°以上都是控制小車運動的函數(shù),通過鍵盤響應(yīng)來觸發(fā)?!蚕蚯斑\動〔旋轉(zhuǎn)7.紋理貼圖過程①載入位圖圖像:AUX_RGBImageRec*LoadBMP<CHAR*Filename>//載入位圖圖象{FILE*File=NULL;//文件句柄if<!Filename>//確保文件名已提供 {returnNULL;//如果沒提供,返回NULL } File=fopen<Filename,"r">;//嘗試打開文件if<File>//判斷文件是否存在? { fclose<File>;//關(guān)閉句柄returnauxDIBImageLoadA<Filename>;//載入位圖并返回指針 }returnNULL;//如果載入失敗,返回NULL}②位圖轉(zhuǎn)化成紋理:intLoadGLTextures<>//載入位圖<調(diào)用上面的代碼>并轉(zhuǎn)換成紋理{intStatus=FALSE;//狀態(tài)指示器AUX_RGBImageRec*TextureImage[2];//創(chuàng)建紋理的存儲空間memset<TextureImage,0,sizeof<void*>*1>;//將指針設(shè)為NULL//載入位圖,檢查有無錯誤,如果位圖沒找到則退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//將Status設(shè)為TRUEglGenTextures<2,&texture[0]>;//創(chuàng)建紋理for<intloop=0;loop<2;loop++> { glBindTexture<GL_TEXTURE_2D,texture[loop]>;//綁定紋理 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR>;//設(shè)置濾波 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR>; glTexImage2D<GL_TEXTURE_2D,0,3,TextureImage[loop]->sizeX,TextureImage[loop]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[loop]->data>;//生成紋理 }}for<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL>//判斷紋理是否存在 {if<TextureImage[loop]->data!=NULL>//紋理圖像是否存在 { free<TextureImage[loop]->data>;//釋放紋理圖像占用存 } free<TextureImage[loop]>;//釋放圖像結(jié)構(gòu) } }returnStatus;//返回Status}③調(diào)用紋理glBindTexture<GL_TEXTURE_2D,texture[0]>;//選擇紋理glBegin<GL_QUADS>;//開始繪制四邊形glTexCoord2f<1.0f,0.0f>;glVertex3f<0.0f,1.5f,0.0f>;//紋理和四邊形的右下glTexCoord2f<1.0f,1.0f>;glVertex3f<0.0f,2.5f,0.0f>;//紋理和四邊形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<0.0f,2.5f,1.0f>;//紋理和四邊形的左上glTexCoord2f<0.0f,0.0f>;glVertex3f<0.0f,1.5f,1.0f>;//紋理和四邊形的左下glEnd<>;模型解讀〔1創(chuàng)建紋理圖像:OpenGL要求紋理的高度和寬度都必須是2的n次方大小,只有滿足這個條件,這個紋理圖片才是有效的。一旦獲取了像素值,我們就可以將這些數(shù)據(jù)傳給OpenGL,讓OpenGL生成一個紋理貼圖:①glGenTextures<2,&texture[0]>:創(chuàng)建紋理對象②glBindTexture<GL_TEXTURE_2D,texture[loop]>:綁定紋理對象③glTexImage2D<GL_TEXTURE_2D,0,3,TextureImage[loop]->sizeX,TextureImage[loop]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[loop]->data>:將Pixels數(shù)組中的像素值傳給當前綁定的紋理對象,于是便創(chuàng)建了紋理。glTexImage函數(shù)的參數(shù)分別是紋理的類型,紋理的等級,每個像素的字節(jié)數(shù),紋理圖像的寬度和高度,邊框大小,像素數(shù)據(jù)的格式,像素值的數(shù)據(jù)類型,像素數(shù)據(jù)?!?紋理濾鏡:在紋理映射的過程中,如果圖元的大小不等于紋理的大小,OpenGL便會對紋理進行縮放以適應(yīng)圖元的尺寸。我們可以通過設(shè)置紋理濾鏡來決定OpenGL對某個紋理采用的放大、縮小的算法。調(diào)用glTexParameter來設(shè)置紋理濾鏡。如:glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR>;//設(shè)置放大濾鏡glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR>;//設(shè)置縮小濾鏡〔3紋理坐標:要使用當前的紋理繪制圖元,我們必須在繪制每個頂點之前為該頂點指定紋理坐標。只需調(diào)用glTexCoord2d<s:Double;t:Double>;函數(shù)即可。其中,s、t是對于2D紋理而言的s、t坐標。對于任何紋理,無論紋理的真正大小如何,其頂端〔左上角的紋理坐標恒為<0,0>,右下角的紋理坐標恒為<1,1>。也就是說,紋理坐標應(yīng)是一個介于0到1之間的一個小數(shù)。紋理貼圖前后對比效果見圖5。紋理貼圖前紋理貼圖后成果展示本次實驗將兩個模型進行改造,實現(xiàn)了一輛簡單的小車以及一艘簡單的帆船。〔小車模型〔帆船模型心得體會計算機圖形學本身是一門理論與實踐都比較復(fù)雜的學科,從最開始二維圖形的實現(xiàn),到最后三維真實感場景的實現(xiàn),都不是一個簡單的過程,好的真實感場景實現(xiàn)需要多個模型的相互融合,在實驗設(shè)計過程中,難免遇到困難,下面是本次實驗總結(jié)出來的感受。glEnable<>啟動函數(shù),無論是構(gòu)造什么樣的模型,都需要由這個函數(shù)來啟動,如光照模型需要glEnable<GL_LIGHTING>,紋理貼圖需要glEnable<GL_TEXTURE_2D>;沒有啟動函數(shù)的作用,效果都是不可能是實現(xiàn)的。2.glPushMatrix<>和glPopMatrix<>函數(shù)的使用,這兩個函數(shù)在OpenGL中是模型視圖矩陣堆棧,分別是壓棧和出棧函數(shù),防止坐標不穩(wěn)定移動。確定每個模型都繪制在預(yù)期的位置。以本次實驗中小車模型畫車輪為例:這個函數(shù)中使用了堆棧的函數(shù),為了使輪胎往預(yù)期的方向移動,否則,輪胎移動的效果會變成規(guī)則的向不同地方跳動,顯的不切合實際。3.最后,個人感覺OpenGL場景的實現(xiàn)最重要的是函數(shù)的調(diào)用以及流程控制運用。函數(shù)的重要性不言而喻。如果可以充分吸收模型中各類函數(shù)的用法,實現(xiàn)一個場景就不會那么困難,流程控制就是應(yīng)該想好模型設(shè)計的順序問題,順序問題一旦解決,運用到程序中,思路清晰就會便于成功。七、源代碼實例1.小車模型:#include<stdio.h>#include<stdlib.h>#include<GL/glut.h>#include<math.h>#include<GL/GLAUX.H>#include<gl/gl.h>#include<math.h>#pragmacomment<lib,"opengl32.lib"> #pragmacomment<lib,"glu32.lib"> #pragmacomment<lib,"glaux.lib">floatdelta_v=0.0;floatr=1.0,g=1.0,b=0.0;floatr1=0.0,g1=0.0,b1=0.0;floatP[16];floatM[16];staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;staticfloatelbow=0,z=0;//光線及材質(zhì)的定義GLfloatglobal_ambient[]={0.1,0.1,0.1,0.1};//總體環(huán)境光設(shè)置GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};//環(huán)境光,通常定義在光源中GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};//漫反射光〔DiffuseLightGLfloatlight_specular[]={1.0,1.0,1.0,1.0};//和鏡面反射光〔SpecularLight。GLfloatlight_position[]={20.0,20.0,20.0,0.0};//光源位置GLfloatmat_specular1[]={1.0,1.0,1.0,1.0};//鏡面反射光材質(zhì)材質(zhì)GLfloatmat_diffuse1[]={1.0,1.0,1.0,1.0};//漫反射光材質(zhì)GLfloatmat_ambient1[]={1.0,1.0,1.0,1.0};//環(huán)境光材質(zhì)GLfloatmat_shininess1={10.0};//鏡面反射指數(shù)GLfloatvertices[][3]={{-0.7,0,1},{0.7,0,1},{0.7,0,-1},{-0.7,0,-1},{-0.5,1,0.8},{0.5,1,0.8},{0.5,1,-0.8},{-0.5,1,-0.8}};GLfloatfogcolor[]={0.5f,0.7f,0.5f,1.0f};GLuinttexture[2];//存儲2個紋理AUX_RGBImageRec*LoadBMP<CHAR*Filename>//載入位圖圖象{FILE*File=NULL;//文件句柄if<!Filename>//確保文件名已提供 {returnNULL;//如果沒提供,返回NULL } File=fopen<Filename,"r">;//嘗試打開文件if<File>//判斷文件是否存在? { fclose<File>;//關(guān)閉句柄returnauxDIBImageLoadA<Filename>;//載入位圖并返回指針 }returnNULL;//如果載入失敗,返回NULL}intLoadGLTextures<>//載入位圖<調(diào)用上面的代碼>并轉(zhuǎn)換成紋理{intStatus=FALSE;//狀態(tài)指示器AUX_RGBImageRec*TextureImage[2];//創(chuàng)建紋理的存儲空間memset<TextureImage,0,sizeof<void*>*1>;//將指針設(shè)為NULL//載入位圖,檢查有無錯誤,如果位圖沒找到則退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//將Status設(shè)為TRUEglGenTextures<2,&texture[0]>;//創(chuàng)建紋理for<intloop=0;loop<2;loop++> { glBindTexture<GL_TEXTURE_2D,texture[loop]>;//綁定紋理 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR>;//設(shè)置濾波模式 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR>; glTexImage2D<GL_TEXTURE_2D,0,3,TextureImage[loop]->sizeX,TextureImage[loop]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[loop]->data>;//生成紋理 }}for<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL>//判斷紋理是否存在 {if<TextureImage[loop]->data!=NULL>//紋理圖像是否存在 { free<TextureImage[loop]->data>; //釋放紋理圖像占用存 } free<TextureImage[loop]>;//釋放圖像結(jié)構(gòu) } }returnStatus;//返回Status}voidmenu<intid>//設(shè)置一個右鍵菜單功能{switch<id> {case<1>: exit<0>;break; } glutPostRedisplay<>;}voidcolor_car_body_menu<intid>//車身顏色變化菜單{switch<id> {case<1>:r=1.0;g=0.0;b=0.0;break;case<2>: r=0.0;g=1.0;b=0.0;break;case<3>: r=0.0;g=0.0;b=1.0;break;case<4>: r=0.9;g=0.1;b=0.6;break;case<5>: r=0.7;g=0.5;b=0.1; break;case<6>: r=1.0;g=0.0;b=0.0;break;} glutPostRedisplay<>;}voidcolor_car_wheel_menu<intid>//車輪顏色變化菜單{switch<id> {case<1>:r1=0.0;g1=0.5;b1=1.0;break;case<2>: r1=0.7;g1=0.8;b1=0.4;break;case<3>: r1=0.7;g1=0.0;b1=0.0;break;case<4>:r1=0.9;g1=0.1;b1=0.6;break;case<5>: r1=0.7;g1=0.5;b1=0.1; break;case<6>: r1=0.7;g1=1.0;b1=0.6;break;} glutPostRedisplay<>;}//定義跑道voidrunway<>{ glBegin<GL_QUADS>;//GL_QUADS:繪制由四個頂點組成的一組單獨的四邊形。//頂點4n-3、4n-2、4n-1和4n定義了第n個四邊形。總共繪制N/4個四邊形 glColor3f<0.0f,0.8f,0.0f>;//設(shè)定跑到顏色glVertex3f<-3.0f,-0.3f,100.0f>;//設(shè)定跑道坐標glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-0.8f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-0.8f,-0.3f,-100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-3.0f,-0.3f,-100.0f>;glEnd<>;glBegin<GL_QUADS>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<0.8f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<3.0f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<3.0f,-0.3f,-100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<0.8f,-0.3f,-100.0f>;glEnd<>;glBegin<GL_QUADS>;//跑道樣式glColor3f<0.9f,1.0f,0.9f>;//跑道顏色glVertex3f<-0.8f,-0.3f,100.0f>;//跑道坐標glColor3f<0.9f,1.0f,0.9f>;glVertex3f<0.8f,-0.3f,100.0f>;glColor3f<0.9f,1.0f,0.9f>;glVertex3f<0.8f,-0.3f,-100.0f>;glColor3f<0.9f,1.0f,0.9f>;glVertex3f<-0.8f,-0.3f,-100.0f>;glEnd<>;}//畫車身voidquad<inta,intb,intc,intd>{ glBegin<GL_QUADS>;//GL_QUADS:繪制由四個頂點組成的一組單獨的四邊形。頂點4n-3、4n-2、4n-1和4n定義了第n個四邊形??偣怖L制N/4個四邊形glVertex3fv<vertices[a]>;glVertex3fv<vertices[b]>;glVertex3fv<vertices[c]>;glVertex3fv<vertices[d]>; glEnd<>;}voidcar_body<>{ glColor3f<1.0,0.0,0.0>;//顏色模型函數(shù) glColor3f<r,g,b>;//設(shè)定初始顏色 glNormal3f<0.0f,-1.0f,0.0f>;//buttom,設(shè)置當前法線數(shù)組,指定新的當前法線的x,y,z坐標。各個定點的法向量不同,所以在確定頂點之前確定法向量。 quad<0,1,2,3>; glNormal3f<1.0f,0.0f,0.0f>;//right quad<1,2,6,5>; glNormal3f<0.0f,0.0f,-1.0f>;//back quad<2,3,7,6>; glNormal3f<-1.0f,0.0f,0.0f>;//left quad<7,3,0,4>; glNormal3f<0.0f,0.0f,1.0f>;//front quad<0,1,5,4>; glNormal3f<0.0f,1.0f,0.0f>;//top quad<4,5,6,7>;glBindTexture<GL_TEXTURE_2D,texture[0]>;//選擇紋理glBegin<GL_QUADS>;//右面glTexCoord2f<1.0f,0.0f>;glVertex3f<0.0f,1.5f,0.0f>;//紋理和四邊形的右下glTexCoord2f<1.0f,1.0f>;glVertex3f<0.0f,2.5f,0.0f>;//紋理和四邊形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<0.0f,2.5f,1.0f>;//紋理和四邊形的左上glTexCoord2f<0.0f,0.0f>;glVertex3f<0.0f,1.5f,1.0f>;//紋理和四邊形的左下glEnd<>;glBindTexture<GL_TEXTURE_2D,texture[1]>;//選擇紋理glBegin<GL_QUADS>;//左面glTexCoord2f<0.0f,0.0f>;glVertex3f<-0.0f,1.5f,0.0f>;//紋理和四邊形的左下glTexCoord2f<1.0f,0.0f>;glVertex3f<-0.0f,1.5f,1.0f>;//紋理和四邊形的右下glTexCoord2f<1.0f,1.0f>;glVertex3f<-0.0f,2.5f,1.0f>;//紋理和四邊形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<-0.0f,2.5f,0.0f>;//紋理和四邊形的左上glEnd<>;glPopMatrix<>;glPushMatrix<>;glTranslatef<delta_v,0.0,z>;glRotatef<<GLfloat>delta_v,0.0,1.0,0.0>; glTranslatef<0.0,1.55,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.05,1.9,0.05>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>;}//畫車輪voidcar_wheel<>{GLUquadricObj*quadratic; glColor3f<0.0,0.1,0.1>;glColor3f<r1,g1,b1>;glPushMatrix<>;//壓棧//模型視圖矩陣堆棧,OpenGL提供了相應(yīng)的接口:glPushMatirx<>和glPopMatrix<>//壓棧和堆棧,防止坐標不穩(wěn)定移動。確定每個模型都繪制在預(yù)期的位置,quadratic=gluNewQuadric<>;//創(chuàng)建二次曲面對象。gluNewQuadricglTranslatef<0.2,0,0.7>;//表示將當前圖形向x軸平移0.2,向y軸平移0,向z軸平移0.7,表示物體在這個坐標的時候開始繪制 glRotatef<90.0,0,1.0,0>;//沿著〔90,0,0方向向量逆時針旋轉(zhuǎn)90° glTranslatef<-0.2,0,-0.7>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;//畫圓柱體〔輪胎這是繪制柱面的函數(shù) glTranslatef<0.0,0,0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;glTranslatef<2.0,0,-0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>; glTranslatef<0,0,0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;glPopMatrix<>;//出棧}voidcar<>{ car_body<>;car_wheel<>; LoadGLTextures<>;}voidmydisplay<>{ glClear<GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT>;//清除顏色緩存 glLightModelfv<GL_LIGHT_MODEL_AMBIENT,global_ambient>;//總體光源glMaterialfv<GL_FRONT,GL_SPECULAR,mat_specular1>;//指定鏡面反射光的材質(zhì)屬性glMaterialfv<GL_FRONT,GL_AMBIENT,mat_ambient1>;//指定環(huán)境反射光的材質(zhì)屬性glMaterialfv<GL_FRONT,GL_DIFFUSE,mat_diffuse1>;//指定漫反射光的材質(zhì)屬性glMaterialf<GL_FRONT,GL_SHININESS,mat_shininess1>;//設(shè)置鏡面反射指數(shù)//glPolygonMode<GL_FRONT_AND_BACK,GL_LINE>; glGetFloatv<GL_MODELVIEW_MATRIX,P>;//矩陣視圖,得到模型移動之后的坐標。。不太確定glPushMatrix<>;glLoadMatrixf<M>;//把當前矩陣的16個值設(shè)置為m指定的值runway<>;glPopMatrix<>;glLoadMatrixf<P>;//把當前矩陣的16個值設(shè)置為m指定的值 car<>; glutSwapBuffers<>;//glutSwapBuffers函數(shù)是OpenGL中GLUT工具包中用于實現(xiàn)雙緩沖技術(shù)的一個重要函數(shù)。該函數(shù)的功能是交換兩個緩沖區(qū)指針。}voidspecialKeyBoard<intkey,intx,inty>{switch<key>{caseGLUT_KEY_DOWN://方向鍵下glTranslatef<0,0,0.1+delta_v>;//表示將當前圖形向x軸平移0,向y軸平移0,向z軸平移0.1+delta,表示物體在這個坐標的時候開始繪制glutPostRedisplay<>;//在圖像繪制的所有操作之后,要加入glutPostRedisplay<>來重繪圖像break;caseGLUT_KEY_UP://方向鍵上glTranslatef<0,0,-0.1-delta_v>;glutPostRedisplay<>;break;caseGLUT_KEY_LEFT://方向鍵左glRotatef<1,0,1,0>;glutPostRedisplay<>;break;caseGLUT_KEY_RIGHT://方向鍵右 glRotatef<1,0,-1,0>;glutPostRedisplay<>;break;case'a':delta_v+=0.5;break;case's':delta_v-=0.5;break;}}voidmyReshape<GLsizeiw,GLsizeih>//當窗口大小變化時,//為了防止物體變形,這時要重設(shè)投影轉(zhuǎn)換矩陣,設(shè)置視口轉(zhuǎn)換矩陣,以及視圖轉(zhuǎn)換矩陣。這也是reshape要做的事。{ glViewport<0,0,w,h>;//X,Y————以像素為單位,指定了視口的左下角〔在第一象限,以〔0,0為原點的位置。//width,height————表示這個視口矩形的寬度和高度,根據(jù)窗口的實時變化重繪窗口。glMatrixMode<GL_PROJECTION>;//將當前矩陣指定為投影矩陣glLoadIdentity<>;//該命令是一個無參的無值函數(shù),其功能是用一個4×4的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。 gluPerspective<100.0,w/h,1.0,10.0>;//角度,視景體的寬高比,沿z軸方向的兩裁面之間的距離的近處,沿z軸方向的兩裁面之間的距離的遠處 gluLookAt<0,0,3,0,0,0,0,3,0>;//該函數(shù)定義一個視圖矩陣,并與當前矩陣相乘 glMatrixMode<GL_MODELVIEW>;}voidinit<>{//OpenGL中使用函數(shù)glLightfv<>來創(chuàng)建光源,這里是光源位置 glLightfv<GL_LIGHT0,GL_POSITION,light_position>;//來創(chuàng)建光源,這里是光源位置glLightfv<GL_LIGHT0,GL_AMBIENT,light_ambient>;//打開環(huán)境光glLightfv<GL_LIGHT0,GL_DIFFUSE,light_diffuse>;//打開漫反射光glLightfv<GL_LIGHT0,GL_SPECULAR,light_specular>;//鏡面反射光glShadeModel<GL_SMOOTH>;//明使用哪種著色技術(shù),可以取值GL_FLAT和GL_SMOOTH。默認取值是GL_SMOOTH。glEnable<GL_LIGHTING>;//啟用燈源glEnable<GL_LIGHT0>;//啟用光源,必須啟用,否則光照模型無效 glEnable<GL_TEXTURE_2D>; glEnable<GL_DEPTH_TEST>; //啟用深度測試。glClearColor<1.0, 1.0,1.0,1.0>;//glClear利用glClearColor函數(shù)設(shè)置好的當前清除顏色設(shè)置窗口顏色glMatrixMode<GL_PROJECTION>;glLoadIdentity<>;glOrtho<-10.0,10.0,-10.0,10.0,-10.0,10.0>; glMatrixMode<GL_MODELVIEW>;glLoadIdentity<>;glMatrixMode<GL_MODELVIEW>;glGetFloatv<GL_MODELVIEW_MATRIX,M>;glMatrixMode<GL_MODELVIEW>;}intmain<intargc,char**argv>{intbody_menu,wheel_menu,main_menu;//cout<<"操作規(guī)則:〔上下左右鍵控制汽車運動方向,a/k控制加速減速"<<endl; glutInit<&argc,argv>;glutInitDisplayMode<GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH>;glutInitWindowSize<500,500>;glutInitWindowPosition<150,150>;glutCreateWindow<"car">;init<>; glColorMaterial<GL_FRONT,GL_DIFFUSE>;glEnable<GL_COLOR_MATERIAL>;glutSpecialFunc<specialKeyBoard>;glutReshapeFunc<myReshape>;glutDisplayFunc<mydisplay>; body_menu=glutCreateMenu<color_car_body_menu>;glutAddMenuEntry<"red",1>;glutAddMenuEntry<"green",2>;glutAddMenuEntry<"blue",3>;glutAddMenuEntry<"purple",4>;glutAddMenuEntry<"yellow",5>;wheel_menu=glutCreateMenu<color_car_wheel_menu>;glutAddMenuEntry<"blue",1>;glutAddMenuEntry<"green",2>;glutAddMenuEntry<"red",3>;glutAddMenuEntry<"purple",4>;glutAddMenuEntry<"yellow",5>;main_menu=glutCreateMenu<menu>;glutAddSubMenu<"car_body_color",body_menu>;glutAddSubMenu<"car_wheel_color",wheel_menu>; glutAddMenuEntry<"quit",3>;glutAttachMenu<GLUT_RIGHT_BUTTON>; glutMainLoop<>;//程序運行函數(shù),glutMainLoop<>。return0;}帆船模型#include<gl/glut.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<GL/GLAUX.H>#pragmacomment<lib,"opengl32.lib"> #pragmacomment<lib,"glu32.lib"> #pragmacomment<lib,"glaux.lib">staticintshoulder1=0;staticintshoulder2=0;staticinthand=0;staticintturn1=0;staticinttag=0;staticintturn=0;//轉(zhuǎn)彎staticfloatforward=0;//前進staticfloatelbow=0,z=0;intw;inth;intfont=<int>GLUT_BITMAP_8_BY_13;chars[30];intframe,timeOwn,timebase=0;staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;//是否停止轉(zhuǎn)動boolIsStop=false;//光照使用光源GLfloatlightPos[]={1.0f,0.0f,-1.0f,0.0f};GLfloatspecular[]={1.0f,1.0f,1.0f,-1.0f};//反射光GLfloatspecref[]={1.0f,1.0f,1.0f,1.0f};//GLfloatambientLight[]={0.5f,0.5f,0.5f,1.0f};//環(huán)繞光GLfloatspotDir[]={0.0f,0.0f,-1.0f};GLbooleanbEdgeFlag=true;GLfloatfogcolor[]={0.5f,0.7f,0.5f,1.0f};voidshowText<void>;voidresetPerspectiveProjection<>;voidsetOrthographicProjection<>;voidSomething<>;voidrenderBitmapString<floatx,floaty,void*font,char*string>;//設(shè)置背景voidSetupRC<void>{ glEnable<GL_CULL_FACE>;glEnable<GL_LIGHTING>;glLightModelfv<GL_LIGHT_MODEL_AMBIENT,ambientLight>;glLightfv<GL_LIGHT0,GL_DIFFUSE,ambientLight>;glLightfv<GL_LIGHT0,GL_SPECULAR,specular>;glLightfv<GL_LIGHT0,GL_POSITION,lightPos>;glLightf<GL_LIGHT0,GL_SPOT_CUTOFF,30.0f>;glLightf<GL_LIGHT0,GL_SPOT_EXPONENT,20.0f>;glEnable<GL_LIGHT0>;glEnable<GL_COLOR_MATERIAL>;glColorMaterial<GL_FRONT,GL_AMBIENT_AND_DIFFUSE>;glMaterialfv<GL_FRONT,GL_SPECULAR,specref>;glMateriali<GL_FRONT,GL_SHININESS,8>;glClearColor<1.0f,1.0f,1.0f,1.0f>;}GLuinttexture[2];//存儲一個紋理AUX_RGBImageRec*LoadBMP<CHAR*Filename>//載入位圖圖象{FILE*File=NULL;//文件句柄if<!Filename>//確保文件名已提供{returnNULL;//如果沒提供,返回NULL}File=fopen<Filename,"r">;//嘗試打開文件if<File>//文件存在么?{fclose<File>;//關(guān)閉句柄returnauxDIBImageLoadA<Filename>;//載入位圖并返回指針}returnNULL;//如果載入失敗,返回NULL}intLoadGLTextures<>//載入位圖<調(diào)用上面的代碼>并轉(zhuǎn)換成紋理{intStatus=FALSE;//狀態(tài)指示器AUX_RGBImageRec*TextureImage[2];//創(chuàng)建紋理的存儲空間memset<TextureImage,0,sizeof<void*>*1>;//將指針設(shè)為NULL//載入位圖,檢查有無錯誤,如果位圖沒找到則退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//將Status設(shè)為TRUEglGenTextures<2,&texture[0]>;//創(chuàng)建紋理for<intloop=0;loop<2;loop++> { glBindTexture<GL_TEXTURE_2D,texture[loop]>;//綁定紋理 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR>;//設(shè)置濾波模式 glTexParameteri<GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR>; glTexImage2D<GL_TEXTURE_2D,0,3,TextureImage[loop]->sizeX,TextureImage[loop]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[loop]->data>;//生成紋理 }}for<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL> {if<TextureImage[loop]->data!=NULL> { free<TextureImage[loop]->data>; } free<TextureImage[loop]>; } }returnStatus;//返回Status}voidDrawCube<void>//從這里開始進行所有的繪制{glLoadIdentity<>;//重置當前的模型觀察矩陣glRotatef<xRot,1.0f,0.0f,0.0f>;//繞X軸旋轉(zhuǎn)glRotatef<yRot,0.0f,1.0f,0.0f>;//繞Y軸旋轉(zhuǎn)glTranslatef<0.0f,0.0f,-10.0f>;//移入屏幕5個單位glColor3f<1.0,1.0,0.0>;glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>;glBindTexture<GL_TEXTURE_2D,texture[0]>;//選擇紋理glBegin<GL_QUADS>;//右面glTexCoord2f<1.0f,0.0f>;glVertex3f<0.0f,1.5f,0.0f>;//紋理和四邊形的右下glTexCoord2f<1.0f,1.0f>;glVertex3f<0.0f,2.5f,0.0f>;//紋理和四邊形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<0.0f,2.5f,1.0f>;//紋理和四邊形的左上glTexCoord2f<0.0f,0.0f>;glVertex3f<0.0f,1.5f,1.0f>;//紋理和四邊形的左下glEnd<>;glBindTexture<GL_TEXTURE_2D,texture[1]>;//選擇紋理glBegin<GL_QUADS>;//左面glTexCoord2f<0.0f,0.0f>;glVertex3f<-0.0f,1.5f,0.0f>;//紋理和四邊形的左下glTexCoord2f<1.0f,0.0f>;glVertex3f<-0.0f,1.5f,1.0f>;//紋理和四邊形的右下glTexCoord2f<1.0f,1.0f>;glVertex3f<-0.0f,2.5f,1.0f>;//紋理和四邊形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<-0.0f,2.5f,0.0f>;//紋理和四邊形的左上glEnd<>;glPopMatrix<>;glFlush<>;}voiddisplay<void>{glClear<GL_COLOR_BUFFER_BIT>;glShadeModel<GL_SMOOTH>;//glEnable<GL_FOG>;//啟用霧化模型//glFogi<GL_FOG_MODE,GL_EXP>;//設(shè)置霧的類型//glFogf<GL_FOG_DENSITY,0.04f>;//設(shè)置霧的密度//glFogfv<GL_FOG_COLOR,fogcolor>;//設(shè)定霧的顏色//glHint<GL_FOG_HINT,GL_DONT_CARE>;//設(shè)置系統(tǒng)如何計算霧氣//glFogf<GL_FOG_START,3.0f>;//設(shè)置霧氣的開始位置//glFogf<GL_FOG_END,8.0f>;//設(shè)置霧氣的結(jié)束位置if<IsStop==false>{turn=<turn-5>%360;if<forward<2>{turn1=turn;forward=forward-0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z-0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;if<shoulder1>=0>{elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;if<shoulder1>=0>{elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if<shoulder1>30>{tag=1;}if<shoulder1<-30>{tag=0;}}else{turn1=turn;forward=forward+0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z+0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;}else{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;}if<shoulder1>30>{tag=0;}if<shoulder1<-30>{tag=1;}}}glBegin<GL_QUADS>;glColor3ub<140,210,240>;glVertex3f<8.0f,-3.0f,-4.0f>;glVertex3f<-8.0f,-3.0f,-4.0f>;glColor3ub<66,250,250>;glVertex3f<-8.0f,-3.0f,4.0f>;glVertex3f<8.0f,-3.0f,4.0f>;glEnd<>;glPushMatrix<>;glTranslatef<3.0,4.0,0.0>; glColor3f<1.0,0.0,0.2>; glutSolidSphere<0.3,100,100>; glPopMatrix<>;glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.5,0.0>;glColor3f<1.0,0.3,0.2>;glPushMatrix<>;glScalef<0.5,0.2,0.5>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.3,0.0>;glColor3f<0.5,0.3,0.2>;glPushMatrix<>;glScalef<0.5,0.1,0.5>;glutSolidCube<2.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.1,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.5,0.1,1>;glutSolidCube<2.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,1.55,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.01,1.9,0.01>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>; DrawCube<>;glutSwapBuffers<>;}voidrenderBitmapString<floatx,floaty,void*font,char*string>{char*c;glRasterPos2f<x,y>;for<c=string;*c!='\0';c++>{glutBitmapCharacter<font,*c>;}}voidreshape<intw1,inth1>{w=w1;h=h1;glViewport<0,0,<GLsizei>w1,<GLsizei>h1>;glMatrixMode<GL_PROJECTION>;glLoadIdentity<>;gluPerspective<65.0,<GLfloat>w1/<GLfloat>h1,1.0,20.0>;glMatrixMode<GL_MODELVIEW>;glLoadIdentity<>;glTranslatef<0.0,0.0,-8.0>;}voidkeyboard<unsignedcharkey,intx,inty>{switch<key>{case'w'://向后走turn1=turn;forward=forward-0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z-0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;if<shoulder1>=0>{elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;if<shoulder1>=0>{elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if<shoulder1>30>{tag=1;}if<shoulder1<-30>{tag=0;}IsStop=true;glutPostRedisplay<>;break;case's'://向前走turn1=turn;forward=forward+0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z+0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1-1>;shoulder2

溫馨提示

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

提交評論