版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)圖形學(xué)試驗(yàn)劉賞計(jì)算機(jī)圖形學(xué)試驗(yàn)劉賞OpenGL的基本語法——相關(guān)庫2OpenGL核心庫:glOpenGL實(shí)用程序庫:gluOpenGL編程輔助庫:auxOpenGL實(shí)用程序工具包(OpenGLutilitytoolkit,GLUT):glutWindows專用庫:wglOpenGL的基本語法——相關(guān)庫2OpenGL核心庫:gl2OpenGL的基本語法——命名規(guī)則3OpenGL函數(shù)都遵循一個(gè)命名約定,即采用以下格式:<庫前綴><根命令><可選的參數(shù)個(gè)數(shù)><可選的參數(shù)類型>例如函數(shù)glColor3f(…),gl表示這個(gè)函數(shù)來自庫gl.h,color表示該函數(shù)用于顏色設(shè)定,3f表示這個(gè)函數(shù)采用了三個(gè)浮點(diǎn)數(shù)參數(shù)。OpenGL的基本語法——命名規(guī)則3OpenGL函數(shù)都遵循一3OpenGL的基本語法——數(shù)據(jù)類型4OpenGL數(shù)據(jù)類型內(nèi)部表示法定義為C類型C字面值后綴GLbyte8位整數(shù)signedcharBGLshort16位整數(shù)shortSGLint,GLsizei32位整數(shù)longLGLfloat,GLclampf32位浮點(diǎn)數(shù)floatFGLdouble,GLclampd64位浮點(diǎn)數(shù)doubleDGLubyte,GLboolean8位無符號(hào)整數(shù)unsignedcharUbGLshort16位無符號(hào)整數(shù)unsignedshortUsGLuint,GLenum,GLbitfield32位無符號(hào)整數(shù)unsignedlongUi表2.1OpenGL的數(shù)據(jù)結(jié)構(gòu)OpenGL的基本語法——數(shù)據(jù)類型4OpenGL數(shù)據(jù)類型內(nèi)部4OpenGL程序?qū)嵗^文件包含5利用OpenGL實(shí)現(xiàn)圖形繪制,首先要引入OpenGL核心庫以及其他需要使用的庫的頭文件。GLUT保證了gl.h和glu.h被正確包含。#include<gl/glut.h>#include<windows.h>OpenGL程序?qū)嵗^文件包含5利用OpenGL實(shí)現(xiàn)圖形5OpenGL程序?qū)嵗翱诠芾?初始化(
glutInit)創(chuàng)建窗口(glutCreateWindow)設(shè)定窗口的顯示模式(glutInitDisplayMode)指定窗口的位置和大?。╣lutInitWindowPosition和glutInitWindowSize)指定窗口的顯示內(nèi)容函數(shù)(glutDisplayFunc)運(yùn)行框架(glutMainLoop)OpenGL程序?qū)嵗翱诠芾?初始化(glutInit6OpenGL程序?qū)嵗L制圖形7指定窗口背景色(
glClearColor)顏色管理,使用RGB顏色模型。一種顏色用紅、綠、藍(lán)三種顏色成分混合而成,每種顏色成分使用0.0到1.0之間的任意有效浮點(diǎn)數(shù)來表示顏色值。OpenGL程序?qū)嵗L制圖形7指定窗口背景色(glCl7OpenGL程序?qū)嵗L制圖形8混合色紅色成分(R)綠色成分(G)藍(lán)色成分(B)黑0.00.00.0紅1.00.00.0綠0.01.00.0黃1.01.00.0藍(lán)0.00.01.0紫1.00.01.0青0.01.01.0深灰0.250.250.25淺灰0.750.750.75棕0.600.400.12南瓜橙0.980.6250.12粉紅0.980.040.70紫紅0.600.400.70白1.01.01.0表2.2OpenGL的一些常用混合色OpenGL程序?qū)嵗L制圖形8混合色紅色成分(R)綠色成8OpenGL程序?qū)嵗L制圖形9刷新窗口的緩沖區(qū)(
glClear)設(shè)定投影參數(shù)
glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);繪制圖形
glRectf(50.0f,100.0f,150.0f,50.0f);OpenGL程序?qū)嵗L制圖形9刷新窗口的緩沖區(qū)(glC9試驗(yàn)1:創(chuàng)建一個(gè)OpenGL窗口
打開VC然后創(chuàng)建一個(gè)新工程,創(chuàng)建一個(gè)新的Win32程序(不是console控制臺(tái)程序)試驗(yàn)1:創(chuàng)建一個(gè)OpenGL窗口打開VC然后創(chuàng)建一個(gè)新工程鏈接OpenGL庫文件,Project->Settings,(工程—>設(shè)置)然后單擊LINK標(biāo)簽:增加OpenGL32.libGLu32.lib和GLaux.lib后單擊OK按鈕。
鏈接OpenGL庫文件,Project->Setting代碼的前3行包括了我們使用的每個(gè)庫文件的頭文件。如下所示:
#include<windows.h>//Windows的頭文件#include<glew.h>//包含最新的gl.h,glu.h庫#include<glut.h>//包含OpenGL實(shí)用庫代碼的前3行包括了我們使用的每個(gè)庫文件的頭文件。如下所示:完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)2:繪制簡(jiǎn)單圖形glLoadIdentity(),重置當(dāng)前的模型觀察矩陣,將當(dāng)前點(diǎn)移到了屏幕中心,X坐標(biāo)軸從左至右Y坐標(biāo)軸從下至上,Z坐標(biāo)軸從里至外。OpenGL屏幕中心的坐標(biāo)值是X和Y軸上的0.0f點(diǎn)。試驗(yàn)2:繪制簡(jiǎn)單圖形glLoadIdentity(),重置glTranslatef(x,y,z)沿著X,Y和Z軸移動(dòng)。
glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0glTranslatef(x,y,z)沿著X,Y和glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glVertex3f(-1.0f,-1.0f,0.0f);//左下頂點(diǎn)glVertex3f(1.0f,-1.0f,0.0f);//右下頂點(diǎn)glEnd();//三角形繪制結(jié)束0.0f,1.0f,0.0f-1.0f,-1.0f,0.0f1.0f,-1.0f,0.0fglBegin(GL_TRIANGLES);//繪制三角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.0fglBegin(GL_QUADS);//繪制正方形-1.在在第一實(shí)驗(yàn)的基礎(chǔ)上,在完成程序的DrawGLScene()過程中增加代碼:
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//清除屏幕及深度緩存glLoadIdentity();//重置當(dāng)前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glVertex3f(-1.0f,-1.0f,0.0f);//左下glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();在在第一實(shí)驗(yàn)的基礎(chǔ)上,在完成程序的DrawGLScene(
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é)束畫完三角形后,我們要移到右半部分來畫正方形。否則兩個(gè)圖形會(huì)相互重疊 glTranslatef(3.0f,0.0f,0.0f)完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)3著色glColor3f(r,g,b)。括號(hào)中的三個(gè)參數(shù)依次是紅、綠、藍(lán)三色分量。參數(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)藍(lán)色試驗(yàn)3著色glColor3f(r,g,b)。括號(hào)中的三個(gè)參修改實(shí)驗(yàn)2中,畫三角形的代碼為:glBegin(GL_TRIANGLES);//繪制三角形glColor3f(1.0f,0.0f,0.0f);//設(shè)置當(dāng)前色為紅色
glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glColor3f(0.0f,1.0f,0.0f);//設(shè)置當(dāng)前色為綠色
glVertex3f(-1.0f,-1.0f,0.0f);//左下glColor3f(0.0f,0.0f,1.0f);//設(shè)置當(dāng)前色為藍(lán)色
glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();修改實(shí)驗(yàn)2中,畫三角形的代碼為:修改實(shí)驗(yàn)2中,畫正方形的代碼為:glColor3f(0.5f,0.5f,1.0f);//一次性將當(dāng)前色設(shè)置為藍(lán)色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é)束修改實(shí)驗(yàn)2中,畫正方形的代碼為:完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)4旋轉(zhuǎn)glRotatef(Angle,Xvector,Yvector,Zvector)負(fù)責(zé)讓對(duì)象繞某個(gè)軸旋轉(zhuǎn)。Xvector,Yvector和Zvector三個(gè)參數(shù)則共同決定旋轉(zhuǎn)軸的方向。比如(1,0,0)所描述的矢量經(jīng)過X坐標(biāo)軸的1個(gè)單位處并且方向向右。(-1,0,0)所描述的矢量經(jīng)過X坐標(biāo)軸的1個(gè)單位處,但方向向左。
試驗(yàn)4旋轉(zhuǎn)glRotatef(Angle,Xvector,X軸-您正在使用一臺(tái)臺(tái)鋸。鋸片中心的軸從左至右擺放(就像OpenGL中的X軸)。尖利的鋸齒繞著X軸狂轉(zhuǎn),看起來要么向上轉(zhuǎn),要么向下轉(zhuǎn)。取決于鋸片開始轉(zhuǎn)時(shí)的方向。這與我們?cè)贠penGL中繞著X軸旋轉(zhuǎn)什么的情形是一樣的。Y軸-假設(shè)您正處于一個(gè)巨大的龍卷風(fēng)中心,龍卷風(fēng)的中心從地面指向天空(就像OpenGL中的Y軸)。垃圾和碎片圍著Y軸從左向右或是從右向左狂轉(zhuǎn)不止。這與我們?cè)贠penGL中繞著Y軸旋轉(zhuǎn)什么的情形是一樣的。Z軸-您從正前方看著一臺(tái)風(fēng)扇。風(fēng)扇的中心正好朝著您(就像OpenGL中的Z軸)。風(fēng)扇的葉片繞著Z軸順時(shí)針或逆時(shí)針狂轉(zhuǎn)。這與我們?cè)贠penGL中繞著Z軸旋轉(zhuǎn)什么的情形是一樣的。X軸-您正在使用一臺(tái)臺(tái)鋸。鋸片中心的軸從左至右擺放(就像Op在實(shí)驗(yàn)3中畫三角形的語句前添加
glRotatef(rtri,0.0f,1.0f,0.0f);//繞Y軸旋轉(zhuǎn)三角形在屏幕的左面畫了一個(gè)彩色漸變?nèi)切危⒗@著Y軸從左向右旋轉(zhuǎn)。在實(shí)驗(yàn)3中畫三角形的語句前添加在實(shí)驗(yàn)3中畫正方形的前面加上語句:glRotatef(rquad,1.0f,0.0f,0.0f);//繞X軸旋轉(zhuǎn)四邊形在實(shí)驗(yàn)3中畫正方形的前面加上語句:完成程序,后效果如下:參考程序完成程序,后效果如下:試驗(yàn)5三維圖形給三角形增加一個(gè)左側(cè)面,一個(gè)右側(cè)面,一個(gè)后側(cè)面來生成一個(gè)金字塔(四棱錐)。計(jì)算好坐標(biāo),繪制其它側(cè)面三角形的方法相同。注意所有的面-三角形都是逆時(shí)針次序繪制的試驗(yàn)5三維圖形給三角形增加一個(gè)左側(cè)面,一個(gè)右側(cè)面,一個(gè)后側(cè)給正方形增加左、右、上、下及背面生成一個(gè)立方體。計(jì)算好坐標(biāo),繪制其它側(cè)面正方形的方法相同。所有的四邊形都以逆時(shí)針次序繪制。給正方形增加左、右、上、下及背面生成一個(gè)立方體。在3D空間創(chuàng)建對(duì)象的方法。必須將OpenGL屏幕想象成一張很大的畫紙,后面還帶著許多透明的層。差不多就是個(gè)由大量的點(diǎn)組成的立方體。這些點(diǎn)從左至右、從上至下、從前到后的布滿了這個(gè)立方體。如果您能想象的出在屏幕的深度方向,應(yīng)該在設(shè)計(jì)新3D對(duì)象時(shí)沒有任何問題。在3D空間創(chuàng)建對(duì)象的方法。必須將OpenGL屏幕想象成一張很程序完成的,效果如下:參考程序程序完成的,效果如下:微分的思想:畫圓是由很多個(gè)小的三角形組成glBegin(GL_TRIANGLE_FAN);glVertex3f(0,0,0.0f);for(i=0;i<=360;i+=30){floatp=(float)(i*3.14/180);glVertex3f((float)sin(p),(float)cos(p),0.0f);}glEnd();畫圓柱微分的思想:計(jì)算機(jī)圖形學(xué)試驗(yàn)匯總課件計(jì)算機(jī)圖形學(xué)試驗(yàn)匯總課件試驗(yàn)6紋理映射在第一實(shí)驗(yàn)代碼開始處增加新代碼:#include<stdio.h>試驗(yàn)6紋理映射在第一實(shí)驗(yàn)代碼開始處增加新代碼:#inc在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在ReSizeGLScene()之前,增加了下面這一段代涉及到的函數(shù)glGenTextures(1,&texture[0])告訴OpenGL想生成一個(gè)紋理名字(如果想載入多個(gè)紋理,加大數(shù)字)。涉及到的函數(shù)glGenTextures(1,&texturglBindTexture(GL_TEXTURE_2D,texture[0])告訴OpenGL將紋理名字texture[0]綁定到紋理目標(biāo)上。2D紋理只有高度(在Y軸上)和寬度(在X軸上)。主函數(shù)將紋理名字指派給紋理數(shù)據(jù)。glBindTexture(GL_TEXTURE_2D,tglBindTexture(GL_TEXTURE_2D,texture[所使用紋理對(duì)應(yīng)的數(shù)字])選擇要綁定的紋理。當(dāng)您想改變紋理時(shí),應(yīng)該綁定新的紋理。有一點(diǎn)值得指出的是,您不能在glBegin()和glEnd()之間綁定紋理,必須在glBegin()之前或glEnd()之后綁定。glBindTexture(GL_TEXTURE_2D,tglTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);告訴OpenGL此紋理是一個(gè)2D紋理(GL_TEXTURE_2D)。參數(shù)“0”代表圖像的詳細(xì)程度,通常就由它為零去了。參數(shù)三是數(shù)據(jù)的成分?jǐn)?shù)。因?yàn)閳D像是由紅色數(shù)據(jù),綠色數(shù)據(jù),藍(lán)色數(shù)據(jù)三種組分組成。TextureImage[0]->sizeX是紋理的寬度。如果您知道寬度,您可以在這里填入,但計(jì)算機(jī)可以很容易的為您指出此值。TextureImage[0]->sizey是紋理的高度。參數(shù)零是邊框的值,一般就是“0”。
GL_RGB告訴OpenGL圖像數(shù)據(jù)由紅、綠、藍(lán)三色數(shù)據(jù)組成。
GL_UNSIGNED_BYTE意味著組成圖像的數(shù)據(jù)是無符號(hào)字節(jié)類型的。最后...TextureImage[0]->data告訴OpenGL紋理數(shù)據(jù)的來源。此例中指向存放在TextureImage[0]記錄中的數(shù)據(jù)。glTexImage2D(GL_TEXTURE_2D,0,glTexParameteri()告訴OpenGL在顯示圖像時(shí),當(dāng)它比放大得原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小得比原始得紋理小(GL_TEXTURE_MIN_FILTER)時(shí)OpenGL采用的濾波方式。通常這兩種情況下都采用GL_LINEAR。
glTexParameteri()告訴OpenGL在顯示圖為了將紋理正確的映射到四邊形上,您必須將紋理的右上角映射到四邊形的右上角,紋理的左上角映射到四邊形的左上角,紋理的右下角映射到四邊形的右下角,紋理的左下角映射到四邊形的左下角。如果映射錯(cuò)誤的話,圖像顯示時(shí)可能上下顛倒,側(cè)向一邊或者什么都不是。glTexCoord2f的第一個(gè)參數(shù)是X坐標(biāo)。0.0f是紋理的左側(cè)。0.5f是紋理的中點(diǎn),1.0f是紋理的右側(cè)。glTexCoord2f的第二個(gè)參數(shù)是Y坐標(biāo)。0.0f是紋理的底部。0.5f是紋理的中點(diǎn),1.0f是紋理的頂部。所以紋理的左上坐標(biāo)是X:0.0f,Y:1.0f,四邊形的左上頂點(diǎn)是X:-1.0f,Y:1.0f。其余三點(diǎn)依此類推。測(cè)試glTexCoord2f的X,Y坐標(biāo)參數(shù)。把1.0f改為0.5f將只顯示紋理的左半部分,把0.0f改為0.5f將只顯示紋理的右半部分。為了將紋理正確的映射到四邊形上,您必須將紋理的右上角映射到四intLoadGLTextures()//載入位圖(調(diào)用上面的代碼)并轉(zhuǎn)換成紋理{ intStatus=FALSE;//狀態(tài)指示器
AUX_RGBImageRec*TextureImage[1];//創(chuàng)建紋理的存儲(chǔ)空間
memset(TextureImage,0,sizeof(void*)*1);//將指針設(shè)為NULL//載入位圖,檢查有無錯(cuò)誤,如果位圖沒找到則退出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);//線形濾波
intLoadGLTextures()//載入位if(TextureImage[0])//紋理是否存在{ if(TextureImage[0]->data)//紋理圖像是否存在{ free(TextureImage[0]->data);//釋放紋理圖像占用的內(nèi)存
} free(TextureImage[0]);//釋放圖像結(jié)構(gòu)
}if(TextureImage[0])//紋理是否存在InitGL(GLvoid)改動(dòng)為:intInitGL(GLvoid)//此處開始對(duì)OpenGL進(jìn)行所有設(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);//啟用深度測(cè)試glDepthFunc(GL_LEQUAL);//所作深度測(cè)試的類型glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精細(xì)的透視修正returnTRUE;//初始化OK}InitGL(GLvoid)改動(dòng)為:DrawGLScene()改動(dòng)為:添加語句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);//紋理和四邊形的左上DrawGLScene()改動(dòng)為:程序完成后效果參考程序程序完成后效果試驗(yàn)7光照效果使用兩種不同的光。第一種稱為環(huán)境光。環(huán)境光來自于四面八方。所有場(chǎng)景中的對(duì)象都處于環(huán)境光的照射中。第二種類型的光源叫做漫射光。漫射光由特定的光源產(chǎn)生,并在您的場(chǎng)景中的對(duì)象表面上產(chǎn)生反射。處于漫射光直接照射下的任何對(duì)象表面都變得很亮,而幾乎未被照射到的區(qū)域就顯得要暗一些。這樣在所創(chuàng)建的木板箱的棱邊上就會(huì)產(chǎn)生的很不錯(cuò)的陰影效果。試驗(yàn)7光照效果使用兩種不同的光。創(chuàng)建光源的過程和顏色的創(chuàng)建完全一致。前三個(gè)參數(shù)分別是RGB三色分量,最后一個(gè)是alpha通道參數(shù)。GLfloatLightAmbient[]={0.5f,0.5f,0.5f,1.0f};//環(huán)境光參數(shù),得到的是半亮(0.5f)的白色環(huán)境光。如果沒有環(huán)境光,未被漫射光照到的地方會(huì)變得十分黑暗。創(chuàng)建光源的過程和顏色的創(chuàng)建完全一致。前三個(gè)參數(shù)分別是RGB三GLfloatLightDiffuse[]={1.0f,1.0f,1.0f,1.0f};//漫射光參數(shù)生成最亮的漫射光。所有的參數(shù)值都取成最大值1.0f。它將照在木板箱的前面,看起來挺好。GLfloatLightDiffuse[]={1.0f最后保存光源的位置。前三個(gè)參數(shù)和glTranslate中的一樣。依次分別是XYZ軸上的位移。由于想要光線直接照射在木箱的正面,所以XY軸上的位移都是0.0f。第三個(gè)值是Z軸上的位移。為了保證光線總在木箱的前面,所以我們將光源的位置朝著觀察者挪出屏幕。通常將屏幕也就是顯示器的屏幕玻璃所處的位置稱作Z軸的0.0f點(diǎn)。所以Z軸上的位移最后定為2.0f。假如您能夠看見光源的話,它就浮在您顯示器的前方。GLfloatLightPosition[]={0.0f,0.0f,2.0f,1.0f};//光源位置最后保存光源的位置。前三個(gè)參數(shù)和glTranslate中的一啟用光源。沒有啟用GL_LIGHTING是看不見任何光線。記?。褐粚?duì)光源進(jìn)行設(shè)置、定位、甚至啟用,光源都不會(huì)工作。glEnable(GL_LIGHT1);//啟用一號(hào)光源啟用光源。沒有啟用GL_LIGHTING是看不見任何光線。記程序完成效果參考程序程序完成效果試驗(yàn)8移動(dòng)圖像把場(chǎng)景沿Y軸旋轉(zhuǎn)。如果旋轉(zhuǎn)90度的話,X軸不再是自左至右的了,他將由里向外穿出屏幕。假想您站在房子中間。再設(shè)想左側(cè)的墻上寫著-x,前面的墻上寫著-z,右面墻上就是+x,身后的墻上則是+z。加入整個(gè)房子向右轉(zhuǎn)90度,但您沒有動(dòng),那么前面的墻上將是-x而不再是-z了。所有其他的墻也都跟著移動(dòng)。-z出現(xiàn)在右側(cè),+z出現(xiàn)在左側(cè),+x出現(xiàn)在您背后。glRotatef(star[loop].angle,0.0f,1.0f,0.0f);//旋轉(zhuǎn)至當(dāng)前所畫星星的角度試驗(yàn)8移動(dòng)圖像把場(chǎng)景沿Y軸旋轉(zhuǎn)。如果旋轉(zhuǎn)90度的話,X軸不沿x軸移動(dòng)一個(gè)正值。通常x軸上的正值代表移向了屏幕的右側(cè),但這里由于繞y軸旋轉(zhuǎn)了坐標(biāo)系,x軸的正向可以是任意方向。如果我們轉(zhuǎn)180度的話,屏幕的左右側(cè)就鏡像反向了。因此,當(dāng)我們沿x軸正向移動(dòng)時(shí),可能向左,向右,向前或向后。
glTranslatef(star[loop].dist,0.0f,0.0f);//沿X軸正向移動(dòng)沿x軸移動(dòng)一個(gè)正值。通常x軸上的正值代表移向了屏幕的右側(cè),但采用逆序來抵消旋轉(zhuǎn)希望星星永遠(yuǎn)正面朝著我們,而不管屏幕如何旋轉(zhuǎn)或傾斜。在繪制星星之前,采用逆序來抵消旋轉(zhuǎn)。也就是以當(dāng)前角度的負(fù)值來旋轉(zhuǎn)星星。例如將星星旋轉(zhuǎn)了10度的話,又將其旋轉(zhuǎn)-10度來使星星在那個(gè)軸上重新面對(duì)屏幕。抵消了沿y軸的旋轉(zhuǎn)。抵消掉沿x軸的屏幕傾斜。需要將屏幕再旋轉(zhuǎn)-tilt傾角。glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);//取消當(dāng)前星星的角度glRotatef(-tilt,1.0f,0.0f,0.0f);//取消屏幕傾斜采用逆序來抵消旋轉(zhuǎn)希望星星永遠(yuǎn)正面朝著我們,而不管屏幕如何旋程序運(yùn)行效果參考程序程序運(yùn)行效果試驗(yàn)93D世界每個(gè)3D世界基本上可以看作是sector(區(qū)段)的集合。一個(gè)sector(區(qū)段)可以是一個(gè)房間、一個(gè)立方體、或者任意一個(gè)閉合的區(qū)間。typedefstructtagSECTOR//創(chuàng)建Sector區(qū)段結(jié)構(gòu){intnumtriangles;//Sector中的三角形個(gè)數(shù)
TRIANGLE*triangle;//指向三角數(shù)組的指針
}SECTOR;//命名為SECTOR試驗(yàn)93D世界每個(gè)3D世界基本上可以看作是sector(區(qū)一個(gè)sector(區(qū)段)包含了一系列的多邊形,本實(shí)驗(yàn)采用三角形。typedefstructtagTRIANGLE//創(chuàng)建Triangle三角形結(jié)構(gòu)
{VERTEXvertex[3];//VERTEX矢量數(shù)組,大小為3}TRIANGLE;//命名為TRIANGLE一個(gè)sector(區(qū)段)包含了一系列的多邊形,本實(shí)驗(yàn)采用三角三角形本質(zhì)上是由一些(兩個(gè)以上)頂點(diǎn)組成的多邊形,頂點(diǎn)同時(shí)也是我們的最基本的分類單位。頂點(diǎn)包含了OpenGL真正感興趣的數(shù)據(jù)。我們用3D空間中的坐標(biāo)值(x,y,z)以及它們的紋理坐標(biāo)(u,v)來定義三角形的每個(gè)頂點(diǎn)。typedefstructtagVERTEX//創(chuàng)建Vertex頂點(diǎn)結(jié)構(gòu){floatx,y,z;//3D坐標(biāo)floatu,v;//紋理坐標(biāo)}VERTEX;//命名為VERTEX三角形本質(zhì)上是由一些(兩個(gè)以上)頂點(diǎn)組成的多邊形,頂點(diǎn)同時(shí)也允許用戶在這個(gè)世界中游走和遍歷根據(jù)用戶的指令旋轉(zhuǎn)并變換鏡頭位置。圍繞原點(diǎn),以與鏡頭相反的旋轉(zhuǎn)方向來旋轉(zhuǎn)世界。(讓人產(chǎn)生鏡頭旋轉(zhuǎn)的錯(cuò)覺)以與鏡頭平移方式相反的方式來平移世界(讓人產(chǎn)生鏡頭移動(dòng)的錯(cuò)覺)。允許用戶在這個(gè)世界中游走和遍歷程序?qū)崿F(xiàn)效果參考程序程序?qū)崿F(xiàn)效果試驗(yàn)10飄動(dòng)的旗幟#include<math.h>//引入數(shù)學(xué)函數(shù)庫中的Sin
旗幟是由由44格×44格的小方格子依次組成。使用points數(shù)組來存放網(wǎng)格各頂點(diǎn)獨(dú)立的x,y,z坐標(biāo)。floatpoints[45][45][3];//Points網(wǎng)格頂點(diǎn)數(shù)組試驗(yàn)10飄動(dòng)的旗幟#include<math.h>///沿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));}}//沿X平面循環(huán)繪制組成旗幟的44×44個(gè)小網(wǎng)格,形成旗幟第一幀glBegin(GL_QUADS);//四邊形繪制開始
for(x=0;x<44;x++)//沿X平面0-44循環(huán)(45點(diǎn)){for(y=0;y<44;y++)//沿Y平面0-44循環(huán)(45點(diǎn)){float_x=float(x)/44.0f;//生成X浮點(diǎn)值float_y=float(y)/44.0f;//生成Y浮點(diǎn)值
float_xb=float(x+1)/44.0f;//X浮點(diǎn)值+0.0227ffloat_yb=float(y+1)/44.0f;//Y浮點(diǎn)值+0.0227fglTexCoord2f(float_x,float_y);//第一個(gè)紋理坐標(biāo)(左下角)glVertex3f(points[x][y][0],points[x][y][1],points[x][y][2]);glTexCoord2f(float_x,float_yb);//第二個(gè)紋理坐標(biāo)(左上角)glVertex3f(points[x][y+1][0],points[x][y+1][1],points[x][y+1][2]);glTexCoord2f(float_xb,float_yb);//第三個(gè)紋理坐標(biāo)(右上角)glVertex3f(points[x+1][y+1][0],points[x+1][y+1][1],points[x+1][y+1][2]);glTexCoord2f(float_xb,float_y);//第四個(gè)紋理坐標(biāo)(右下角)glVertex3f(points[x+1][y][0],points[x+1][y][1],points[x+1][y][2]);}}glEnd();//四邊形繪制結(jié)束繪制組成旗幟的44×44個(gè)小網(wǎng)格,形成旗幟第一幀不斷更新繪制小網(wǎng)格。形成旗幟飄動(dòng)效果//用來降低波浪速度(每隔2幀一次)if(wiggle_count==2){for(y=0;y<45;y++)//沿Y平面循環(huán){
hold=points[0][y][2];//存儲(chǔ)當(dāng)前左側(cè)波浪值
for(x=0;x<44;x++)//沿X平面循環(huán){//當(dāng)前波浪值等于其右側(cè)的波浪值points[x][y][2]=points[x+1][y][2]; }points[44][y][2]=hold;//剛才的值成為最左側(cè)的波浪值
}wiggle_count=0;//計(jì)數(shù)器清零
}wiggle_count++;//計(jì)數(shù)器加一
不斷更新繪制小網(wǎng)格。形成旗幟飄動(dòng)效果程序運(yùn)行效果參考程序程序運(yùn)行效果試驗(yàn)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軸有多少細(xì)分),參數(shù)5(32)是經(jīng)線(沿著Z軸有多少細(xì)分)。細(xì)分越多該對(duì)象就越細(xì)致。我們可以用增加細(xì)分的方法來增加對(duì)象的多邊形數(shù)。試驗(yàn)11二次幾何體//繪制圓柱體glTranslate//繪制圓盤gluDisk(quadratic,0.5f,1.5f,32,32);
參數(shù)1(0.5F)是盤子的內(nèi)圓半徑,該參數(shù)可以為0,則表示在盤子中間沒孔,內(nèi)圓半徑越大孔越大。參數(shù)2(1.5F)表示外圓半徑,這個(gè)參數(shù)必須比內(nèi)圓半徑大。參數(shù)3(32)是組成該盤子的切片的數(shù)量,這個(gè)數(shù)量可以想象成披薩餅中的切片的數(shù)量。切片越多,外圓邊緣就越平滑。最后一個(gè)參數(shù)(32)是組成盤子的環(huán)的數(shù)量。環(huán)很像唱片上的軌跡,一環(huán)套一環(huán)。這些環(huán)從內(nèi)圓半徑細(xì)分到外圓半徑。//繪制圓盤gluDisk(quadratic,0.5f,//繪制球gluSphere(quadratic,1.3f,32,32);
參數(shù)1是球的半徑。如果你無法理解半徑/直徑等等的話,可以理解成物體中心到物體外部的距離,在這里我們使用1.3F作為半徑。接下來兩個(gè)參數(shù)就是細(xì)分了,和圓柱體一樣,參數(shù)2是緯線,參數(shù)3是經(jīng)線。細(xì)分越多球看起來就越平滑//繪制球gluSphere(quadratic,1.3參考程序參考程序試驗(yàn)12貝塞爾曲面為了做一個(gè)貝塞爾曲面,你需要16個(gè)控制點(diǎn),(4*4),和2個(gè)變量t,v。你要做的是計(jì)算在分量v的沿4條平行曲線的點(diǎn),再用這4個(gè)點(diǎn)計(jì)算在分量t的點(diǎn)。計(jì)算了足夠的這些點(diǎn),我們可以用三角帶連接他們,畫出貝塞爾曲面。
試驗(yàn)12貝塞爾曲面為了做一個(gè)貝塞爾曲面,你需要16個(gè)控制點(diǎn)typedefstructpoint_3d{//3D點(diǎn)的結(jié)構(gòu)
doublex,y,z;}POINT_3D;typedefstructbpatch{//貝塞爾面片結(jié)構(gòu)POINT_3Danchors[4][4];//由4x4網(wǎng)格組成GLuintdlBPatch;//繪制面片的顯示列表名稱GLuinttexture;//面片的紋理}BEZIER_PATCH;typedefstructpoint_3d{//計(jì)算貝塞爾方程的值//變量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;}//計(jì)算貝塞爾方程的值//生成貝塞爾曲面的顯示列表
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));//更具每一條曲線的細(xì)分?jǐn)?shù),分配相應(yīng)的內(nèi)存
if(patch.dlBPatch!=NULL)//如果顯示列表存在則刪除
glDeleteLists(patch.dlBPatch,1);temp[0]=patch.anchors[0][3];//獲得u方向的四個(gè)控制點(diǎn)
temp[1]=patch.anchors[1][3];temp[2]=patch.anchors[2][3];temp[3]=patch.anchors[3][3];//生成貝塞爾曲面的顯示列表for(v=0;v<=divs;v++){//根據(jù)細(xì)分?jǐn)?shù),創(chuàng)建各個(gè)分割點(diǎn)額參數(shù)
px=((float)v)/((float)divs);//使用Bernstein函數(shù)求的分割點(diǎn)的坐標(biāo)last[v]=Bernstein(px,temp);}glNewList(drawlist,GL_COMPILE);//創(chuàng)建一個(gè)新的顯示列表glBindTexture(GL_TEXTURE_2D,patch.texture);//邦定紋理
for(u=1;u<=divs;u++){py=((float)u)/((float)divs);//計(jì)算v方向上的細(xì)分點(diǎn)的參數(shù)pyold=((float)u-1.0f)/((float)divs);//上一個(gè)v方向上的細(xì)分點(diǎn)的參數(shù)temp[0]=Bernstein(py,patch.anchors[0]);//計(jì)算每個(gè)細(xì)分點(diǎn)v方向上貝塞爾曲面的控制點(diǎn)
temp[1]=Bernstein(py,patch.anchors[1]);temp[2]=Bernstein(py,patch.anchors[2]);temp[3]=Bernstein(py,patch.anchors[3]);glBegin(GL_TRIANGLE_STRIP);//開始繪制三角形帶
for(v=0;v<=divs;v++){//根據(jù)細(xì)for(v=0;v<=divs;v++){px=((float)v)/((float)divs);//沿著u軸方向順序繪制glTexCoord2f(pyold,px);//設(shè)置紋理坐標(biāo)glVertex3d(last[v].x,last[v].y,last[v].z);//繪制一個(gè)頂點(diǎn)
last[v]=Bernstein(px,temp);//創(chuàng)建下一個(gè)頂點(diǎn)glTexCoord2f(py,px);//設(shè)置紋理
glVertex3d(last[v].x,last[v].y,last[v].z);//繪制新的頂點(diǎn)
}glEnd();//結(jié)束三角形帶的繪制
}glEndList();//顯示列表繪制結(jié)束
free(last);//釋放分配的內(nèi)存returndrawlist;//返回創(chuàng)建的顯示列表
}for(v=0;v<=divs;v++){//設(shè)置貝塞爾曲面的控制點(diǎn)voidinitBezier(void){mybezier.anchors[0][0]=makePoint(-0.75,-0.75,-0.50);//設(shè)置貝塞爾曲面的控制點(diǎn)mybezier.anchors[0][1]=makePoint(-0.25,-0.75,0.00);mybezier.anchors[0][2]=makePoint(0.25,-0.75,0.00);mybezier.anchors[0][3]=makePoint(0.75,-0.75,-0.50);mybezier.anchors[1][0]=makePoint(-0.75,-0.25,-0.75);mybezier.anchors[1][1]=makePoint(-0.25,-0.25,0.50);mybezier.anchors[1][2]=makePoint(0.25,-0.25,0.50);mybezier.anchors[1][3]=makePoint(0.75,-0.25,-0.75);mybezier.anchors[2][0]=makePoint(-0.75,0.25,0.00);mybezier.anchors[2][1]=makePoint(-0.25,0.25,-0.50);mybezier.anchors[2][2]=makePoint(0.25,0.25,-0.50);mybezier.anchors[2][3]=makePoint(0.75,0.25,0.00);mybezier.anchors[3][0]=makePoint(-0.75,0.75,-0.50);mybezier.anchors[3][1]=makePoint(-0.25,0.75,-1.00);mybezier.anchors[3][2]=makePoint(0.25,0.75,-1.00);mybezier.anchors[3][3]=makePoint(0.75,0.75,-0.50);mybezier.dlBPatch=NULL;//默認(rèn)的顯示列表為0}//設(shè)置貝塞爾曲面的控制點(diǎn)程序效果參考程序程序效果計(jì)算機(jī)圖形學(xué)試驗(yàn)劉賞計(jì)算機(jī)圖形學(xué)試驗(yàn)劉賞OpenGL的基本語法——相關(guān)庫83OpenGL核心庫:glOpenGL實(shí)用程序庫:gluOpenGL編程輔助庫:auxOpenGL實(shí)用程序工具包(OpenGLutilitytoolkit,GLUT):glutWindows專用庫:wglOpenGL的基本語法——相關(guān)庫2OpenGL核心庫:gl83OpenGL的基本語法——命名規(guī)則84OpenGL函數(shù)都遵循一個(gè)命名約定,即采用以下格式:<庫前綴><根命令><可選的參數(shù)個(gè)數(shù)><可選的參數(shù)類型>例如函數(shù)glColor3f(…),gl表示這個(gè)函數(shù)來自庫gl.h,color表示該函數(shù)用于顏色設(shè)定,3f表示這個(gè)函數(shù)采用了三個(gè)浮點(diǎn)數(shù)參數(shù)。OpenGL的基本語法——命名規(guī)則3OpenGL函數(shù)都遵循一84OpenGL的基本語法——數(shù)據(jù)類型85OpenGL數(shù)據(jù)類型內(nèi)部表示法定義為C類型C字面值后綴GLbyte8位整數(shù)signedcharBGLshort16位整數(shù)shortSGLint,GLsizei32位整數(shù)longLGLfloat,GLclampf32位浮點(diǎn)數(shù)floatFGLdouble,GLclampd64位浮點(diǎn)數(shù)doubleDGLubyte,GLboolean8位無符號(hào)整數(shù)unsignedcharUbGLshort16位無符號(hào)整數(shù)unsignedshortUsGLuint,GLenum,GLbitfield32位無符號(hào)整數(shù)unsignedlongUi表2.1OpenGL的數(shù)據(jù)結(jié)構(gòu)OpenGL的基本語法——數(shù)據(jù)類型4OpenGL數(shù)據(jù)類型內(nèi)部85OpenGL程序?qū)嵗^文件包含86利用OpenGL實(shí)現(xiàn)圖形繪制,首先要引入OpenGL核心庫以及其他需要使用的庫的頭文件。GLUT保證了gl.h和glu.h被正確包含。#include<gl/glut.h>#include<windows.h>OpenGL程序?qū)嵗^文件包含5利用OpenGL實(shí)現(xiàn)圖形86OpenGL程序?qū)嵗翱诠芾?7初始化(
glutInit)創(chuàng)建窗口(glutCreateWindow)設(shè)定窗口的顯示模式(glutInitDisplayMode)指定窗口的位置和大?。╣lutInitWindowPosition和glutInitWindowSize)指定窗口的顯示內(nèi)容函數(shù)(glutDisplayFunc)運(yùn)行框架(glutMainLoop)OpenGL程序?qū)嵗翱诠芾?初始化(glutInit87OpenGL程序?qū)嵗L制圖形88指定窗口背景色(
glClearColor)顏色管理,使用RGB顏色模型。一種顏色用紅、綠、藍(lán)三種顏色成分混合而成,每種顏色成分使用0.0到1.0之間的任意有效浮點(diǎn)數(shù)來表示顏色值。OpenGL程序?qū)嵗L制圖形7指定窗口背景色(glCl88OpenGL程序?qū)嵗L制圖形89混合色紅色成分(R)綠色成分(G)藍(lán)色成分(B)黑0.00.00.0紅1.00.00.0綠0.01.00.0黃1.01.00.0藍(lán)0.00.01.0紫1.00.01.0青0.01.01.0深灰0.250.250.25淺灰0.750.750.75棕0.600.400.12南瓜橙0.980.6250.12粉紅0.980.040.70紫紅0.600.400.70白1.01.01.0表2.2OpenGL的一些常用混合色OpenGL程序?qū)嵗L制圖形8混合色紅色成分(R)綠色成89OpenGL程序?qū)嵗L制圖形90刷新窗口的緩沖區(qū)(
glClear)設(shè)定投影參數(shù)
glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);繪制圖形
glRectf(50.0f,100.0f,150.0f,50.0f);OpenGL程序?qū)嵗L制圖形9刷新窗口的緩沖區(qū)(glC90試驗(yàn)1:創(chuàng)建一個(gè)OpenGL窗口
打開VC然后創(chuàng)建一個(gè)新工程,創(chuàng)建一個(gè)新的Win32程序(不是console控制臺(tái)程序)試驗(yàn)1:創(chuàng)建一個(gè)OpenGL窗口打開VC然后創(chuàng)建一個(gè)新工程鏈接OpenGL庫文件,Project->Settings,(工程—>設(shè)置)然后單擊LINK標(biāo)簽:增加OpenGL32.libGLu32.lib和GLaux.lib后單擊OK按鈕。
鏈接OpenGL庫文件,Project->Setting代碼的前3行包括了我們使用的每個(gè)庫文件的頭文件。如下所示:
#include<windows.h>//Windows的頭文件#include<glew.h>//包含最新的gl.h,glu.h庫#include<glut.h>//包含OpenGL實(shí)用庫代碼的前3行包括了我們使用的每個(gè)庫文件的頭文件。如下所示:完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)2:繪制簡(jiǎn)單圖形glLoadIdentity(),重置當(dāng)前的模型觀察矩陣,將當(dāng)前點(diǎn)移到了屏幕中心,X坐標(biāo)軸從左至右Y坐標(biāo)軸從下至上,Z坐標(biāo)軸從里至外。OpenGL屏幕中心的坐標(biāo)值是X和Y軸上的0.0f點(diǎn)。試驗(yàn)2:繪制簡(jiǎn)單圖形glLoadIdentity(),重置glTranslatef(x,y,z)沿著X,Y和Z軸移動(dòng)。
glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0glTranslatef(x,y,z)沿著X,Y和glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glVertex3f(-1.0f,-1.0f,0.0f);//左下頂點(diǎn)glVertex3f(1.0f,-1.0f,0.0f);//右下頂點(diǎn)glEnd();//三角形繪制結(jié)束0.0f,1.0f,0.0f-1.0f,-1.0f,0.0f1.0f,-1.0f,0.0fglBegin(GL_TRIANGLES);//繪制三角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.0fglBegin(GL_QUADS);//繪制正方形-1.在在第一實(shí)驗(yàn)的基礎(chǔ)上,在完成程序的DrawGLScene()過程中增加代碼:
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//清除屏幕及深度緩存glLoadIdentity();//重置當(dāng)前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f);//左移1.5單位,并移入屏幕6.0glBegin(GL_TRIANGLES);//繪制三角形glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glVertex3f(-1.0f,-1.0f,0.0f);//左下glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();在在第一實(shí)驗(yàn)的基礎(chǔ)上,在完成程序的DrawGLScene(
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é)束畫完三角形后,我們要移到右半部分來畫正方形。否則兩個(gè)圖形會(huì)相互重疊 glTranslatef(3.0f,0.0f,0.0f)完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)3著色glColor3f(r,g,b)。括號(hào)中的三個(gè)參數(shù)依次是紅、綠、藍(lán)三色分量。參數(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)藍(lán)色試驗(yàn)3著色glColor3f(r,g,b)。括號(hào)中的三個(gè)參修改實(shí)驗(yàn)2中,畫三角形的代碼為:glBegin(GL_TRIANGLES);//繪制三角形glColor3f(1.0f,0.0f,0.0f);//設(shè)置當(dāng)前色為紅色
glVertex3f(0.0f,1.0f,0.0f);//上頂點(diǎn)glColor3f(0.0f,1.0f,0.0f);//設(shè)置當(dāng)前色為綠色
glVertex3f(-1.0f,-1.0f,0.0f);//左下glColor3f(0.0f,0.0f,1.0f);//設(shè)置當(dāng)前色為藍(lán)色
glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();修改實(shí)驗(yàn)2中,畫三角形的代碼為:修改實(shí)驗(yàn)2中,畫正方形的代碼為:glColor3f(0.5f,0.5f,1.0f);//一次性將當(dāng)前色設(shè)置為藍(lán)色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é)束修改實(shí)驗(yàn)2中,畫正方形的代碼為:完成程序的開發(fā)。如下圖所示參考程序完成程序的開發(fā)。如下圖所示試驗(yàn)4旋轉(zhuǎn)glRotatef(Angle,Xvector,Yvector,Zvector)負(fù)責(zé)讓對(duì)象繞某個(gè)軸旋轉(zhuǎn)。Xvector,Yvector和Zvector三個(gè)參數(shù)則共同決定旋轉(zhuǎn)軸的方向。比如(1,0,0)所描述的矢量經(jīng)過X坐標(biāo)軸的1個(gè)單位處并且方向向右。(-1,0,0)所描述的矢量經(jīng)過X坐標(biāo)軸的1個(gè)單位處,但方向向左。
試驗(yàn)4旋轉(zhuǎn)glRotatef(Angle,Xvector,X軸-您正在使用一臺(tái)臺(tái)鋸。鋸片中心的軸從左至右擺放(就像OpenGL中的X軸)。尖利的鋸齒繞著X軸狂轉(zhuǎn),看起來要么向上轉(zhuǎn),要么向下轉(zhuǎn)。取決于鋸片開始轉(zhuǎn)時(shí)的方向。這與我們?cè)贠penGL中繞著X軸旋轉(zhuǎn)什么的情形是一樣的。Y軸-假設(shè)您正處于一個(gè)巨大的龍卷風(fēng)中心,龍卷風(fēng)的中心從地面指向天空(就像OpenGL中的Y軸)。垃圾和碎片圍著Y軸從左向右或是從右向左狂轉(zhuǎn)不止。這與我們?cè)贠penGL中繞著Y軸旋轉(zhuǎn)什么的情形是一樣的。Z軸-您從正前方看著一臺(tái)風(fēng)扇。風(fēng)扇的中心正好朝著您(就像OpenGL中的Z軸)。風(fēng)扇的葉片繞著Z軸順時(shí)針或逆時(shí)針狂轉(zhuǎn)。這與我們?cè)贠penGL中繞著Z軸旋轉(zhuǎn)什么的情形是一樣的。X軸-您正在使用一臺(tái)臺(tái)鋸。鋸片中心的軸從左至右擺放(就像Op在實(shí)驗(yàn)3中畫三角形的語句前添加
glRotatef(rtri,0.0f,1.0f,0.0f);//繞Y軸旋轉(zhuǎn)三角形在屏幕的左面畫了一個(gè)彩色漸變?nèi)切?,并繞著Y軸從左向右旋轉(zhuǎn)。在實(shí)驗(yàn)3中畫三角形的語句前添加在實(shí)驗(yàn)3中畫正方形的前面加上語句:glRotatef(rquad,1.0f,0.0f,0.0f);//繞X軸旋轉(zhuǎn)四邊形在實(shí)驗(yàn)3中畫正方形的前面加上語句:完成程序,后效果如下:參考程序完成程序,后效果如下:試驗(yàn)5三維圖形給三角形增加一個(gè)左側(cè)面,一個(gè)右側(cè)面,一個(gè)后側(cè)面來生成一個(gè)金字塔(四棱錐)。計(jì)算好坐標(biāo),繪制其它側(cè)面三角形的方法相同。注意所有的面-三角形都是逆時(shí)針次序繪制的試驗(yàn)5三維圖形給三角形增加一個(gè)左側(cè)面,一個(gè)右側(cè)面,一個(gè)后側(cè)給正方形增加左、右、上、下及背面生成一個(gè)立方體。計(jì)算好坐標(biāo),繪制其它側(cè)面正方形的方法相同。所有的四邊形都以逆時(shí)針次序繪制。給正方形增加左、右、上、下及背面生成一個(gè)立方體。在3D空間創(chuàng)建對(duì)象的方法。必須將OpenGL屏幕想象成一張很大的畫紙,后面還帶著許多透明的層。差不多就是個(gè)由大量的點(diǎn)組成的立方體。這些點(diǎn)從左至右、從上至下、從前到后的布滿了這個(gè)立方體。如果您能想象的出在屏幕的深度方向,應(yīng)該在設(shè)計(jì)新3D對(duì)象時(shí)沒有任何問題。在3D空間創(chuàng)建對(duì)象的方法。必須將OpenGL屏幕想象成一張很程序完成的,效果如下:參考程序程序完成的,效果如下:微分的思想:畫圓是由很多個(gè)小的三角形組成glBegin(GL_TRIANGLE_FAN);glVertex3f(0,0,0.0f);for(i=0;i<=360;i+=30){floatp=(float)(i*3.14/180);glVertex3f((float)sin(p),(float)cos(p),0.0f);}glEnd();畫圓柱微分的思想:計(jì)算機(jī)圖形學(xué)試驗(yàn)匯總課件計(jì)算機(jī)圖形學(xué)試驗(yàn)匯總課件試驗(yàn)6紋理映射在第一實(shí)驗(yàn)代碼開始處增加新代碼:#include<stdio.h>試驗(yàn)6紋理映射在第一實(shí)驗(yàn)代碼開始處增加新代碼:#inc在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在ReSizeGLScene()之前,增加了下面這一段代涉及到的函數(shù)glGenTextures(1,&texture[0])告訴OpenGL想生成一個(gè)紋理名字(如果想載入多個(gè)紋理,加大數(shù)字)。涉及到的函數(shù)glGenTextures(1,&texturglBindTexture(GL_TEXTURE_2D,texture[0])告訴OpenGL將紋理名字texture[0]綁定到紋理目標(biāo)上。2D紋理只有高度(在Y軸上)和寬度(在X軸上)。主函數(shù)將紋理名字指派給紋理數(shù)據(jù)。glBindTexture(GL_TEXTURE_2D,tglBindTexture(GL_TEXTURE_2D,texture[所使用紋理對(duì)應(yīng)的數(shù)字])選擇要綁定的紋理。當(dāng)您想改變紋理時(shí),應(yīng)該綁定新的紋理。有一點(diǎn)值得指出的是,您不能在glBegin()和glEnd()之間綁定紋理,必須在glBegin()之前或glEnd()之后綁定。glBindTexture(GL_TEXTURE_2D,tglTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);告訴OpenGL此紋理是一個(gè)2D紋理(GL_TEXTURE_2D)。參數(shù)“0”代表圖像的詳細(xì)程度,通常就由它為零去了。參數(shù)三是數(shù)據(jù)的成分?jǐn)?shù)。因?yàn)閳D像是由紅色數(shù)據(jù),綠色數(shù)據(jù),藍(lán)色數(shù)據(jù)三種組分組成。TextureImage[0]->sizeX是紋理的寬度。如果您知道寬
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版苗圃苗木線上線下銷售渠道合作協(xié)議4篇
- 2025年度個(gè)人房產(chǎn)抵押貸款還款協(xié)議書模板4篇
- 2025年度航空航天模具研發(fā)制造合同4篇
- 二零二五版豪華車型購(gòu)車指標(biāo)使用權(quán)租賃協(xié)議3篇
- 2025年物業(yè)廣告位租賃與環(huán)保理念推廣合作協(xié)議3篇
- 2025版企業(yè)內(nèi)部員工技能培訓(xùn)學(xué)員協(xié)議3篇
- 2025年環(huán)保打印機(jī)購(gòu)銷合同綠色環(huán)保版4篇
- 個(gè)人招標(biāo)工作心得:2024年實(shí)踐與思考3篇
- 二零二五年度航空器租賃合同租賃期限與維護(hù)保養(yǎng)責(zé)任4篇
- 2025年農(nóng)業(yè)大棚租賃與智能灌溉系統(tǒng)安裝合同4篇
- 開展課外讀物負(fù)面清單管理的具體實(shí)施舉措方案
- 2025年云南中煙工業(yè)限責(zé)任公司招聘420人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國(guó)洗衣液市場(chǎng)未來發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(解析版)
- 2023年江蘇省南京市中考化學(xué)真題
- 供電副所長(zhǎng)述職報(bào)告
- 校園欺凌問題成因及對(duì)策分析研究論文
- 技術(shù)支持資料投標(biāo)書
- 老年人意外事件與與預(yù)防
- 預(yù)防艾滋病、梅毒和乙肝母嬰傳播轉(zhuǎn)介服務(wù)制度
- 《高速鐵路客運(yùn)安全與應(yīng)急處理》課程標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論