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

下載本文檔

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

文檔簡介

1、計算機圖形學實驗報告題目: 3D真實感場景繪制 姓名: 郭繼杰 學號: 2014214168 班級: 地信141 學院: 理學院 指導老師: 解山娟 日期: 2017年1月1日 一、 實驗目的結合一學期所學計算機圖形學知識,基于專業(yè)背景,使用OpenGL繪制簡單的3D真實感圖形場景。二、 實驗要求應用光柵化算法、多邊形裁剪計算以及消隱算法在場景繪制中,其中真實感場景繪制包括顏色模型、紋理模型、霧化模型、運動模型以及環(huán)境光、漫反射、鏡面反射等光照模型設置。三、 實驗小組及任務分工小組成員任務分工金 城紋理貼圖,顏色模型,霧化模型郭繼杰運動模型,光照模型沈黎達材料收集,代碼整合四、 實驗內容1.實

2、驗前期工作前期工作經過小組成員充分討論,資料收集,最終確定小組實驗模板為以下兩幅場景。目標是實現一艘簡單3D帆船模型以及一輛3D小車模型 2.程序編譯環(huán)境:Visual Studio 20123.光照模型建立過程光照模型建立流程圖:3.1設置光照模型相應指數3.2打開光源光照模型設計過程有兩點注意的是:1、glShadeModel函數用于控制opengl中繪制指定兩點間其他點顏色的過渡模式,參數一般為GL_SMOOTH、GL_FLAT,如果兩點的顏色相同,使用兩個參數效果相同,如果兩點顏色不同,GL_SMOOTH會出現過渡效果,GL_FLAT 則只是以指定的某一點的單一色繪制其他所有點。 gl

3、ShadeModel(GL_FLAT) 著色模式 glShadeModel(GL_SMOOTH)著色模式(可以看出GL_SMOOTH模式下顏色更加光滑)2、需要使用光照模型時必須啟用,glEnable(GL_LIGHTING)(啟用燈源)、 glEnable(GL_LIGHT0)(啟用光源),否則所有燈光效果都會無效。效果對比如下圖所示。 (未啟用燈光) (啟用燈光) (未啟用燈光) (啟用燈光)4.顏色模型建立過程1.設定多邊形圖形:OpenGL利用glBegin()函數畫圖形樣式,里面的參數表示圖形樣式,這里以glBegin(GL_QUADS)為例,GL_QUADS表示繪制由四個頂點組成的

4、一組單獨的四邊形。2.設定顏色:OpenGL利用glColor3f(a,b,c)函數設置圖形顏色,里面的參數表示設定顏色的顏色。3.坐標設定:OpenGL利用glVertex3f(a,b,c)函數設置圖形坐標,里面的參數表示坐標的位置。以跑道顏色模型為例: (未使用顏色模型)(使用顏色模型)5.霧化模型建立過程霧是生活中比較常見的現象,有了霧化模型,場景會比較逼真。1.建立過程及參數設定如下:2.其中,設置霧氣起始位置與結束位置可以使霧氣濃度隨運動模型變化。3.效果對比 (未使用霧化) (使用霧化)4.實驗存在不足之處,由于本實驗的場景繪制不是特別接近真實感,所以霧化模型的效果不是很好。6運動

5、模型建立過程1. 本次實驗的運動模型主要由鍵盤按鍵響應發(fā)生。2. 設定鍵盤按鍵響應函數void specialKeyBoard(int key,int x,int y)在主函數入口設定設置當前窗口的特定鍵的回調函數glutSpecialFunc(specialKeyBoard);glTranslatef(0,0,0.1+delta_v);/表示將當前圖形向x軸平移0,向y軸平移0,向z軸平移0.1+delta ,表示物體在這個坐標的時候開始繪制。glutPostRedisplay();在圖像繪制的所有操作之后,要加入 glutPostRedisplay()函數來重繪圖像。實現物體的移動glRo

6、tatef(1,0,1,0); /,旋轉角度函數,表示小車往(0,1,0)向量方向逆時針旋轉1°以上都是控制小車運動的函數,通過鍵盤響應來觸發(fā)。 (向前運動) (旋轉) 7紋理貼圖過程載入位圖圖像:AUX_RGBImageRec *LoadBMP(CHAR *Filename) /載入位圖圖象FILE *File=NULL; /文件句柄if (!Filename) /確保文件名已提供return NULL; /如果沒提供,返回 NULLFile=fopen(Filename,"r"); /嘗試打開文件if (File) /判斷文件是否存在?fclose(File)

7、; /關閉句柄return auxDIBImageLoadA(Filename); /載入位圖并返回指針return NULL; /如果載入失敗,返回 NULL位圖轉化成紋理:int LoadGLTextures() /載入位圖(調用上面的代碼)并轉換成紋理int Status= FALSE; /狀態(tài)指示器 AUX_RGBImageRec *TextureImage2; /創(chuàng)建紋理的存儲空間 memset(TextureImage,0,sizeof(void *)*1);/將指針設為 NULL /載入位圖,檢查有無錯誤,如果位圖沒找到則退出 if (TextureImage0=LoadBMP(

8、"Data/wenli.bmp")&&(TextureImage1=LoadBMP("Data/wenli2.bmp") Status= TRUE; /將Status設為TRUE glGenTextures(2, &texture0); /創(chuàng)建紋理 for(int loop=0;loop<2;loop+)glBindTexture(GL_TEXTURE_2D,textureloop);/綁定紋理glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/設置

9、濾波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImageloop->sizeX, TextureImageloop->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImageloop->data);/生成紋理 for (int loop=0; loop<2; loop+)if (TextureImageloop!=NULL) /判斷紋理是否存在if (TextureI

10、mageloop->data!=NULL) /紋理圖像是否存在free(TextureImageloop->data); /釋放紋理圖像占用內存free(TextureImageloop); /釋放圖像結構return Status; /返回 Status調用紋理glBindTexture(GL_TEXTURE_2D, texture0); /選擇紋理glBegin(GL_QUADS); /開始繪制四邊形glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.0f, 1.5f, 0.0f); / 紋理和四邊形的右下glTexCoord2f(1.0f, 1.0

11、f); 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次方大小,只有滿足這個條件,這個紋理圖片才是有效的。一旦獲取了像素值,我們就可以將這些數據傳給OpenGL,讓OpenGL生成一個紋理貼圖:gl

12、GenTextures(2, &texture0):創(chuàng)建紋理對象glBindTexture(GL_TEXTURE_2D,textureloop):綁定紋理對象glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImageloop->sizeX, TextureImageloop->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImageloop->data):將Pixels數組中的像素值傳給當前綁定的紋理對象,于是便創(chuàng)建了紋理。glTexImage函數的參數分別是紋理的類型,紋理的等級,每個像素的字

13、節(jié)數,紋理圖像的寬度和高度,邊框大小,像素數據的格式,像素值的數據類型,像素數據。(2)紋理濾鏡:在紋理映射的過程中,如果圖元的大小不等于紋理的大小,OpenGL便會對紋理進行縮放以適應圖元的尺寸。我們可以通過設置紋理濾鏡來決定OpenGL對某個紋理采用的放大、縮小的算法。調用glTexParameter來設置紋理濾鏡。如:glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/設置放大濾鏡glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/設置縮

14、小濾鏡(3)紋理坐標:要使用當前的紋理繪制圖元,我們必須在繪制每個頂點之前為該頂點指定紋理坐標。只需調用glTexCoord2d(s:Double;t:Double);函數即可。其中,s、t是對于2D紋理而言的s、t坐標。對于任何紋理,無論紋理的真正大小如何,其頂端(左上角)的紋理坐標恒為(0,0),右下角的紋理坐標恒為(1,1)。也就是說,紋理坐標應是一個介于0到1之間的一個小數。紋理貼圖前后對比效果見圖5。 紋理貼圖前 紋理貼圖后五、 成果展示本次實驗將兩個模型進行改造,實現了一輛簡單的小車以及一艘簡單的帆船。(小車模型)(帆船模型)六、 心得體會計算機圖形學本身是一門理論與實踐都比較復雜

15、的學科,從最開始二維圖形的實現,到最后三維真實感場景的實現,都不是一個簡單的過程,好的真實感場景實現需要多個模型的相互融合,在實驗設計過程中,難免遇到困難,下面是本次實驗總結出來的感受。1. glEnable( )啟動函數,無論是構造什么樣的模型,都需要由這個函數來啟動,如光照模型需要glEnable(GL_LIGHTING),紋理貼圖需要glEnable(GL_TEXTURE_2D);沒有啟動函數的作用,效果都是不可能是實現的。2. glPushMatrix()和glPopMatrix()函數的使用,這兩個函數在OpenGL中是模型視圖矩陣堆棧,分別是壓棧和出棧函數,防止坐標不穩(wěn)定移動。確定

16、每個模型都繪制在預期的位置。以本次實驗中小車模型畫車輪為例:這個函數中使用了堆棧的函數,為了使輪胎往預期的方向移動,否則,輪胎移動的效果會變成規(guī)則的向不同地方跳動,顯的不切合實際。3.最后,個人感覺OpenGL場景的實現最重要的是函數的調用以及流程控制運用。函數的重要性不言而喻。如果可以充分吸收模型中各類函數的用法,實現一個場景就不會那么困難,流程控制就是應該想好模型設計的順序問題,順序問題一旦解決,運用到程序中,思路清晰就會便于成功。七、源代碼實例1.小車模型:#include<stdio.h>#include<stdlib.h>#include <GL/glu

17、t.h>#include <math.h> #include <GL/GLAUX.H>#include <gl/gl.h>#include<math.h>#pragma comment( lib, "opengl32.lib") #pragma comment( lib, "glu32.lib") #pragma comment( lib, "glaux.lib")float delta_v=0.0;float r=1.0,g=1.0,b=0.0;float r1=0.0,g1=0

18、.0,b1=0.0;float P16;float M16;static GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;static float elbow = 0 ,z=0; /光線及材質的定義GLfloat global_ambient=0.1,0.1,0.1,0.1; /總體環(huán)境光設置GLfloat light_ambient=0.0, 0.0, 0.0, 1.0; /環(huán)境光,通常定義在光源中GLfloat light_diffuse=1.0, 1.0, 1.0, 1.0; /漫反射光(Diffuse Light)GLfloat light

19、_specular=1.0, 1.0, 1.0, 1.0; /和鏡面反射光(Specular Light)。GLfloat light_position=20.0, 20.0, 20.0, 0.0; /光源位置GLfloat mat_specular1=1.0, 1.0, 1.0, 1.0; /鏡面反射光材質材質GLfloat mat_diffuse1=1.0, 1.0, 1.0, 1.0; /漫反射光材質GLfloat mat_ambient1=1.0, 1.0, 1.0, 1.0; /環(huán)境光材質GLfloat mat_shininess1=10.0; /鏡面反射指數GLfloat vert

20、ices 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;GLfloat fogcolor=0.5f,0.7f,0.5f,1.0f;GLuint texture2; /存儲2個紋理AUX_RGBImageRec *LoadBMP(CHAR *Filename) /載入位圖圖象FILE *File=NULL; /文件句柄if (!Filename) /確保文件名已提供return NULL; /如果沒提供,返回 NULLFile=fopen(Filename,"r&q

21、uot;); /嘗試打開文件if (File) /判斷文件是否存在?fclose(File); /關閉句柄return auxDIBImageLoadA(Filename); /載入位圖并返回指針return NULL; /如果載入失敗,返回 NULLint LoadGLTextures() /載入位圖(調用上面的代碼)并轉換成紋理int Status= FALSE; /狀態(tài)指示器 AUX_RGBImageRec *TextureImage2; /創(chuàng)建紋理的存儲空間 memset(TextureImage,0,sizeof(void *)*1);/將指針設為 NULL /載入位圖,檢查有無錯誤

22、,如果位圖沒找到則退出 if (TextureImage0=LoadBMP("Data/wenli.bmp")&&(TextureImage1=LoadBMP("Data/wenli2.bmp") Status= TRUE; /將Status設為TRUE glGenTextures(2, &texture0); /創(chuàng)建紋理 for(int loop=0;loop<2;loop+)glBindTexture(GL_TEXTURE_2D,textureloop);/綁定紋理glTexParameteri(GL_TEXTURE_2

23、D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/設置濾波模式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImageloop->sizeX, TextureImageloop->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImageloop->data);/生成紋理 for (int loop=0; loop<2; loop+)if (Textu

24、reImageloop!=NULL) /判斷紋理是否存在if (TextureImageloop->data!=NULL) /紋理圖像是否存在free(TextureImageloop->data);/釋放紋理圖像占用內存free(TextureImageloop); /釋放圖像結構return Status; /返回 Statusvoid menu(int id) /設置一個右鍵菜單功能switch(id)case (1):exit(0);break;glutPostRedisplay();void color_car_body_menu(int id)/車身顏色變化菜單 swi

25、tch(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();void color_car_wheel_menu(int id)/車輪顏色變化菜單 switch(id) case(1): r1=0

26、.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();/定義跑道void runway() glBegin(GL_QUADS); /GL_QUADS:繪制由四個頂點組成的一組單獨的四邊形。

27、/頂點4n3、4n2、4n1和4n定義了第n個四邊形。總共繪制N/4個四邊形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); 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);

28、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); /跑

29、道樣式 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(); /畫車身void quad(int a,int b, int c

30、, int d)glBegin(GL_QUADS); /GL_QUADS:繪制由四個頂點組成的一組單獨的四邊形。頂點4n3、4n2、4n1和4n定義了第n個四邊形。總共繪制N/4個四邊形 glVertex3fv(verticesa); glVertex3fv(verticesb); glVertex3fv(verticesc); glVertex3fv(verticesd);glEnd();void car_body() glColor3f(1.0,0.0,0.0); /顏色模型函數glColor3f(r,g,b); /設定初始顏色glNormal3f(0.0f, -1.0f, 0.0f);

31、/buttom,設置當前法線數組 ,指定新的當前法線的x, y, z坐標。各個定點的法向量不同,所以在確定頂點之前確定法向量。quad(0,1,2,3);glNormal3f(1.0f, 0.0f, 0.0f); /rightquad(1,2,6,5);glNormal3f(0.0f, 0.0f, -1.0f); /backquad(2,3,7,6);glNormal3f(-1.0f, 0.0f, 0.0f); /leftquad(7,3,0,4);glNormal3f(0.0f, 0.0f, 1.0f); /frontquad(0,1,5,4);glNormal3f(0.0f, 1.0f,

32、0.0f); /topquad(4,5,6,7); glBindTexture(GL_TEXTURE_2D, texture0); /選擇紋理 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);/紋理和四邊形的左上 gl

33、TexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 1.5f, 1.0f); /紋理和四邊形的左下 glEnd(); glBindTexture(GL_TEXTURE_2D, texture1); / 選擇紋理 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.0

34、f, 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); glPushMa

35、trix(); glScalef (0.05,1.9,0.05); glutSolidCube(1.0); glPopMatrix(); glPopMatrix(); /畫車輪 void car_wheel() GLUquadricObj *quadratic; glColor3f(0.0,0.1,0.1); glColor3f(r1,g1,b1); glPushMatrix(); /壓棧 /模型視圖矩陣堆棧,OpenGL提供了相應的接口:glPushMatirx()和glPopMatrix() /壓棧和堆棧,防止坐標不穩(wěn)定移動。確定每個模型都繪制在預期的位置, quadratic=gluNe

36、wQuadric(); /創(chuàng)建二次曲面對象。gluNewQuadric glTranslatef(0.2,0,0.7); /表示將當前圖形向x軸平移0.2,向y軸平移0,向z軸平移0.7 ,表示物體在這個坐標的時候開始繪制 glRotatef(90.0,0,1.0,0); /沿著(90,0,0)方向向量逆時針旋轉90° glTranslatef(-0.2,0,-0.7); gluCylinder(quadratic,0.25f,0.25f,0.2f,32,32); /畫圓柱體(輪胎)這是繪制柱面的函數 glTranslatef(0.0,0,0.8); gluCylinder(quad

37、ratic,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();/出棧 void car() car_body(); car_wheel(); LoadGLTextures(); void mydisplay() glClear(GL_COLOR_BUFFER_BIT | GL_DEPT

38、H_BUFFER_BIT); /清除顏色緩存 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,global_ambient); / 總體光源 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular1); /指定鏡面反射光的材質屬性 glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1); /指定環(huán)境反射光的材質屬性 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1); /指定漫反射光的材質屬性 glMaterialf(GL_FRONT,

39、GL_SHININESS, mat_shininess1); /設置鏡面反射指數 /glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glGetFloatv(GL_MODELVIEW_MATRIX, P); /矩陣視圖,得到模型移動之后的坐標。不太確定 glPushMatrix(); glLoadMatrixf(M); /把當前矩陣的16個值設置為m指定的值 runway(); glPopMatrix(); glLoadMatrixf(P); /把當前矩陣的16個值設置為m指定的值 car(); glutSwapBuffers(); /glutSwapBuf

40、fers函數是OpenGL中GLUT工具包中用于實現雙緩沖技術的一個重要函數。該函數的功能是交換兩個緩沖區(qū)指針。 void specialKeyBoard(int key,int x,int y) switch(key) case GLUT_KEY_DOWN: /方向鍵下 glTranslatef(0,0,0.1+delta_v);/表示將當前圖形向x軸平移0,向y軸平移0,向z軸平移0.1+delta ,表示物體在這個坐標的時候開始繪制 glutPostRedisplay(); /在圖像繪制的所有操作之后,要加入 glutPostRedisplay() 來重繪圖像 break; case G

41、LUT_KEY_UP: /方向鍵上 glTranslatef(0,0,-0.1-delta_v); glutPostRedisplay(); break; case GLUT_KEY_LEFT: /方向鍵左 glRotatef(1,0,1,0); glutPostRedisplay(); break;case GLUT_KEY_RIGHT: /方向鍵右glRotatef(1,0,-1,0); glutPostRedisplay(); break; case 'a': delta_v+=0.5; break; case 's': delta_v-=0.5; bre

42、ak; void myReshape(GLsizei w,GLsizei h) /當窗口大小變化時, /為了防止物體變形,這時要重設投影轉換矩陣,設置視口轉換矩陣,以及視圖轉換矩陣。這也是reshape要做的事。 glViewport(0,0,w,h); /X,Y以像素為單位,指定了視口的左下角(在第一象限內,以(0,0)為原點的)位置。 /width,height表示這個視口矩形的寬度和高度,根據窗口的實時變化重繪窗口。 glMatrixMode (GL_PROJECTION); /將當前矩陣指定為投影矩陣 glLoadIdentity (); /該命令是一個無參的無值函數,其功能是用一個4

43、×4的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。 gluPerspective(100.0,w/h,1.0,10.0);/角度,視景體的寬高比,沿z軸方向的兩裁面之間的距離的近處,沿z軸方向的兩裁面之間的距離的遠處 gluLookAt(0,0,3,0,0,0,0,3,0); /該函數定義一個視圖矩陣,并與當前矩陣相乘 glMatrixMode (GL_MODELVIEW); void init() /OpenGL中使用函數glLightfv()來創(chuàng)建光源,這里是光源位置 glLightfv(GL_LIGHT0, GL_POSITION, light_position);

44、 /來創(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); /明使用哪種著色技術,可以取值GL_FLAT和GL_SMOOTH。默認取值是GL_SMOOTH。 glEnable(GL_LIGHTING); /啟用燈源 glEnable(G

45、L_LIGHT0); /啟用光源,必須啟用,否則光照模型無效 glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); /啟用深度測試。 glClearColor(1.0,1.0,1.0,1.0); /glClear利用glClearColor函數設置好的當前清除顏色設置窗口顏色 glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0); glMatrixMode (GL_MODELVIEW); glLoadIdenti

46、ty (); glMatrixMode (GL_MODELVIEW); glGetFloatv(GL_MODELVIEW_MATRIX, M); glMatrixMode (GL_MODELVIEW); int main(int argc, char* argv) int body_menu,wheel_menu,main_menu; /cout<<"操作規(guī)則:(上下左右鍵控制汽車運動方向,a/k控制加速減速)"<<endl;glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_

47、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("pur

溫馨提示

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

評論

0/150

提交評論