計算機圖形學(xué)試驗_第1頁
計算機圖形學(xué)試驗_第2頁
計算機圖形學(xué)試驗_第3頁
計算機圖形學(xué)試驗_第4頁
計算機圖形學(xué)試驗_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機圖形學(xué)試驗第1頁,共70頁,2023年,2月20日,星期四試驗1:創(chuàng)建一個OpenGL窗口

打開VC然后創(chuàng)建一個新工程,創(chuàng)建一個新的Win32程序(不是console控制臺程序)第2頁,共70頁,2023年,2月20日,星期四鏈接OpenGL庫文件,Project->Settings,(工程—>設(shè)置)然后單擊LINK標簽:增加OpenGL32.libGLu32.lib和GLaux.lib后單擊OK按鈕。

第3頁,共70頁,2023年,2月20日,星期四代碼的前3行包括了我們使用的每個庫文件的頭文件。如下所示:

#include<windows.h>//Windows的頭文件#include<glew.h>//包含最新的gl.h,glu.h庫#include<glut.h>//包含OpenGL實用庫第4頁,共70頁,2023年,2月20日,星期四完成程序的開發(fā)。如下圖所示參考程序第5頁,共70頁,2023年,2月20日,星期四試驗2:繪制簡單圖形glLoadIdentity(),重置當前的模型觀察矩陣,將當前點移到了屏幕中心,X坐標軸從左至右Y坐標軸從下至上,Z坐標軸從里至外。OpenGL屏幕中心的坐標值是X和Y軸上的0.0f點。第6頁,共70頁,2023年,2月20日,星期四glTranslatef(x,y,z)沿著X,Y和Z軸移動。

glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0第7頁,共70頁,2023年,2月20日,星期四glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,-1.0f,0.0f);//上頂點glVertex3f(-1.0f,-1.0f,0.0f);//左下頂點glVertex3f(1.0f,-1.0f,0.0f);//右下頂點glEnd();//三角形繪制結(jié)束0.0f,1.0f,0.0f-1.0f,-1.0f,0.0f1.0f,-1.0f,0.0f第8頁,共70頁,2023年,2月20日,星期四glBegin(GL_QUADS);//繪制正方形

glVertex3f(-1.0f,1.0f,0.0f);//左上

glVertex3f(1.0f,1.0f,0.0f);//右上

glVertex3f(1.0f,-1.0f,0.0f);//左下

glVertex3f(-1.0f,-1.0f,0.0f);//右下glEnd();//正方形繪制結(jié)束-1.0f,1.0f,0.0f1.0f,1.0f,0.0f1.0f,-1.0f,0.0f-1.0f,-1.0f,0.0f第9頁,共70頁,2023年,2月20日,星期四在在第一實驗的基礎(chǔ)上,在完成程序的DrawGLScene()過程中增加代碼:

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//清除屏幕及深度緩存glLoadIdentity();//重置當前的模型觀察矩陣

glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,1.0f,0.0f);//上頂點glVertex3f(-1.0f,-1.0f,0.0f);//左下glVertex3f(1.0f,-1.0f,0.0f);//右下

glEnd();第10頁,共70頁,2023年,2月20日,星期四

glTranslatef(3.0f,0.0f,0.0f);//右移3單位

glBegin(GL_QUADS);//繪制正方形glVertex3f(-1.0f,1.0f,0.0f);//左上glVertex3f(1.0f,1.0f,0.0f);//右上

glVertex3f(1.0f,-1.0f,0.0f);//左下glVertex3f(-1.0f,-1.0f,0.0f);//右下

glEnd();//正方形繪制結(jié)束畫完三角形后,我們要移到右半部分來畫正方形。否則兩個圖形會相互重疊第11頁,共70頁,2023年,2月20日,星期四完成程序的開發(fā)。如下圖所示參考程序第12頁,共70頁,2023年,2月20日,星期四試驗3著色glColor3f(r,g,b)。括號中的三個參數(shù)依次是紅、綠、藍三色分量。參數(shù)取值范圍從0,0f到1.0f。glColor3f(1.0f,0.0f,0.0f)紅色glColor3f(0.0f,1.0f,0.0f)綠色glColor3f(0.0f,0.0f,1.0f)藍色第13頁,共70頁,2023年,2月20日,星期四修改實驗2中,畫三角形的代碼為:glBegin(GL_TRIANGLES);//繪制三角形glColor3f(1.0f,0.0f,0.0f);//設(shè)置當前色為紅色

glVertex3f(0.0f,1.0f,0.0f);//上頂點glColor3f(0.0f,1.0f,0.0f);//設(shè)置當前色為綠色

glVertex3f(-1.0f,-1.0f,0.0f);//左下glColor3f(0.0f,0.0f,1.0f);//設(shè)置當前色為藍色

glVertex3f(1.0f,-1.0f,0.0f);//右下

glEnd();第14頁,共70頁,2023年,2月20日,星期四修改實驗2中,畫正方形的代碼為:glColor3f(0.5f,0.5f,1.0f);//一次性將當前色設(shè)置為藍色glBegin(GL_QUADS);//繪制正方形

glVertex3f(-1.0f,1.0f,0.0f);//左上

glVertex3f(1.0f,1.0f,0.0f);//右上

glVertex3f(1.0f,-1.0f,0.0f);//左下

glVertex3f(-1.0f,-1.0f,0.0f);//右下

glEnd();//正方形繪制結(jié)束第15頁,共70頁,2023年,2月20日,星期四完成程序的開發(fā)。如下圖所示參考程序第16頁,共70頁,2023年,2月20日,星期四試驗4旋轉(zhuǎn)glRotatef(Angle,Xvector,Yvector,Zvector)負責(zé)讓對象繞某個軸旋轉(zhuǎn)。Xvector,Yvector和Zvector三個參數(shù)則共同決定旋轉(zhuǎn)軸的方向。比如(1,0,0)所描述的矢量經(jīng)過X坐標軸的1個單位處并且方向向右。(-1,0,0)所描述的矢量經(jīng)過X坐標軸的1個單位處,但方向向左。

第17頁,共70頁,2023年,2月20日,星期四X軸-您正在使用一臺臺鋸。鋸片中心的軸從左至右擺放(就像OpenGL中的X軸)。尖利的鋸齒繞著X軸狂轉(zhuǎn),看起來要么向上轉(zhuǎn),要么向下轉(zhuǎn)。取決于鋸片開始轉(zhuǎn)時的方向。這與我們在OpenGL中繞著X軸旋轉(zhuǎn)什么的情形是一樣的。Y軸-假設(shè)您正處于一個巨大的龍卷風(fēng)中心,龍卷風(fēng)的中心從地面指向天空(就像OpenGL中的Y軸)。垃圾和碎片圍著Y軸從左向右或是從右向左狂轉(zhuǎn)不止。這與我們在OpenGL中繞著Y軸旋轉(zhuǎn)什么的情形是一樣的。Z軸-您從正前方看著一臺風(fēng)扇。風(fēng)扇的中心正好朝著您(就像OpenGL中的Z軸)。風(fēng)扇的葉片繞著Z軸順時針或逆時針狂轉(zhuǎn)。這與我們在OpenGL中繞著Z軸旋轉(zhuǎn)什么的情形是一樣的。第18頁,共70頁,2023年,2月20日,星期四在實驗3中畫三角形的語句前添加

glRotatef(rtri,0.0f,1.0f,0.0f);//繞Y軸旋轉(zhuǎn)三角形在屏幕的左面畫了一個彩色漸變?nèi)切?,并繞著Y軸從左向右旋轉(zhuǎn)。第19頁,共70頁,2023年,2月20日,星期四在實驗3中畫正方形的前面加上語句:glRotatef(rquad,1.0f,0.0f,0.0f);//繞X軸旋轉(zhuǎn)四邊形第20頁,共70頁,2023年,2月20日,星期四完成程序,后效果如下:參考程序第21頁,共70頁,2023年,2月20日,星期四試驗5三維圖形給三角形增加一個左側(cè)面,一個右側(cè)面,一個后側(cè)面來生成一個金字塔(四棱錐)。計算好坐標,繪制其它側(cè)面三角形的方法相同。注意所有的面-三角形都是逆時針次序繪制的第22頁,共70頁,2023年,2月20日,星期四給正方形增加左、右、上、下及背面生成一個立方體。計算好坐標,繪制其它側(cè)面正方形的方法相同。所有的四邊形都以逆時針次序繪制。第23頁,共70頁,2023年,2月20日,星期四在3D空間創(chuàng)建對象的方法。必須將OpenGL屏幕想象成一張很大的畫紙,后面還帶著許多透明的層。差不多就是個由大量的點組成的立方體。這些點從左至右、從上至下、從前到后的布滿了這個立方體。如果您能想象的出在屏幕的深度方向,應(yīng)該在設(shè)計新3D對象時沒有任何問題。第24頁,共70頁,2023年,2月20日,星期四程序完成的,效果如下:參考程序第25頁,共70頁,2023年,2月20日,星期四試驗6紋理映射在第一實驗代碼開始處增加新代碼:#include<stdio.h>第26頁,共70頁,2023年,2月20日,星期四在ReSizeGLScene()之前,增加了下面這一段代碼。用來加載位圖文件AUX_RGBImageRec*LoadBMP(char*Filename)//載入位圖圖象{FILE*File=NULL;//文件句柄

if(!Filename)//確保文件名已提供{returnNULL;//如果沒提供,返回NULL}File=fopen(Filename,“r”);//嘗試打開文件

if(File)//文件存在么?{ fclose(File);//關(guān)閉句柄

returnauxDIBImageLoad(Filename);//載入位圖并返回指針

}returnNULL;//如果載入失敗,返回NULL第27頁,共70頁,2023年,2月20日,星期四涉及到的函數(shù)glGenTextures(1,&texture[0])告訴OpenGL想生成一個紋理名字(如果想載入多個紋理,加大數(shù)字)。第28頁,共70頁,2023年,2月20日,星期四glBindTexture(GL_TEXTURE_2D,texture[0])告訴OpenGL將紋理名字texture[0]綁定到紋理目標上。2D紋理只有高度(在Y軸上)和寬度(在X軸上)。主函數(shù)將紋理名字指派給紋理數(shù)據(jù)。第29頁,共70頁,2023年,2月20日,星期四glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);告訴OpenGL此紋理是一個2D紋理(GL_TEXTURE_2D)。參數(shù)“0”代表圖像的詳細程度,通常就由它為零去了。參數(shù)三是數(shù)據(jù)的成分數(shù)。因為圖像是由紅色數(shù)據(jù),綠色數(shù)據(jù),藍色數(shù)據(jù)三種組分組成。TextureImage[0]->sizeX是紋理的寬度。如果您知道寬度,您可以在這里填入,但計算機可以很容易的為您指出此值。TextureImage[0]->sizey是紋理的高度。參數(shù)零是邊框的值,一般就是“0”。

GL_RGB告訴OpenGL圖像數(shù)據(jù)由紅、綠、藍三色數(shù)據(jù)組成。

GL_UNSIGNED_BYTE意味著組成圖像的數(shù)據(jù)是無符號字節(jié)類型的。最后...TextureImage[0]->data告訴OpenGL紋理數(shù)據(jù)的來源。此例中指向存放在TextureImage[0]記錄中的數(shù)據(jù)。第30頁,共70頁,2023年,2月20日,星期四glTexParameteri()告訴OpenGL在顯示圖像時,當它比放大得原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始得紋理小(GL_TEXTURE_MIN_FILTER)時OpenGL采用的濾波方式。通常這兩種情況下都采用GL_LINEAR。

第31頁,共70頁,2023年,2月20日,星期四glBindTexture(GL_TEXTURE_2D,texture[所使用紋理對應(yīng)的數(shù)字])選擇要綁定的紋理。當您想改變紋理時,應(yīng)該綁定新的紋理。有一點值得指出的是,您不能在glBegin()和glEnd()之間綁定紋理,必須在glBegin()之前或glEnd()之后綁定。

第32頁,共70頁,2023年,2月20日,星期四為了將紋理正確的映射到四邊形上,您必須將紋理的右上角映射到四邊形的右上角,紋理的左上角映射到四邊形的左上角,紋理的右下角映射到四邊形的右下角,紋理的左下角映射到四邊形的左下角。如果映射錯誤的話,圖像顯示時可能上下顛倒,側(cè)向一邊或者什么都不是。glTexCoord2f的第一個參數(shù)是X坐標。0.0f是紋理的左側(cè)。0.5f是紋理的中點,1.0f是紋理的右側(cè)。glTexCoord2f的第二個參數(shù)是Y坐標。0.0f是紋理的底部。0.5f是紋理的中點,1.0f是紋理的頂部。所以紋理的左上坐標是X:0.0f,Y:1.0f,四邊形的左上頂點是X:-1.0f,Y:1.0f。其余三點依此類推。試著玩玩glTexCoord2f的X,Y坐標參數(shù)。把1.0f改為0.5f將只顯示紋理的左半部分,把0.0f改為0.5f將只顯示紋理的右半部分。第33頁,共70頁,2023年,2月20日,星期四

intLoadGLTextures()//載入位圖(調(diào)用上面的代碼)并轉(zhuǎn)換成紋理{ intStatus=FALSE;//狀態(tài)指示器

AUX_RGBImageRec*TextureImage[1];//創(chuàng)建紋理的存儲空間

memset(TextureImage,0,sizeof(void*)*1);//將指針設(shè)為NULL//載入位圖,檢查有無錯誤,如果位圖沒找到則退出if(TextureImage[0]=LoadBMP("Data/NeHe.bmp")){Status=TRUE;//將Status設(shè)為TRUE glGenTextures(1,&texture[0]);//創(chuàng)建紋理//使用來自位圖數(shù)據(jù)生成的典型紋理

glBindTexture(GL_TEXTURE_2D,texture[0]);//生成紋理

glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//線形濾波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//線形濾波

第34頁,共70頁,2023年,2月20日,星期四if(TextureImage[0])//紋理是否存在{ if(TextureImage[0]->data)//紋理圖像是否存在{ free(TextureImage[0]->data);//釋放紋理圖像占用的內(nèi)存

} free(TextureImage[0]);//釋放圖像結(jié)構(gòu)

}第35頁,共70頁,2023年,2月20日,星期四InitGL(GLvoid)改動為:intInitGL(GLvoid)//此處開始對OpenGL進行所有設(shè)置{if(!LoadGLTextures())//調(diào)用紋理載入子例程{returnFALSE;//如果未能載入,返回FALSE}glEnable(GL_TEXTURE_2D);//啟用紋理映射glShadeModel(GL_SMOOTH);//啟用陰影平滑glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景glClearDepth(1.0f);//設(shè)置深度緩存glEnable(GL_DEPTH_TEST);//啟用深度測試glDepthFunc(GL_LEQUAL);//所作深度測試的類型glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精細的透視修正returnTRUE;//初始化OK}第36頁,共70頁,2023年,2月20日,星期四DrawGLScene()改動為:添加語句glBindTexture(GL_TEXTURE_2D,texture[0]);//選擇紋理在繪制正方形的glBegin(GL_QUADS);中粘帖紋理,以前面為例//前面glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);//紋理和四邊形的左下glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);//紋理和四邊形的右下glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);//紋理和四邊形的右上glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);//紋理和四邊形的左上第37頁,共70頁,2023年,2月20日,星期四程序完成后效果參考程序第38頁,共70頁,2023年,2月20日,星期四試驗7光照效果使用兩種不同的光。第一種稱為環(huán)境光。環(huán)境光來自于四面八方。所有場景中的對象都處于環(huán)境光的照射中。第二種類型的光源叫做漫射光。漫射光由特定的光源產(chǎn)生,并在您的場景中的對象表面上產(chǎn)生反射。處于漫射光直接照射下的任何對象表面都變得很亮,而幾乎未被照射到的區(qū)域就顯得要暗一些。這樣在所創(chuàng)建的木板箱的棱邊上就會產(chǎn)生的很不錯的陰影效果。第39頁,共70頁,2023年,2月20日,星期四創(chuàng)建光源的過程和顏色的創(chuàng)建完全一致。前三個參數(shù)分別是RGB三色分量,最后一個是alpha通道參數(shù)。GLfloatLightAmbient[]={0.5f,0.5f,0.5f,1.0f};//環(huán)境光參數(shù),得到的是半亮(0.5f)的白色環(huán)境光。如果沒有環(huán)境光,未被漫射光照到的地方會變得十分黑暗。第40頁,共70頁,2023年,2月20日,星期四GLfloatLightDiffuse[]={1.0f,1.0f,1.0f,1.0f};//漫射光參數(shù)生成最亮的漫射光。所有的參數(shù)值都取成最大值1.0f。它將照在木板箱的前面,看起來挺好。第41頁,共70頁,2023年,2月20日,星期四最后保存光源的位置。前三個參數(shù)和glTranslate中的一樣。依次分別是XYZ軸上的位移。由于想要光線直接照射在木箱的正面,所以XY軸上的位移都是0.0f。第三個值是Z軸上的位移。為了保證光線總在木箱的前面,所以我們將光源的位置朝著觀察者挪出屏幕。通常將屏幕也就是顯示器的屏幕玻璃所處的位置稱作Z軸的0.0f點。所以Z軸上的位移最后定為2.0f。假如您能夠看見光源的話,它就浮在您顯示器的前方。GLfloatLightPosition[]={0.0f,0.0f,2.0f,1.0f};//光源位置第42頁,共70頁,2023年,2月20日,星期四啟用光源。沒有啟用GL_LIGHTING是看不見任何光線。記?。褐粚庠催M行設(shè)置、定位、甚至啟用,光源都不會工作。glEnable(GL_LIGHT1);//啟用一號光源第43頁,共70頁,2023年,2月20日,星期四程序完成效果參考程序第44頁,共70頁,2023年,2月20日,星期四試驗8移動圖像把場景沿Y軸旋轉(zhuǎn)。如果旋轉(zhuǎn)90度的話,X軸不再是自左至右的了,他將由里向外穿出屏幕。假想您站在房子中間。再設(shè)想左側(cè)的墻上寫著-x,前面的墻上寫著-z,右面墻上就是+x,身后的墻上則是+z。加入整個房子向右轉(zhuǎn)90度,但您沒有動,那么前面的墻上將是-x而不再是-z了。所有其他的墻也都跟著移動。-z出現(xiàn)在右側(cè),+z出現(xiàn)在左側(cè),+x出現(xiàn)在您背后。glRotatef(star[loop].angle,0.0f,1.0f,0.0f);//旋轉(zhuǎn)至當前所畫星星的角度第45頁,共70頁,2023年,2月20日,星期四沿x軸移動一個正值。通常x軸上的正值代表移向了屏幕的右側(cè),但這里由于繞y軸旋轉(zhuǎn)了坐標系,x軸的正向可以是任意方向。如果我們轉(zhuǎn)180度的話,屏幕的左右側(cè)就鏡像反向了。因此,當我們沿x軸正向移動時,可能向左,向右,向前或向后。

glTranslatef(star[loop].dist,0.0f,0.0f);//沿X軸正向移動第46頁,共70頁,2023年,2月20日,星期四采用逆序來抵消旋轉(zhuǎn)希望星星永遠正面朝著我們,而不管屏幕如何旋轉(zhuǎn)或傾斜。在繪制星星之前,采用逆序來抵消旋轉(zhuǎn)。也就是以當前角度的負值來旋轉(zhuǎn)星星。例如將星星旋轉(zhuǎn)了10度的話,又將其旋轉(zhuǎn)-10度來使星星在那個軸上重新面對屏幕。抵消了沿y軸的旋轉(zhuǎn)。抵消掉沿x軸的屏幕傾斜。需要將屏幕再旋轉(zhuǎn)-tilt傾角。glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);//取消當前星星的角度glRotatef(-tilt,1.0f,0.0f,0.0f);//取消屏幕傾斜第47頁,共70頁,2023年,2月20日,星期四程序運行效果參考程序第48頁,共70頁,2023年,2月20日,星期四試驗93D世界每個3D世界基本上可以看作是sector(區(qū)段)的集合。一個sector(區(qū)段)可以是一個房間、一個立方體、或者任意一個閉合的區(qū)間。typedefstructtagSECTOR//創(chuàng)建Sector區(qū)段結(jié)構(gòu){intnumtriangles;//Sector中的三角形個數(shù)

TRIANGLE*triangle;//指向三角數(shù)組的指針

}SECTOR;//命名為SECTOR第49頁,共70頁,2023年,2月20日,星期四一個sector(區(qū)段)包含了一系列的多邊形,本實驗采用三角形。typedefstructtagTRIANGLE//創(chuàng)建Triangle三角形結(jié)構(gòu)

{VERTEXvertex[3];//VERTEX矢量數(shù)組,大小為3}TRIANGLE;//命名為TRIANGLE第50頁,共70頁,2023年,2月20日,星期四三角形本質(zhì)上是由一些(兩個以上)頂點組成的多邊形,頂點同時也是我們的最基本的分類單位。頂點包含了OpenGL真正感興趣的數(shù)據(jù)。我們用3D空間中的坐標值(x,y,z)以及它們的紋理坐標(u,v)來定義三角形的每個頂點。typedefstructtagVERTEX//創(chuàng)建Vertex頂點結(jié)構(gòu){floatx,y,z;//3D坐標floatu,v;//紋理坐標}VERTEX;//命名為VERTEX第51頁,共70頁,2023年,2月20日,星期四允許用戶在這個世界中游走和遍歷根據(jù)用戶的指令旋轉(zhuǎn)并變換鏡頭位置。圍繞原點,以與鏡頭相反的旋轉(zhuǎn)方向來旋轉(zhuǎn)世界。(讓人產(chǎn)生鏡頭旋轉(zhuǎn)的錯覺)以與鏡頭平移方式相反的方式來平移世界(讓人產(chǎn)生鏡頭移動的錯覺)。第52頁,共70頁,2023年,2月20日,星期四程序?qū)崿F(xiàn)效果參考程序第53頁,共70頁,2023年,2月20日,星期四試驗10飄動的旗幟#include<math.h>//引入數(shù)學(xué)函數(shù)庫中的Sin

旗幟是由由44格×44格的小方格子依次組成。使用points數(shù)組來存放網(wǎng)格各頂點獨立的x,y,z坐標。floatpoints[45][45][3];//Points網(wǎng)格頂點數(shù)組第54頁,共70頁,2023年,2月20日,星期四//沿X平面循環(huán)

for(intx=0;x<45;x++){//沿Y平面循環(huán)

for(inty=0;y<45;y++){//向表面添加波浪效果points[x][y][0]=float((x/5.0f)-4.5f);points[x][y][1]=float((y/5.0f)-4.5f);points[x][y][2]=float(sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f));}}第55頁,共70頁,2023年,2月20日,星期四繪制組成旗幟的44×44個小網(wǎng)格,形成旗幟第一幀glBegin(GL_QUADS);//四邊形繪制開始

for(x=0;x<44;x++)//沿X平面0-44循環(huán)(45點){for(y=0;y<44;y++)//沿Y平面0-44循環(huán)(45點){float_x=float(x)/44.0f;//生成X浮點值float_y=float(y)/44.0f;//生成Y浮點值

float_xb=float(x+1)/44.0f;//X浮點值+0.0227ffloat_yb=float(y+1)/44.0f;//Y浮點值+0.0227fglTexCoord2f(float_x,float_y);//第一個紋理坐標(左下角)glVertex3f(points[x][y][0],points[x][y][1],points[x][y][2]);glTexCoord2f(float_x,float_yb);//第二個紋理坐標(左上角)glVertex3f(points[x][y+1][0],points[x][y+1][1],points[x][y+1][2]);glTexCoord2f(float_xb,float_yb);//第三個紋理坐標(右上角)glVertex3f(points[x+1][y+1][0],points[x+1][y+1][1],points[x+1][y+1][2]);glTexCoord2f(float_xb,float_y);//第四個紋理坐標(右下角)glVertex3f(points[x+1][y][0],points[x+1][y][1],points[x+1][y][2]);}}glEnd();//四邊形繪制結(jié)束第56頁,共70頁,2023年,2月20日,星期四不斷更新繪制小網(wǎng)格。形成旗幟飄動效果//用來降低波浪速度(每隔2幀一次)if(wiggle_count==2){for(y=0;y<45;y++)//沿Y平面循環(huán){

hold=points[0][y][2];//存儲當前左側(cè)波浪值

for(x=0;x<44;x++)//沿X平面循環(huán){//當前波浪值等于其右側(cè)的波浪值points[x][y][2]=points[x+1][y][2]; }points[44][y][2]=hold;//剛才的值成為最左側(cè)的波浪值

}wiggle_count=0;//計數(shù)器清零

}wiggle_count++;//計數(shù)器加一

第57頁,共70頁,2023年,2月20日,星期四程序運行效果參考程序第58頁,共70頁,2023年,2月20日,星期四試驗11二次幾何體//繪制圓柱體glTranslatef(0.0f,0.0f,-1.5f);//繪制圓錐gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32);

(頂面半徑為0的特殊圓柱體)參數(shù)1(1.0F)是圓柱體的底面半徑,參數(shù)2(1.0F)是圓柱體的餓頂面半徑,參數(shù)3(3.0F)是圓柱體的高度。參數(shù)4(32)是緯線(環(huán)繞Z軸有多少細分),參數(shù)5(32)是經(jīng)線(沿著Z軸有多少細分)。細分越多該對象就越細致。我們可以用增加細分的方法來增加對象的多邊形數(shù)。第59頁,共70頁,2023年,2月20日,星期四//繪制圓盤gluDisk(quadratic,0.5f,1.5f,32,32);

參數(shù)1(0.5F)是盤子的內(nèi)圓半徑,該參數(shù)可以為0,則表示在盤子中間沒孔,內(nèi)圓半徑越大孔越大。參數(shù)2(1.5F)表示外圓半徑,這個參數(shù)必須比內(nèi)圓半徑大。參數(shù)3(32)是組成該盤子的切片的數(shù)量,這個數(shù)量可以想象成披薩餅中的切片的數(shù)量。切片越多,外圓邊緣就越平滑。最后一個參數(shù)(32)是組成盤子的環(huán)的數(shù)量。環(huán)很像唱片上的軌跡,一環(huán)套一環(huán)。這些環(huán)從內(nèi)圓半徑細分到外圓半徑。第60頁,共70頁,2023年,2月20日,星期四//繪制球gluSphere(quadratic,1.3f,32,32);

參數(shù)1是球的半徑。如果你無法理解半徑/直徑等等的話,可以理解成物體中心到物體外部的距離,在這里我們使用1.3F作為半徑。接下來兩個參數(shù)就是細分了,和圓柱體一樣,參數(shù)2是緯線,參數(shù)3是經(jīng)線。細分越多球看起來就越平滑第61頁,共70頁,2023年,2月20日,星期四參考程序第62頁,共70頁,2023年,2月20日,星期四試驗12貝塞爾曲面為了做一個貝塞爾曲面,你需要16個控制點,(4*4),和2個變量t,v。你要做的是計算在分量v的沿4條平行曲線的點,再用這4個點計算在分量t的點。計算了足夠的這些點,我們可以用三角帶連接他們,畫出貝塞爾曲面。

第63頁,共70頁,2023年,2月20日,星期四typedefstructpoint_3d{//3D點的結(jié)構(gòu)

doublex,y,z;}POINT_3D;typedefstructbpatch{//貝塞爾面片結(jié)構(gòu)POINT_3Danchors[4][4];//由4x4網(wǎng)格組成GLuintdlBPatch;//繪制面片的顯示列表名稱GLuinttexture;//面片的紋理}BEZIER_PATCH;第64頁,共70頁,2023年,2月20日,星期四//計算貝塞爾方程的值//變量u的范圍在0-1之間

POINT_3DBernstein(floatu,POINT_3D*p){POINT_3Da,b,c,d,r;a=pointTimes(pow(u,3),p[0]);b=pointTimes(3*pow(u,2)*(1-u),p[1]);c=pointTimes(3*u*pow((1-u),2),p[2]);d=pointTimes(pow((1-u),3),p[3]);r=pointAdd(pointAdd(a,b),pointAdd(c,d));returnr;}第65頁,共70頁,2023年,2月20日,星期四//生成貝塞爾曲面的顯示列表

GLuintgenBezier(BEZIER_PATCHpatch,intdivs){intu=0,v;floatpy,px,pyold;GLuintdrawlist=glGenLists(1);//創(chuàng)建顯示列表POINT_3Dtemp[4];POINT_3D*last=(POINT_3D*)malloc(sizeof(POINT_3D)*(divs+1));//更具每一條曲線的細分數(shù),分配相應(yīng)的內(nèi)存if(patch.dlBPatch!=NULL)//如果顯示列表存在則刪除glDeleteLists(patch.dlBPatch,1);temp[0]=patch.anchors[0][3];//獲得u方向的四個控制點temp[1]=patch.anchors[1][3];temp[2]=patch.anchors[2][3];temp[3]=patch.anchors[3][3];第66頁,共70頁,2023年,2月20日,星期四for(v=0;v<=divs;v++){//根據(jù)細分數(shù),創(chuàng)建各個分割點額參數(shù)px=((float)v)/((float)divs);//使用Bernstein函數(shù)求的分割點的坐標last[v]=Bernstein(px,temp);}glNewList(drawlist,GL_COMPILE);//創(chuàng)建一個新的顯示列表glBindTexture(GL_TEXTURE_2D,patch.texture);//邦定紋理for(u=1;u<=divs;u++){py=((float)u)/((float)divs);//計算v方向上的細分點的參數(shù)pyold=((float)u-1.0f)/((float)divs);//上一個v方向上的細分點的參數(shù)temp[0]=Bernstein(py,patch.anchors[0]);//計算每個細分點v方向上貝塞爾曲面

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論