版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第10章 OpenGL,10.1 簡介 10.2 OpenGL基本程序結(jié)構(gòu) 10.3 OpenGL程序設(shè)計入門,10.1 簡介,10.1.1 什么是OpenGL? OpenGL是一個功能強大的開放圖形庫(Open Graphics Library)。其前身是SGI公司為其圖形工作站開發(fā)的IRIS GL。為使其能夠更加容易地移植到不同的硬件和操作系統(tǒng),SGI開發(fā)了OpenGL。 OpenGL被打造為開放性標準,任何軟硬件廠商均可自由使用,這讓它受到廣泛的歡迎,1992年7月,SGI正式發(fā)布OpenGL 1.0標準。OpenGL 1.0完全實現(xiàn)了SGI的預期設(shè)計目標:功能強大、移植性良好并能自由使
2、用。SGI和微軟進行首次合作、聯(lián)手將OpenGL 1.0移植到Windows NT平臺。 1995年,SGI推出了更為完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多,同時還加入了諸如頂點數(shù)組、頂點位置、新紋理等新特性,并增強了元文件對OpenGL的調(diào)用等等。OpenGL 1.1同樣獲得了成功,而它也有對應的Windows NT版本,1992年成立的獨立財團OpenGL Architecture Review Board (ARB)控制。SGI等ARB成員以投票方式產(chǎn)生標準,并制成規(guī)范文檔(Specification)公布,各軟硬件廠商據(jù)此開發(fā)自己系統(tǒng)上的實現(xiàn)。只有
3、通過了ARB規(guī)范全部測試的實現(xiàn)才能稱為OpenGL。1995年12月ARB批準了1.1版本,1999.5通過的1.2.1。2003年的7月,ARB公布OpenGL 1.5規(guī)范這也是迄今為止最新的OpenGL版本,10.1.2 OpenGL的特點 從程序開發(fā)人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述二維和三維幾何物體,并控制這些物體按某種方式繪制到顯示緩沖區(qū)中。OpenGL的API集提供了物體描述、平移、旋轉(zhuǎn)、縮放、光照、紋理、材質(zhì)、像素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發(fā)二、三維圖形程序所需的各個方面。與一般的圖形開發(fā)工具相比
4、,OpenGL具有以下幾個突出特點,1)跨平臺特性 OpenGL與硬件、窗口和操作系統(tǒng)是相互獨立的。為了構(gòu)成一個完整功能的圖形處理系統(tǒng),其設(shè)計實現(xiàn)共分 5 層:圖形硬件、操作系統(tǒng)、窗口系統(tǒng)、 OpenGL和應用軟件。 因而, OpenGL可以集成到各種標準窗口和操作系統(tǒng)中。例如,操作系統(tǒng)包括UNIX,Windows NT, Windows 95/98, DOS等;窗口系統(tǒng)包括X Windows, Microsoft Windows等,2)應用的廣泛性 OpenGL是目前最主要的二、三維交互式圖形應用程序開發(fā)環(huán)境,已成為業(yè)界最受推薦的圖形應用編程接口。自從1992年發(fā)表以來,OpenGL已被廣泛
5、地應用于CAD/CAM、三維動畫、數(shù)字圖像處理以及虛擬現(xiàn)實等領(lǐng)域,Kinetix公司的3D Studio Max就是突出的代表。無論是在PC機上,還是在工作站甚至是大型機和超級計算機上,OpenGL都能表現(xiàn)出它的高性能和強大威力,3)網(wǎng)絡(luò)透明性 建立在客戶/服務器模型上的網(wǎng)絡(luò)透明性是OpenGL的固有特性,它允許一個運行在工作站上的進程在本機或通過網(wǎng)絡(luò)在遠程工作站上顯示圖形。利用這種性質(zhì)能夠均衡各工作站的工作負荷,共同承擔圖形應用任務。 (4)高質(zhì)量和高性能 無論是在CAD/CAM、三維動畫還是可視化仿真等領(lǐng)域,OpenGL高質(zhì)量和高效率的圖形生成能力都能得到充分的體現(xiàn)。在這些領(lǐng)域中,開發(fā)人員
6、可以利用OpenGL制作出效果逼真的二、三維圖像來,5)出色的編程特性 OpenGL在各種平臺上已有多年的應用實踐,加上嚴格的規(guī)范控制,因此OpenGL具有良好的穩(wěn)定性。 OpenGL具有充分的獨立性與易使用性等,10.2 OpenGL基本程序結(jié)構(gòu),Windows 95/98以及Windows NT 3.51 以上的操作系統(tǒng)中提供了OpenGL的動態(tài)庫,在VC+2.0 以上的版本中提供了OpenGL的靜態(tài)庫,所以,使用OpenGL編程,在微機上使用時,最好是在上述軟件環(huán)境中編寫OpenGL程序。 在微機版本中,OpenGL 提供了三個函數(shù)庫,它們是基本庫、實用庫和輔助庫,10.2.1 Wind
7、ows系統(tǒng)下的OpenGL函數(shù),OpenGL的基本庫是OpenGL的核心函數(shù)庫,在這個函數(shù)庫中,提供了115個函數(shù),這些函數(shù)都是以“gl”為前綴。這類API的主要功能包括物體描述、平移、旋轉(zhuǎn)、縮放、光照、紋理、材質(zhì)、像素、位圖、文字處理等。 所有OpenGL 提供的操作都可以使用這些函數(shù)來實現(xiàn),而且,對于不同的軟件和硬件平臺,這些函數(shù)的使用是完全相同的,這個特性注定了OpenGL程序完美的可移植性,OpenGL的實用庫是OpenGL基本庫的一套子程序,它提供了43個函數(shù),這些函數(shù)都是以”glu”為前綴?;镜腛penGL不支持傳統(tǒng)上同圖形標準相關(guān)的一些幾何對象,為了減少一些編程負擔,OpenG
8、L提供了實用庫。主要功能包括繪制二次曲面、NURBS曲線曲面、復雜多邊形以及紋理、矩陣管理等。 實用庫中的所有函數(shù)全都是由OpenGL基本庫函數(shù)來編寫的,所以,在使用上和OpenGL基本庫的使用是完全相同的,而且,用戶也可以使用基本函數(shù)庫來實現(xiàn)實用庫的函數(shù)功能,OpenGL的輔助庫是為了方便用戶用標準C編寫OpenGL程序而編寫的。OpenGL是一個圖形標準,所以,在OpenGL中沒有提供窗口管理和消息事件響應的函數(shù),這樣使用標準C 編寫OpenGL程序是很不方便的,所以提供了輔助庫。它提供了31個函數(shù),這些函數(shù)都是以“aux”為前綴。OpenGL輔助庫提供了一些基本的窗口管理函數(shù)、事件處理函
9、數(shù)和一些簡單模型的制作函數(shù)等,例如,定義窗口的大小、處理鍵盤時間、鼠標擊鍵事件、繪制多面體等等,10.2.2 一個簡單的OpenGL程序,下面將通過一個簡單的OpenGL 程序來說明OpenGL頭文件的使用、語法規(guī)則、程序的基本結(jié)構(gòu)、程序的運行環(huán)境配置。 例10.1 OpenGL 例程 sample.c #include #include #include #include #include void myinit(void); void CALLBACK myReshape(int w, int h); void CALLBACK display(void,void myinit(void)
10、 /初始化 glClearColor(0.0,0.0,0.0,0.0); /將窗口清為黑色 void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT); /將顏色緩存清為glClearColor命令所設(shè)置的顏色,即背景色 glColor4f(0.2,0.8,1.0,1.0); /選顏色(R,G,B) glRotatef(30,1.0,1.0,0.0); /做旋轉(zhuǎn)變換 auxWireCube(1.0); /繪制六面體的虛線圖 glFlush(); /強制繪圖,不駐留緩存,void CALLBACK myReshape (int w, int
11、h) /用于窗口大小改變時的處理,與繪圖無關(guān) glViewport(0,0,w,h); void main(void) auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗口顯示單緩存和RGB(彩色)模式 auxInitPosition(0,0,200,200); /大小 x=200 y=200 (0,0)是屏幕左上點 auxInitWindow(“openglsample.c”); /初始化窗口,參數(shù)是標題 myinit(); auxReshapeFunc(myReshape); auxMainLoop(display);,1. 頭文件使用,若應用程序使用O
12、penGL核心函數(shù),應包括頭文件 ; 使用GLU庫函數(shù),應包括頭文件 ; 使用AUX庫函數(shù),應包括頭文件 ; 使用WGL和Win32應包括頭文件,2. 回調(diào)(CALLBACK)函數(shù) CALLBACK函數(shù)是一些用來讓系統(tǒng)調(diào)用的函數(shù),系統(tǒng)調(diào)用它們來實現(xiàn)顯示、接受輸入事件功能,3. 語法規(guī)則,OpenGL基本庫的所有操作函數(shù)都是以“gl”為前綴的。實用庫的所有操作函數(shù)都是以“glu”為前綴。輔助庫的所有操作函數(shù)都是以“aux”為前綴的。OpenGL命令帶有后綴。 以sample.c中的glColor4f為例,前綴“gl”指這個函數(shù)是OpenGL的核心庫函數(shù),組成命令的單詞首字母大寫,如“Color”
13、;后綴“4”表示顏色值是由4個變量來表示的;“f ”表示所表示顏色的每個分量的類型為32位浮點數(shù)。 OpenGL核心庫函數(shù)常量是以“GL_”開頭,均用大寫字母,并用下劃線將每個關(guān)鍵詞分開,如GL_COLOR_BUFFER_BIT,4. 程序的基本結(jié)構(gòu) 一個OpenGL程序的基本結(jié)構(gòu)是很簡單的,無論多么復雜的OpenGL程序,可以大致分解成以下部分: (1)定義窗口 Windows 系統(tǒng)下的OpenGL實現(xiàn)提供了一個輔助函數(shù)庫aux,用于解決開窗口和處理輸入事件等問題。 窗口管理函數(shù): 首先,調(diào)用void auxInitDisplayMode(Glbitfield mask) 函數(shù)定義窗口的特性
14、,如顏色和緩存區(qū)的性質(zhì)。例如: auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗口顯示單緩存和RGB(彩色)模式,其次,調(diào)用void auxInitPosition(Glint x,Glint y, Glint width, Glint height)定義窗口在屏幕上的位置和大小。其中,x,y為窗口左上角的坐標,width,height 分別為窗口的寬和高(像素個數(shù))。默認值為(0,0,100,100)。例如: auxInitPosition(0,0,200,200); /大小 x=200 y=200 (0,0)是屏幕左上點 最后,完成上述兩個函數(shù)調(diào)用后,
15、用函數(shù)void auxInitWindow(Glbyte *titleString)打開窗口。窗口的標題為字符串titleString。窗口把ESC鍵與退出函數(shù)聯(lián)系起來,可以用來關(guān)閉窗口,退出程序。例如: auxInitWindow(“openglsample.c”); /初始化窗口,參數(shù)是標題,處理輸入事件: 當改變窗口尺寸、移動窗口、重新顯示窗口時,由auxReshapeFunc(myReshape)調(diào)用函數(shù)myReshape重新定義窗口屬性。 通常myReshape函數(shù)調(diào)用glViewPort函數(shù),對當前圖形進行裁剪,重新定義投影矩陣等。 OpenGL輔助函數(shù)庫中還包括處理鍵盤和鼠標輸入
16、事件的函數(shù),2)初始化操作 由于OpenGL的繪圖方式是由一系列的狀態(tài)確定的,因而在繪制圖形前需要做一些準備工作,包括清緩存區(qū)(buffer)、定義光照模型、定義紋理映射等基本操作的初始化狀態(tài)、設(shè)置三維視景體、定義視口。 例如: glClearColor(0.0,0.0,0.0,0.0); /將窗口清為黑色 glClear(GL_COLOR_BUFFER_BIT); /將顏色緩存清為glClearColor命令所設(shè)置的顏色,即背景色,3)設(shè)置觀察坐標系下的取景模式和取景框位置及大小 主要利用了三個函數(shù): 函數(shù)void glViewport(GLint x, Glint y, Glsizei w
17、idth, Glsizei height):設(shè)置在屏幕上的視口大小,四個參數(shù)描述屏幕視口四個角上的坐標(以像素表示)。 參數(shù)(x,y)用于指定視口的左下角在窗口坐標系中的位置,參數(shù)width和height分別確定矩形視口的寬和高,均以像素為單位 。 注意:視口的大小和尺寸是在窗口坐標系中進行度量的,默認狀態(tài)下其坐標原點位于窗口的左下角,其尺寸與窗口的大小相同,函數(shù)void glOrtho(left,right,bottom,top,near,far):設(shè)置投影方式為正交投影(平行投影),其取景體積是一個各面均為矩形的六面體,函數(shù)void gluPerspective(fovy,aspect,z
18、Near,zFar):設(shè)置投影方式為透視投影,其取景體積是一個截頭錐體,在這個體積內(nèi)的物體投影到錐的頂點,它通過指定x-z平面內(nèi)的視角大小及寬高比來確定沿視線方向的棱錐,并通過指定遠、近剪切面與視點間的距離來截斷棱錐,得到觀察體,注: 在默認狀態(tài)下投影方式為平行正交投影,4)使用OpenGL的庫函數(shù)構(gòu)造幾何物體對象的數(shù)學描述。包括點線面的位置和拓撲關(guān)系、幾何變換、光照處理等。這是OpenGL程序的主要部分。 在例10.1中,在函數(shù)void CALLBACK display(void)中寫好要繪制的三維圖形,然后,在主程序中調(diào)用auxMainLoop(display)就可讓該圖形一直顯示,5)程
19、序的微機運行環(huán)境配置 軟件與硬件環(huán)境 操作系統(tǒng):Windows 95/98, Windows NT 軟件開發(fā)環(huán)境:Microsoft Visual C+4.0及以上版本 硬件:奔騰級微機,最好配有支持OpenGL硬加速的圖形卡 連接三個靜態(tài)庫 程序中除了包含必需的頭文件如 外,在創(chuàng)建執(zhí)行文件時,在VC環(huán)境設(shè)置中要連接opengl32.lib, glu32.lib和glaux.lib 三個函數(shù)庫。運行已創(chuàng)建的執(zhí)行文件時,在windowssystem目錄下要有opengl32.dll,glu32.dll兩個動態(tài)連接庫,10.3 OpenGL程序設(shè)計入門,OpenGL的狀態(tài)機制 OpenGL中的圖元
20、繪制 坐標變換及其OpenGL實現(xiàn) 應用變換的一個實例 光照處理,10.3.1 OpenGL的狀態(tài)機制 OpenGL的繪圖方式是由一系列的狀態(tài)決定的,如果設(shè)置了一種狀態(tài)或模式而不改變它,OpenGL在繪圖過程中將一直保持這種狀態(tài)或模式。 例如,當前繪圖顏色就是OpenGL 的一個狀態(tài),當選定顏色后,OpenGL就用這個顏色繪圖。在例10.1中,以下語句 void myinit(void) glClearColor(0.0,0.0,0.0,0.0); 中的函數(shù)glClearColor(0.0,0.0,0.0,0.0)將視口背景色清為黑色,如果不改變這種狀態(tài),視口背景色將一直保持為黑色,再如: g
21、lColor3f(1.0,0.0,0.0); /設(shè)置當前顏色為紅色 glColor3f(0.0,0.0,1.0); /設(shè)置當前顏色為藍色 glRectf(0.5,0.5,0.7,0.7); /繪制一個矩形 glColor3f(0.0,1.0,0.0); /設(shè)置當前顏色為綠色 glRectf(0.8,0.8,0.9,0.9); glRectf(0.2,0.2,0.4,0.4); 執(zhí)行結(jié)果是:一個藍色的矩形和兩個綠色的矩形,10.3.2 OpenGL中的圖元繪制,任何復雜的圖形都是由基本的圖元點、線和多邊形組成的。 程序格式如下: 要繪制某個幾何對象,首先必須指明究竟是哪種類型的幾何對象(例如點、
22、線和多邊形),否則系統(tǒng)在執(zhí)行繪圖操作時無法判斷究竟是畫什么。OpenGL提供了一對用于指定頂點序列操作的函數(shù),確定基本幾何對象的類型。 glBegin(); /描述一組頂點,用于建構(gòu)某種幾何對象 glEnd(,1. 點的繪制 OpenGL中點定義為一個方塊,在默認狀態(tài)下,點是屏幕上的一個像素。在OpenGL中,一個點是當作一個 n(2,3,4)維向量來處理的。 OpenGL 中的點是三維的,如果用戶設(shè)定二維坐標(x,y),則OpenGL在實際計算時處理的點為(x,y,0);對于由四維齊次坐標定義的頂點(x,y,z,w), 在w非零時,齊次頂點(x,y,z,w)對應于三維坐標中的點(x/w,y/
23、w,z/w);若w =0.0,則對應于無窮遠處的點。 glVertex 2,3,4dfisv(TYPE coords,例如: glVertex2i(0,1); glVertex3d(-1.0,1.0,3.1425926); glVertex4d(40,-15.9, 0,2); Glfloat v3=-1.2f,3.4f,5.6f; glVertex3fv(v); 以下操作的結(jié)果是在屏幕上繪制三個點 : glBegin(GL_POINTS) glVertex3f(1.0,0.0,0.0); glVertex3f(1.0,1.0,0.0); glVertex3f(0.0,1.0,1.0); glE
24、nd(,2. 線的繪制 與數(shù)學意義上兩端無限延伸的直線不同,OpenGL的線是數(shù)學定義中的線段,用成對的端點來描述。如: glBegin(GL_LINES) glVertex2f(0.0,0.0); glVertex2f(1.0,1.0); glEnd(); 上述操作描述了一條由坐標原點到點(1.0,1.0)的線段,3. 多邊形的繪制 多邊形指封閉線段圍成的區(qū)域。但OpenGL中可以描述的多邊形有兩點限制:多邊形的邊除了多邊形的頂點外不允許相交,即確保多邊形為簡單多邊形;多邊形為凸多邊形,即任給多邊形的兩個內(nèi)部點,其連線完全在多邊形內(nèi)。 多邊形的描述方式如下: glBegin(GL_POLYG
25、ON); glVertex*(v0); glVertex*(v1); . glVertex*(vn); glEnd(); 其中,*表示glVertex函數(shù)的上述任一種組合形式,由多邊形頂點v0,v1,vn的表示形式而定。 注意:多邊形頂點應按一定順序排列(如逆時針,4. 矩形的繪制 由于矩形在幾何體構(gòu)造中出現(xiàn)得比較頻繁,所以O(shè)penGL提供了專門的矩形函數(shù): void glRectdfis(TYPE x1, TYPE y1, TYPE x2, TYPE y2); void glRectdfisv (TYPE *v1, TYPE *v2); 矩陣的左上、右下角點坐標分別為(x1,y1)和(x2,
26、y2),或者用數(shù)組指針v1、v2表示。用上述函數(shù)描述的矩形位于z=0平面內(nèi),并且各邊分別平行于x、y軸。但注意:經(jīng)過坐標變換之后,這些特性可能改變,例10.2 基本的圖元繪制程序 為簡單起見,我們僅改變例10.1中的繪制函數(shù)void CALLBACK display(void)如下: void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT); /將顏色緩存清為glClearColor命令所設(shè)置的顏色,即背景色 glColor4f(1.0,1.0,1.0,1.0); /選顏色(R,G,B) glPointSize(6.0); /設(shè)置點的大小
27、 glBegin(GL_POINTS); /在屏幕上繪制三個點 glVertex3f(0.1,0.2,0.0); glVertex3f(0.2,0.7,0.0); glVertex3f(0.5,0.8,0.0); glEnd(,glBegin(GL_LINES); /在屏幕上繪制一條線段 glVertex2f(0.0,0.4); glVertex2f(-0.3,0.8); glEnd(); glBegin(GL_POLYGON); /在屏幕上繪制一個四邊形 glVertex2f(-0.6,0.0); glVertex2f(-0.4,0.0); glVertex2f(-0.4,0.3); glV
28、ertex2f(-0.6,0.4); glEnd(); glColor3f(1.0,0.0,0.0); /設(shè)置當前顏色為紅色 glColor3f(0.0,0.0,1.0); /設(shè)置當前顏色為藍色 glRectf(0.5,0.5,0.7,0.7); /繪制一個矩形,glColor3f(0.0,1.0,0.0); /設(shè)置當前顏色為綠色 glRectf(0.8,0.8,0.9,0.9); /繪制一個矩形 glRectf(0.2,0.2,0.4,0.4); /繪制一個矩形 glFlush(); /強制繪圖,不駐留緩存 用該函數(shù)替換例10.1中相應的函數(shù)后,運行的結(jié)果如下圖所示,10.3.3 坐標變換及
29、其OpenGL實現(xiàn),在二維平面上創(chuàng)建三維物體的過程: 在三維空間中創(chuàng)建所繪制物體的模型,由計算機經(jīng)過適當?shù)淖儞Q,將三維坐標系中的點轉(zhuǎn)換為屏幕上的相應位置,以得到理想的視覺效果。 OpenGL就是實現(xiàn)將物體的各個頂點通過各種變換矩陣的作用映射到屏幕的過程 。下圖是頂點變換過程。注意: 在模式觀察變換過程中,頂點的法向量也自動地進行變換,在OpenGL編程過程中,程序員必須在頭腦中有整個坐標變換過程的清晰的圖像,才能將所建的場景模型正確地顯示在屏幕上,OpenGL的坐標變換過程類似于用照相機拍攝照片的過程。使用照相機與坐標變換的步驟比較如下: (1)豎起三角架,將照相機對準場景(視圖變換,取景變換
30、,視點變換)。 (2) 將要拍的場景置于所要求的位置上(造型變換)。 (3) 選擇照相機透鏡或調(diào)整焦距(投影變換)。 (4) 確定最終的照片需要多大,例如放大照片(視口變換)。 其中(1)、(2)順序可看成照相館中的照相過程;而在室外攝影時,由于先有景物,再選擇照相機的位置與方向,因此照相順序可看成(2)、(1,OpenGL中的多種變換(幾何變換、投影變換等)是由矩陣的乘積實現(xiàn)的。 OpenGL提供了一系列矩陣操作函數(shù)。 (1) 通用的矩陣操作命令,void glMatrixMode(Glenum mode); 參數(shù)取值:GL_MODELVIEW、GL_PROJECTION或GL_TEXTUR
31、E 。默認的選定矩陣為造型-觀察變換矩陣。 void glLoadIdentity(void); OpenGL中的變換命令都是對當前矩陣(當前矩陣為以后圖形變換所要使用的矩陣)進行操作,因此在選定可修改矩陣后,應首先用上述命令設(shè)置當前操作矩陣為單位矩陣,2)造型-觀察變換,造型-觀察變換過程就是一個將頂點坐標從世界坐標變換到視覺坐標的過程。這里很重要的是對兩個坐標系的認識。 世界坐標系也稱為全局坐標系。它是一個右手坐標系,可以認為該坐標系是固定不變的,在初始態(tài)下,其x軸為沿屏幕水平向右,y軸為沿屏幕垂直向上,z軸則為垂直屏幕面向外指向用戶。 視覺坐標系(即觀察坐標系)也稱為局部坐標系。它是一個
32、左手坐標系,該坐標系是可以活動的。在初始態(tài)下,其原點及x、y軸分別與世界坐標系的原點及x、y軸重合,而z軸則正好相反,即為垂直屏幕面向內(nèi)。 在初始狀態(tài)下,相機在觀察坐標系的原點且指向z軸正向,即為垂直屏幕面向內(nèi),平移變換 void glTanslatefd(TYPE x, TYPE y, TYPE z); 旋轉(zhuǎn)變換 void glRotatefd(TYPE angle, TYPE x, TYPE y, TYPE z); 繞矢量v=(x,y,z)T逆時針方向旋轉(zhuǎn)angle指定的角度。旋轉(zhuǎn)角度的范圍是0360度。當angle=0時,glRotate()不起作用。 縮放變換 void glScale
33、fd( TYPE x, TYPE y, TYPE z,變換的順序: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(N); /* apply transformation N */ glMultMatrixf(M); /* apply transformation M */ glMultMatrixf(L); /* apply transformation L */ glBegin(GL_POINTS); glVertex3f(v); /* draw transformed vertex v */ glEnd(); 在這個
34、過程中,在GL_MODELVIEW狀態(tài)下,相繼引入了I(單位陣),N,M,L矩陣。變換后的頂點為NMLv(頂點取列向量)。因此,頂點的變換為N(M(Lv),即是先作變換L,然后是變換M,最后才是N。這里,頂點v 的實際變換順序正好與指定的順序相反,3)投影變換,在調(diào)用投影變換命令前必須先在程序中加入下述語句: glMatrixMode(GL_PROJECTION); glLoadIdentity(); 這兩條命令一方面指定接下來的變換命令只影響投影矩陣,同時也將當前投影矩陣設(shè)置為單位陣,透視投影 void gluPerspective (Gldouble fovy, Gldouble aspe
35、ct, Gldouble zNear, Gldouble zFar),正交投影 void glOrtho (Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near, Gldouble far),對于二維圖形向二維屏幕的投影,則應使用實用庫中的如下函數(shù): void gluOrtho2D(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top); 前面提到過,用二維頂點命令繪制的二維物體的z坐標均為零,而gluOrtho2D()命令假定場
36、景中的 z 坐標介于-1.0和 1.0 之間,4)視口變換 void glViewport(GLint x, Glint y, Glsizei width, Glsizei height); 窗口和視口是兩個不同的概念 。 注意:應該使視口的長寬比與取景體積的長寬比相等,否則會使圖像變形,10.3.4 應用變換的一個實例,本節(jié)將通過一個簡單的程序進一步闡述OpenGL的基本變換命令及其使用方法。 例10.3 三維空間繪制立方體的程序cube.c #include #include #include #include #include void myinit(void); void CALLBA
37、CK myReshape(int w, int h); void CALLBACK display(void,初始化 void myinit(void) glClearColor(0.0,0.0,0.0,0.0); /將窗口清為黑色 glShadeModel(GL_FLAT); /常量明暗處理方式 void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT); /將顏色緩存清為glClearColor命令所設(shè)置的顏色,即背景色 glColor3f(1.0,1.0,1.0); /選當前顏色(R,G,B)為白色 glLoadIdentity();
38、 /設(shè)置當前矩陣為單位矩陣,glTranslatef(0.0, 0.0, -3.0); /平移變換 glRotatef(45,1.0,1.0,0.0); /旋轉(zhuǎn)變換 glScalef(1.0,2.0,1.0); /縮放變換 auxWireCube(1.0); /繪制立方體 glFlush(); /強制繪圖,不駐留緩存 void CALLBACK myReshape (int w, int h) /用于窗口改變大小時的處理,與繪圖無關(guān) glMatrixMode(GL_PROJECTION); /指明當前矩陣操作是針對投影矩陣進行的 glLoadIdentity(); /設(shè)置當前矩陣為單位矩陣 g
39、luPerspective(70.0, (GLfloat)w/ (GLfloat)h, 1.5, 40.0); / 投影變換 glMatrixMode(GL_MODELVIEW); / 返回視點-模型矩陣 glViewport(0,0,w,h); /定義視口變換,void main(void) auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); /窗口顯示單緩存和RGB(彩色)模式 auxInitPosition(0,0,200,200); /大小 x=200、y=200 , (0,0)是屏幕左上點 auxInitWindow(“Perspective 3-D C
40、ubes”); /初始化窗口,參數(shù)是標題 myinit(); auxReshapeFunc(myReshape); auxMainLoop(display);,10.3.5 光照處理,光照處理是OpenGL中繪制逼真的三維圖形的一個重要步驟。否則,就無法使最終顯示在屏幕上的物體表現(xiàn)出立體感。 在RGBA模式下,如果不啟用光照處理,則頂點的顏色由當前顏色值所確定;啟用光照處理后,則另行計算。 場景中物體的光照計算不僅取決于光源的屬性,而且與材料的特性直接相關(guān)。即光照計算要反映出在場景中使用的光照特性,以及場景中的物體對這種光的反射和吸收特性,1. OpenGL光照的基本概念 OpenGL中將光視
41、為由紅、綠、藍三種成分所組成,光源的特性由所發(fā)出的三種顏色的光的比例來確定。 說明:光源的RGB值代表各種顏色占最大光強的比例,通過調(diào)整各數(shù)值可以使光源呈現(xiàn)出各種不同的顏色。例如:R=G=B=1時得到最強的白光,而R=G=B=0.5時,由于光強減弱,得到灰白光。 OpenGL在光照模擬中將光線分為輻射光、環(huán)境光、漫反射光和鏡面反射光 4 種獨立的成分,輻射光:源自發(fā)光體,并且不受其他光源的影響。 環(huán)境光(泛光):它經(jīng)過環(huán)境的多次散射,已不可能確定其方向,而是好像來自各個方向。它作用于物體的表面時,將沿各個方向均勻反射。 漫反射光:它來自一個方向,但作用于物體表面后將沿各個方向均勻散射。 鏡面反
42、射光:來自一個方向,并沿一特定方向離開。 順便指出,可以在場景中設(shè)置多個獨立的光,通過調(diào)整各光源的參數(shù),得到滿意的光照效果,物體表面的材質(zhì)特性: OpenGL中認為,材料的顏色決定于其對入射光中的紅、綠、藍各成分的反射比例。例如,對于理想的紅色物體來說,它完全反射紅色光,完全吸收綠色光和藍色光。因而,白光照射下物體呈紅色;純綠光照射下物體則呈黑色。 說明:材料的設(shè)置參數(shù)中也包括對R、G、B值的設(shè)定,但與光照的參數(shù)設(shè)置相比,兩者的含義是不同的。對材料來說,上述各值分別對應材料對各種顏色光的反射比例。如上述理想的紅色物體對應的參數(shù)為R=1,G=0,B=0。一般地,如果光源和材料的參數(shù)分別為(Rl,
43、Gl,Bl)和(Rm,Gm,Bm),若不考慮其它影響因素,則觀察到的光線的參數(shù)為(Rl*Rm,Gl*Gm, Bl*Bm,與光線的情況相似,材料也具有輻射色、環(huán)境色、漫反射色和鏡面反射色。 為了模擬場景中的發(fā)光體,可以設(shè)定材料的輻射光特性;而環(huán)境色、漫反射色和鏡面反射色則反映材料對環(huán)境光、漫反射光和鏡面反射光的反射系數(shù)。 材料的泛光與每個入射光源的泛光組分相結(jié)合;漫反射與入射光源的漫反射光組分相結(jié)合;鏡面反射與入射光源的鏡面反射光組分相結(jié)合,2. 光照步驟的處理 以下程序繪制一個有光照的球體: #include #include #include #include void myinit(voi
44、d); void CALLBACK myReshape(int w, int h); void CALLBACK display(void,void myinit(void) /初始化 glClearColor(0.0,0.0,0.0,0.0); /將窗口清為黑色 Glfloat mat_specular=1.0, 1.0, 1.0, 1.0; Glfloat mat_shininess=50.0; Glfloat light_position = 1.0, 1.0,1.0,0.0;/無窮遠光源 glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
45、glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);,void CALLBACK display(void) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /將顏色緩存清為glClearColor命令所設(shè)置的顏色,即背
46、景色 glColor4f(0.2,0.8,1.0,1.0); /選顏色(R,G,B) auxSolidSphere(1.0); glFlush(); /強制繪圖,不駐留緩存,void CALLBACK myReshape (int w, int h) /定義視口變換和投影變換 glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w=h) glOrtho(-1.5, 1.5, -1.5*(GLfoalt)h/(GLfloat)w, 1.5*(GLfoalt)h/(GLfloat)w,-10.0,10.0);
47、 else glOrtho(-1.5*(GLfoalt)h/(GLfloat)w, 1.5*(GLfoalt)h/(GLfloat)w, -1.5, 1.5,-10.0,10.0); glMatrixMode(GL_MODELVIEW); glIdentity();,* Mainp Loop * Open window with initial window size, title bar, * RGBA display mode, and handle input events. */ void main(void) auxInitDisplayMode(AUX_SINGLE|AUX_RGB
48、A|AUX_DEPTH); auxInitPosition(0,0,500,500); auxInitWindow(“Lighting”); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display);,從上面的程序可以看出,對物體光照處理的步驟是: 定義物體各頂點的法向量,由此確定物體與光源的相對方向。OpenGL通過法向量來確定指定頂點從每個光源所得到的受光量,并用于像素點顏色的計算中。 光源的創(chuàng)建、定位和啟用。 由glLight()函數(shù)創(chuàng)建光源,指定光源的位置??蓜?chuàng)建8個。 必須用命令glEnable(GL_LIGHTING)啟用所
49、定義的光源。用glEnable(GL_LIGHTi)打開第i個光源。 選擇光照模型。 光照模型由glModel()函數(shù)進行選擇。OpenGL的光照模型由三部分組成:全景泛光強度、觀察點的位置、對前、后面光照計算的處理,定義場景中物體的材料屬性。 通過函數(shù)glMaterial()指定材料的環(huán)境色、漫反射色、鏡面反射色及其光亮度,3. 光照計算 在RGBA模式下,在光照條件下屏幕上某一像素點的顏色計算公式為 : 頂點顏色=像素點處的材料輻射+經(jīng)頂點處材料環(huán)境光屬性縮放后的全場環(huán)境光+來自各光源經(jīng)衰減處理后的各種成分(環(huán)境光、漫反射光和鏡面反射光,其中emission表示物體發(fā)射光,如果物體本身不是
50、光源,則這一項為0;ambient,diffuse,specular分別表示泛光、漫反射光、鏡面反射光,其中每一項都是物體與光源的組合(相乘);shininess表示物體的光潔度;符號n 表示頂點的法線方向,l 表示視線方向,s 表示入射光方向。 上述計算對R、G、B分量分別進行,計算所得的結(jié)果被調(diào)整到01的范圍之內(nèi),實驗,1。在微機環(huán)境下, 在VC+運行環(huán)境中調(diào)試并運行例10.1,10.2與10.3程序, 以初步了解OpenGL程序的基本結(jié)構(gòu)和編程方法,Direct X,發(fā)展歷史 功能簡介 編程入門,發(fā)展歷史,DirectX是微軟獨自開發(fā)的API。 DirectX的服務范圍涵蓋圖形、輸入/輸
51、出、音頻、顯示、多媒體等等許多領(lǐng)域,組件包括Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等等,發(fā)展歷史,1995年,微軟的第一個APIDirectX 1發(fā)布。它僅提供了對2D圖形和基本音頻功能的支持,主要是為了彌補Windows 95對圖形管理的不足。 1996年,DirectX的第二個版本DirectX 2推出。它引入了Direct3D技術(shù)、DirectX 2采用平滑模擬和RGB模擬兩種方式來加速3D圖像生成;同時,原有的2D部分得到了有效增強、加入了2D動態(tài)效果,并更正了原有的一些bug。整個DirectX的設(shè)計架構(gòu)基本確定,它也是如今的DirectX的雛形。Trident、S3公司開始支持DirectX 2,代表游戲是紅色警報,發(fā)展歷史,同年,DirectX 3發(fā)布,不過它只是DirectX 2的簡單改進而已,對DirectSound和DirectPlay等功能作了些變動,總體來說還屬于功能簡單的DirectX 2技術(shù)體系。nV
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度年度農(nóng)村土地承包經(jīng)營權(quán)流轉(zhuǎn)與農(nóng)村基礎(chǔ)設(shè)施建設(shè)合同
- 二零二五年度船舶租賃合同3篇
- 2025年度農(nóng)業(yè)勞務用工合同模板(含農(nóng)業(yè)病蟲害防治技術(shù))3篇
- 二零二五年度農(nóng)業(yè)耕地租賃與農(nóng)業(yè)金融服務合同3篇
- 二零二五年度食堂員工勞動權(quán)益維護合同2篇
- 2025年度特色房屋無償使用與文化旅游合同3篇
- 二零二五年度農(nóng)村土地承包經(jīng)營權(quán)流轉(zhuǎn)與生態(tài)農(nóng)業(yè)發(fā)展合同
- 二零二五年度大數(shù)據(jù)中心勞務承包合同規(guī)定3篇
- 2025年度兼職會計財務信息處理聘用合同范本2篇
- 2025年度公務車輛非工作時間私人使用合同3篇
- 《金融風險管理》期末復習試題及答案
- DZ/T 0462.4-2023 礦產(chǎn)資源“三率”指標要求 第4部分:銅等12種有色金屬礦產(chǎn)(正式版)
- 熱帶園林樹木學智慧樹知到期末考試答案章節(jié)答案2024年海南大學
- 《無機及分析化學》期末考試試卷附答案
- 2024年藥品集中采購合同范本(二篇)
- 微生物學(魯東大學)智慧樹知到期末考試答案章節(jié)答案2024年魯東大學
- 玻璃制造過程綠色節(jié)能技術(shù)創(chuàng)新
- 廣東省深圳市龍華區(qū)2023-2024學年中考適應性考試物理試題含解析
- MOOC 國際私法-暨南大學 中國大學慕課答案
- 部隊行車安全教育
- 椎管內(nèi)腫瘤切除術(shù)的手術(shù)后護理
評論
0/150
提交評論