CAD計算機輔助設計技術第10章:OpenGL課件_第1頁
CAD計算機輔助設計技術第10章:OpenGL課件_第2頁
CAD計算機輔助設計技術第10章:OpenGL課件_第3頁
CAD計算機輔助設計技術第10章:OpenGL課件_第4頁
CAD計算機輔助設計技術第10章:OpenGL課件_第5頁
已閱讀5頁,還剩133頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第10章OpenGL10.1簡介10.2OpenGL基本程序結構10.3OpenGL程序設計入門第10章OpenGL10.1簡介110.1簡介10.1.1什么是OpenGL?OpenGL是一個功能強大的開放圖形庫(OpenGraphicsLibrary)。其前身是SGI公司為其圖形工作站開發的IRISGL。為使其能夠更加容易地移植到不同的硬件和操作系統,SGI開發了OpenGL。目前,OpenGL已成為開放的國際圖形標準。10.1簡介10.1.1什么是OpenGL?210.1.2OpenGL的特點從程序開發人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述二維和三維幾何物體,并控制這些物體按某種方式繪制到顯示緩沖區中。OpenGL的API集提供了物體描述、平移、旋轉、縮放、光照、紋理、材質、像素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發二、三維圖形程序所需的各個方面。與一般的圖形開發工具相比,OpenGL具有以下幾個突出特點:10.1.2OpenGL的特點3(1)跨平臺特性

OpenGL與硬件、窗口和操作系統是相互獨立的。為了構成一個完整功能的圖形處理系統,其設計實現共分5層:圖形硬件、操作系統、窗口系統、OpenGL和應用軟件。因而,OpenGL可以集成到各種標準窗口和操作系統中。例如,操作系統包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系統包括XWindows,MicrosoftWindows等。(1)跨平臺特性4(2)應用的廣泛性OpenGL是目前最主要的二、三維交互式圖形應用程序開發環境,已成為業界最受推薦的圖形應用編程接口。自從1992年發表以來,OpenGL已被廣泛地應用于CAD/CAM、三維動畫、數字圖像處理以及虛擬現實等領域,Kinetix公司的3DStudioMax就是突出的代表。無論是在PC機上,還是在工作站甚至是大型機和超級計算機上,OpenGL都能表現出它的高性能和強大威力。(2)應用的廣泛性5(3)網絡透明性建立在客戶/服務器模型上的網絡透明性是OpenGL的固有特性,它允許一個運行在工作站上的進程在本機或通過網絡在遠程工作站上顯示圖形。利用這種性質能夠均衡各工作站的工作負荷,共同承擔圖形應用任務。(4)高質量和高性能無論是在CAD/CAM、三維動畫還是可視化仿真等領域,OpenGL高質量和高效率的圖形生成能力都能得到充分的體現。在這些領域中,開發人員可以利用OpenGL制作出效果逼真的二、三維圖像來。(3)網絡透明性6(5)出色的編程特性

OpenGL在各種平臺上已有多年的應用實踐,加上嚴格的規范控制,因此OpenGL具有良好的穩定性。OpenGL具有充分的獨立性與易使用性等。(5)出色的編程特性710.2OpenGL基本程序結構

Windows95/98以及WindowsNT3.51以上的操作系統中提供了OpenGL的動態庫,在VC++2.0以上的版本中提供了OpenGL的靜態庫,所以,使用OpenGL編程,在微機上使用時,最好是在上述軟件環境中編寫OpenGL程序。

在微機版本中,OpenGL提供了三個函數庫,它們是基本庫、實用庫和輔助庫。

10.2.1Windows系統下的OpenGL函數10.2OpenGL基本程序結構Windows8OpenGL的基本庫是OpenGL的核心函數庫,在這個函數庫中,提供了115個函數,這些函數都是以“gl”為前綴。這類API的主要功能包括物體描述、平移、旋轉、縮放、光照、紋理、材質、像素、位圖、文字處理等。所有OpenGL提供的操作都可以使用這些函數來實現,而且,對于不同的軟件和硬件平臺,這些函數的使用是完全相同的,這個特性注定了OpenGL程序完美的可移植性。OpenGL的基本庫是OpenGL的核心函數庫,在這個函數庫9OpenGL的實用庫是OpenGL基本庫的一套子程序,它提供了43個函數,這些函數都是以”glu”為前綴。基本的OpenGL不支持傳統上同圖形標準相關的一些幾何對象,為了減少一些編程負擔,OpenGL提供了實用庫。主要功能包括繪制二次曲面、NURBS曲線曲面、復雜多邊形以及紋理、矩陣管理等。實用庫中的所有函數全都是由OpenGL基本庫函數來編寫的,所以,在使用上和OpenGL基本庫的使用是完全相同的,而且,用戶也可以使用基本函數庫來實現實用庫的函數功能。OpenGL的實用庫是OpenGL基本庫的一套子程序,它提供10OpenGL的輔助庫是為了方便用戶用標準C編寫OpenGL程序而編寫的。OpenGL是一個圖形標準,所以,在OpenGL中沒有提供窗口管理和消息事件響應的函數,這樣使用標準C編寫OpenGL程序是很不方便的,所以提供了輔助庫。它提供了31個函數,這些函數都是以“aux”為前綴。OpenGL輔助庫提供了一些基本的窗口管理函數、事件處理函數和一些簡單模型的制作函數等,例如,定義窗口的大小、處理鍵盤時間、鼠標擊鍵事件、繪制多面體等等。

OpenGL的輔助庫是為了方便用戶用標準C編寫OpenGL程1110.2.2一個簡單的OpenGL程序下面將通過一個簡單的OpenGL程序來說明OpenGL頭文件的使用、語法規則、程序的基本結構、程序的運行環境配置。例10.1OpenGL例程sample.c#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>#include<stdio.h>

voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);10.2.2一個簡單的OpenGL程序下面將通過一個簡單12voidmyinit(void)//初始化{glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色}voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色glColor4f(0.2,0.8,1.0,1.0);//選顏色(R,G,B)glRotatef(30,1.0,1.0,0.0);//做旋轉變換auxWireCube(1.0);//繪制六面體的虛線圖glFlush();//強制繪圖,不駐留緩存

}voidmyinit(void)//初始化13voidCALLBACKmyReshape(intw,inth)//用于窗口大小改變時的處理,與繪圖無關{glViewport(0,0,w,h);}voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口顯示單緩存和RGB(彩色)模式auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上點auxInitWindow(“openglsample.c”);//初始化窗口,參數是標題myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}voidCALLBACKmyReshape(intw14CAD計算機輔助設計技術第10章:OpenGL課件151.頭文件使用若應用程序使用OpenGL核心函數,應包括頭文件<GL/gl.h>;使用GLU庫函數,應包括頭文件<GL/glu.h>;使用AUX庫函數,應包括頭文件<GL/glaux.h>;使用WGL和Win32應包括頭文件<windows.h>。2.回調(CALLBACK)函數CALLBACK函數是一些用來讓系統調用的函數,系統調用它們來實現顯示、接受輸入事件功能。1.頭文件使用若應用程序使用OpenGL核心函數,應包括163.語法規則OpenGL基本庫的所有操作函數都是以“gl”為前綴的。實用庫的所有操作函數都是以“glu”為前綴。輔助庫的所有操作函數都是以“aux”為前綴的。OpenGL命令帶有后綴。以sample.c中的glColor4f為例,前綴“gl”指這個函數是OpenGL的核心庫函數,組成命令的單詞首字母大寫,如“Color”;后綴“4”表示顏色值是由4個變量來表示的;“f”表示所表示顏色的每個分量的類型為32位浮點數。OpenGL核心庫函數常量是以“GL_”開頭,均用大寫字母,并用下劃線將每個關鍵詞分開,如GL_COLOR_BUFFER_BIT。

3.語法規則OpenGL基本庫的所有操作函數都是以“gl174.程序的基本結構一個OpenGL程序的基本結構是很簡單的,無論多么復雜的OpenGL程序,可以大致分解成以下部分:(1)定義窗口Windows系統下的OpenGL實現提供了一個輔助函數庫aux,用于解決開窗口和處理輸入事件等問題。窗口管理函數:首先,調用voidauxInitDisplayMode(Glbitfieldmask)函數定義窗口的特性,如顏色和緩存區的性質。例如:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口顯示單緩存和RGB(彩色)模式4.程序的基本結構18其次,調用voidauxInitPosition(Glintx,Glinty,Glintwidth,Glintheight)定義窗口在屏幕上的位置和大小。其中,x,y為窗口左上角的坐標,width,height分別為窗口的寬和高(像素個數)。默認值為(0,0,100,100)。例如:auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上點最后,完成上述兩個函數調用后,用函數voidauxInitWindow(Glbyte*titleString)打開窗口。窗口的標題為字符串titleString。窗口把ESC鍵與退出函數聯系起來,可以用來關閉窗口,退出程序。例如:auxInitWindow(“openglsample.c”);//初始化窗口,參數是標題其次,調用voidauxInitPosition(Glin19處理輸入事件:當改變窗口尺寸、移動窗口、重新顯示窗口時,由auxReshapeFunc(myReshape)調用函數myReshape重新定義窗口屬性。通常myReshape函數調用glViewPort函數,對當前圖形進行裁剪,重新定義投影矩陣等。OpenGL輔助函數庫中還包括處理鍵盤和鼠標輸入事件的函數。處理輸入事件:20(2)初始化操作由于OpenGL的繪圖方式是由一系列的狀態確定的,因而在繪制圖形前需要做一些準備工作,包括清緩存區(buffer)、定義光照模型、定義紋理映射等基本操作的初始化狀態、設置三維視景體、定義視口。

例如:glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色(2)初始化操作21(3)設置觀察坐標系下的取景模式和取景框位置及大小主要利用了三個函數:

函數voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight):設置在屏幕上的視口大小,四個參數描述屏幕視口四個角上的坐標(以像素表示)。參數(x,y)用于指定視口的左下角在窗口坐標系中的位置,參數width和height分別確定矩形視口的寬和高,均以像素為單位。注意:視口的大小和尺寸是在窗口坐標系中進行度量的,默認狀態下其坐標原點位于窗口的左下角,其尺寸與窗口的大小相同。

(3)設置觀察坐標系下的取景模式和取景框位置及大小22視點方向觀察體積

函數voidglOrtho(left,right,bottom,top,near,far):設置投影方式為正交投影(平行投影),其取景體積是一個各面均為矩形的六面體。視點方向觀察體積

函數voidglOrtho(left23

函數voidgluPerspective(fovy,aspect,zNear,zFar):設置投影方式為透視投影,其取景體積是一個截頭錐體,在這個體積內的物體投影到錐的頂點。它通過指定x-z平面內的視角大小及寬高比來確定沿視線方向的棱錐,并通過指定遠、近剪切面與視點間的距離來截斷棱錐,得到觀察體。

函數voidgluPerspective(fovy,as24注:在默認狀態下投影方式為平行正交投影。注:在默認狀態下投影方式為平行正交投影。25

(4)使用OpenGL的庫函數構造幾何物體對象的數學描述。包括點線面的位置和拓撲關系、幾何變換、光照處理等。這是OpenGL程序的主要部分。在例10.1中,在函數voidCALLBACKdisplay(void)中寫好要繪制的三維圖形,然后,在主程序中調用auxMainLoop(display)就可讓該圖形一直顯示。

(4)使用OpenGL的庫函數構造幾何物體對象的數學描述。26(5)程序的微機運行環境配置?軟件與硬件環境操作系統:Windows95/98,WindowsNT軟件開發環境:MicrosoftVisualC++4.0及以上版本硬件:奔騰級微機,最好配有支持OpenGL硬加速的圖形卡?連接三個靜態庫程序中除了包含必需的頭文件如<windows.h><GL/gl.h><GL/glaux.h><GL/glu.h>外,在創建執行文件時,在VC環境設置中要連接opengl32.lib,glu32.lib和glaux.lib三個函數庫。運行已創建的執行文件時,在windows\system目錄下要有opengl32.dll,glu32.dll兩個動態連接庫。(5)程序的微機運行環境配置2710.3OpenGL程序設計入門OpenGL的狀態機制OpenGL中的圖元繪制坐標變換及其OpenGL實現應用變換的一個實例光照處理10.3OpenGL程序設計入門OpenGL的狀態機制2810.3.1OpenGL的狀態機制OpenGL的繪圖方式是由一系列的狀態決定的,如果設置了一種狀態或模式而不改變它,OpenGL在繪圖過程中將一直保持這種狀態或模式。

例如,當前繪圖顏色就是OpenGL的一個狀態,當選定顏色后,OpenGL就用這個顏色繪圖。在例10.1中,以下語句voidmyinit(void){glClearColor(0.0,0.0,0.0,0.0);}中的函數glClearColor(0.0,0.0,0.0,0.0)將視口背景色清為黑色,如果不改變這種狀態,視口背景色將一直保持為黑色。

10.3.1OpenGL的狀態機制29再如:glColor3f(1.0,0.0,0.0);//設置當前顏色為紅色glColor3f(0.0,0.0,1.0);//設置當前顏色為藍色glRectf(0.5,0.5,0.7,0.7);//繪制一個矩形glColor3f(0.0,1.0,0.0);//設置當前顏色為綠色glRectf(0.8,0.8,0.9,0.9);glRectf(0.2,0.2,0.4,0.4);執行結果是:一個藍色的矩形和兩個綠色的矩形。

再如:3010.3.2OpenGL中的圖元繪制任何復雜的圖形都是由基本的圖元點、線和多邊形組成的。程序格式如下:要繪制某個幾何對象,首先必須指明究竟是哪種類型的幾何對象(例如點、線和多邊形),否則系統在執行繪圖操作時無法判斷究竟是畫什么。OpenGL提供了一對用于指定頂點序列操作的函數,確定基本幾何對象的類型。glBegin(…);……//描述一組頂點,用于建構某種幾何對象glEnd();

10.3.2OpenGL中的圖元繪制任何復雜的圖形都是311.點的繪制OpenGL中點定義為一個方塊,在默認狀態下,點是屏幕上的一個像素。在OpenGL中,一個點是當作一個n(2,3,4)維向量來處理的。OpenGL中的點是三維的,如果用戶設定二維坐標(x,y),則OpenGL在實際計算時處理的點為(x,y,0);對于由四維齊次坐標定義的頂點(x,y,z,w),在w非零時,齊次頂點(x,y,z,w)對應于三維坐標中的點(x/w,y/w,z/w);若w=0.0,則對應于無窮遠處的點。glVertex{2,3,4}{dfis}{v}(TYPEcoords);

1.點的繪制32例如:glVertex2i(0,1);glVertex3d(-1.0,1.0,3.1425926);glVertex4d(40,-15.9,0,2);Glfloatv[3]={-1.2f,3.4f,5.6f};glVertex3fv(v);以下操作的結果是在屏幕上繪制三個點:glBegin(GL_POINTS)glVertex3f(1.0,0.0,0.0);glVertex3f(1.0,1.0,0.0);glVertex3f(0.0,1.0,1.0);glEnd();

例如:332.線的繪制與數學意義上兩端無限延伸的直線不同,OpenGL的線是數學定義中的線段,用成對的端點來描述。如:glBegin(GL_LINES)glVertex2f(0.0,0.0);glVertex2f(1.0,1.0);glEnd();上述操作描述了一條由坐標原點到點(1.0,1.0)的線段。

2.線的繪制343.多邊形的繪制多邊形指封閉線段圍成的區域。但OpenGL中可以描述的多邊形有兩點限制:多邊形的邊除了多邊形的頂點外不允許相交,即確保多邊形為簡單多邊形;多邊形為凸多邊形,即任給多邊形的兩個內部點,其連線完全在多邊形內。多邊形的描述方式如下:glBegin(GL_POLYGON);glVertex*(v0);glVertex*(v1);……..glVertex*(vn);glEnd();其中,*表示glVertex函數的上述任一種組合形式,由多邊形頂點v0,v1,…,vn的表示形式而定。注意:多邊形頂點應按一定順序排列(如逆時針)。

3.多邊形的繪制354.矩形的繪制由于矩形在幾何體構造中出現得比較頻繁,所以OpenGL提供了專門的矩形函數:voidglRect{dfis}(TYPEx1,TYPEy1,TYPEx2,TYPEy2);voidglRect{dfis}v(TYPE*v1,TYPE*v2);矩陣的左上、右下角點坐標分別為(x1,y1)和(x2,y2),或者用數組指針v1、v2表示。用上述函數描述的矩形位于z=0平面內,并且各邊分別平行于x、y軸。但注意:經過坐標變換之后,這些特性可能改變。

4.矩形的繪制36例10.2基本的圖元繪制程序

為簡單起見,我們僅改變例10.1中的繪制函數voidCALLBACKdisplay(void)如下:voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色

glColor4f(1.0,1.0,1.0,1.0);//選顏色(R,G,B)glPointSize(6.0);//設置點的大小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();例10.2基本的圖元繪制程序37glBegin(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);glVertex2f(-0.6,0.4);glEnd();glColor3f(1.0,0.0,0.0);//設置當前顏色為紅色glColor3f(0.0,0.0,1.0);//設置當前顏色為藍色glRectf(0.5,0.5,0.7,0.7);//繪制一個矩形

glBegin(GL_LINES);//在屏幕上繪制一條38glColor3f(0.0,1.0,0.0);//設置當前顏色為綠色glRectf(0.8,0.8,0.9,0.9);//繪制一個矩形glRectf(0.2,0.2,0.4,0.4);//繪制一個矩形

glFlush();//強制繪圖,不駐留緩存}用該函數替換例10.1中相應的函數后,運行的結果如下圖所示。

glColor3f(0.0,1.0,0.0);//設置3910.3.3坐標變換及其OpenGL實現在二維平面上創建三維物體的過程:在三維空間中創建所繪制物體的模型,由計算機經過適當的變換,將三維坐標系中的點轉換為屏幕上的相應位置,以得到理想的視覺效果。OpenGL就是實現將物體的各個頂點通過各種變換矩陣的作用映射到屏幕的過程。下圖是頂點變換過程。注意:在模式觀察變換過程中,頂點的法向量也自動地進行變換。10.3.3坐標變換及其OpenGL實現在二維平面上創建40在OpenGL編程過程中,程序員必須在頭腦中有整個坐標變換過程的清晰的圖像,才能將所建的場景模型正確地顯示在屏幕上。在OpenGL編程過程中,程序員必須在頭腦中有整個坐標變換過41OpenGL的坐標變換過程類似于用照相機拍攝照片的過程。使用照相機與坐標變換的步驟比較如下:(1)豎起三角架,將照相機對準場景(視圖變換,取景變換,視點變換)。(2)將要拍的場景置于所要求的位置上(造型變換)。(3)選擇照相機透鏡或調整焦距(投影變換)。(4)確定最終的照片需要多大,例如放大照片(視口變換)。其中(1)、(2)順序可看成照相館中的照相過程;而在室外攝影時,由于先有景物,再選擇照相機的位置與方向,因此照相順序可看成(2)、(1)。OpenGL的坐標變換過程類似于用照相機拍攝照片的過程。使用42OpenGL中的多種變換(幾何變換、投影變換等)是由矩陣的乘積實現的。OpenGL提供了一系列矩陣操作函數。(1)通用的矩陣操作命令voidglMatrixMode(Glenummode);參數取值:GL_MODELVIEW、GL_PROJECTION或GL_TEXTURE。默認的選定矩陣為造型-觀察變換矩陣。voidglLoadIdentity(void);OpenGL中的變換命令都是對當前矩陣(當前矩陣為以后圖形變換所要使用的矩陣)進行操作,因此在選定可修改矩陣后,應首先用上述命令設置當前操作矩陣為單位矩陣。

OpenGL中的多種變換(幾何變換、投影變換等)是由矩陣的43(2)造型-觀察變換造型-觀察變換過程就是一個將頂點坐標從世界坐標變換到視覺坐標的過程。這里很重要的是對兩個坐標系的認識。

世界坐標系也稱為全局坐標系。它是一個右手坐標系,可以認為該坐標系是固定不變的,在初始態下,其x軸為沿屏幕水平向右,y軸為沿屏幕垂直向上,z軸則為垂直屏幕面向外指向用戶。

視覺坐標系(即觀察坐標系)也稱為局部坐標系。它是一個左手坐標系,該坐標系是可以活動的。在初始態下,其原點及x、y軸分別與世界坐標系的原點及x、y軸重合,而z軸則正好相反,即為垂直屏幕面向內。在初始狀態下,相機在觀察坐標系的原點且指向z軸正向,即為垂直屏幕面向內。(2)造型-觀察變換造型-觀察變換過程就是一個將頂點坐標44?平移變換voidglTanslate{fd}(TYPEx,TYPEy,TYPEz);?旋轉變換voidglRotate{fd}(TYPEangle,TYPEx,TYPEy,TYPEz);繞矢量v=(x,y,z)T逆時針方向旋轉angle指定的角度。旋轉角度的范圍是0~360度。當angle=0時,glRotate()不起作用。

?縮放變換

voidglScale{fd}(TYPEx,TYPEy,TYPEz);?平移變換45變換的順序:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N);/*applytransformationN*/glMultMatrixf(M);/*applytransformationM*/glMultMatrixf(L);/*applytransformationL*/glBegin(GL_POINTS);glVertex3f(v);/*drawtransformedvertexv*/glEnd();

在這個過程中,在GL_MODELVIEW狀態下,相繼引入了I(單位陣),N,M,L矩陣。變換后的頂點為NMLv(頂點取列向量)。因此,頂點的變換為N(M(Lv)),即是先作變換L,然后是變換M,最后才是N。這里,頂點v的實際變換順序正好與指定的順序相反。變換的順序:46(3)投影變換在調用投影變換命令前必須先在程序中加入下述語句:glMatrixMode(GL_PROJECTION);glLoadIdentity();這兩條命令一方面指定接下來的變換命令只影響投影矩陣,同時也將當前投影矩陣設置為單位陣。

(3)投影變換在調用投影變換命令前必須先在程序中加入下述語句47?透視投影voidgluPerspective(Gldoublefovy,Gldoubleaspect,GldoublezNear,GldoublezFar);?正交投影

voidglOrtho(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);

對于二維圖形向二維屏幕的投影,則應使用實用庫中的如下函數:voidgluOrtho2D(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop);前面提到過,用二維頂點命令繪制的二維物體的z坐標均為零,而gluOrtho2D()命令假定場景中的z坐標介于-1.0和1.0之間。

?透視投影?正交投影對于二維圖形向二維屏幕的投影,48(4)視口變換

voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight);窗口和視口是兩個不同的概念。注意:應該使視口的長寬比與取景體積的長寬比相等,否則會使圖像變形。(4)視口變換4910.3.4應用變換的一個實例本節將通過一個簡單的程序進一步闡述OpenGL的基本變換命令及其使用方法。例10.3三維空間繪制立方體的程序cube.c#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>#include<stdio.h>

voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);10.3.4應用變換的一個實例本節將通過一個簡單的程序進50//初始化voidmyinit(void){glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色}glShadeModel(GL_FLAT);//常量明暗處理方式voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色glColor3f(1.0,1.0,1.0);//選當前顏色(R,G,B)為白色glLoadIdentity();//設置當前矩陣為單位矩陣

//初始化51glTranslatef(0.0,0.0,-3.0);//平移變換glRotatef(45,1.0,1.0,0.0);//旋轉變換glScalef(1.0,2.0,1.0);//縮放變換auxWireCube(1.0);//繪制立方體glFlush();//強制繪圖,不駐留緩存}voidCALLBACKmyReshape(intw,inth)//用于窗口改變大小時的處理,與繪圖無關{glMatrixMode(GL_PROJECTION);//指明當前矩陣操作是針對投影矩陣進行的glLoadIdentity();//設置當前矩陣為單位矩陣gluPerspective(70.0,(GLfloat)w/(GLfloat)h,1.5,40.0);//投影變換glMatrixMode(GL_MODELVIEW);//返回視點-模型矩陣glViewport(0,0,w,h);//定義視口變換}glTranslatef(0.0,0.0,-3.52voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口顯示單緩存和RGB(彩色)模式auxInitPosition(0,0,200,200);//大小x=200、y=200,(0,0)是屏幕左上點auxInitWindow(“Perspective3-DCubes”);//初始化窗口,參數是標題myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}voidmain(void)53CAD計算機輔助設計技術第10章:OpenGL課件5410.3.5光照處理光照處理是OpenGL中繪制逼真的三維圖形的一個重要步驟。否則,就無法使最終顯示在屏幕上的物體表現出立體感。在RGBA模式下,如果不啟用光照處理,則頂點的顏色由當前顏色值所確定;啟用光照處理后,則另行計算。場景中物體的光照計算不僅取決于光源的屬性,而且與材料的特性直接相關。即光照計算要反映出在場景中使用的光照特性,以及場景中的物體對這種光的反射和吸收特性。10.3.5光照處理光照處理是OpenGL中繪制逼真的三551.OpenGL光照的基本概念OpenGL中將光視為由紅、綠、藍三種成分所組成,光源的特性由所發出的三種顏色的光的比例來確定。說明:光源的RGB值代表各種顏色占最大光強的比例,通過調整各數值可以使光源呈現出各種不同的顏色。例如:R=G=B=1時得到最強的白光,而R=G=B=0.5時,由于光強減弱,得到灰白光。OpenGL在光照模擬中將光線分為輻射光、環境光、漫反射光和鏡面反射光4種獨立的成分。1.OpenGL光照的基本概念56輻射光:源自發光體,并且不受其他光源的影響。環境光(泛光):它經過環境的多次散射,已不可能確定其方向,而是好像來自各個方向。它作用于物體的表面時,將沿各個方向均勻反射。漫反射光:它來自一個方向,但作用于物體表面后將沿各個方向均勻散射。鏡面反射光:來自一個方向,并沿一特定方向離開。順便指出,可以在場景中設置多個獨立的光,通過調整各光源的參數,得到滿意的光照效果。輻射光:源自發光體,并且不受其他光源的影響。57物體表面的材質特性:OpenGL中認為,材料的顏色決定于其對入射光中的紅、綠、藍各成分的反射比例。例如,對于理想的紅色物體來說,它完全反射紅色光,完全吸收綠色光和藍色光。因而,白光照射下物體呈紅色;純綠光照射下物體則呈黑色。說明:材料的設置參數中也包括對R、G、B值的設定,但與光照的參數設置相比,兩者的含義是不同的。對材料來說,上述各值分別對應材料對各種顏色光的反射比例。如上述理想的紅色物體對應的參數為R=1,G=0,B=0。一般地,如果光源和材料的參數分別為(Rl,Gl,Bl)和(Rm,Gm,Bm),若不考慮其它影響因素,則觀察到的光線的參數為(Rl*Rm,Gl*Gm,Bl*Bm)。物體表面的材質特性:58與光線的情況相似,材料也具有輻射色、環境色、漫反射色和鏡面反射色。為了模擬場景中的發光體,可以設定材料的輻射光特性;而環境色、漫反射色和鏡面反射色則反映材料對環境光、漫反射光和鏡面反射光的反射系數。材料的泛光與每個入射光源的泛光組分相結合;漫反射與入射光源的漫反射光組分相結合;鏡面反射與入射光源的鏡面反射光組分相結合。與光線的情況相似,材料也具有輻射色、環境色、漫反射色和鏡面反592.光照步驟的處理以下程序繪制一個有光照的球體:#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);2.光照步驟的處理60voidmyinit(void)//初始化{glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色Glfloatmat_specular[]={1.0,1.0,1.0,1.0};Glfloatmat_shininess={50.0};Glfloatlight_position[]={1.0,1.0,1.0,0.0};//無窮遠光源glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);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);}voidmyinit(void)//初始化61voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色glColor4f(0.2,0.8,1.0,1.0);//選顏色(R,G,B)auxSolidSphere(1.0);glFlush();//強制繪圖,不駐留緩存}voidCALLBACKdisplay(void)62voidCALLBACKmyReshape(intw,inth)//定義視口變換和投影變換{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);elseglOrtho(-1.5*(GLfoalt)h/(GLfloat)w,1.5*(GLfoalt)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glIdentity();}voidCALLBACKmyReshape(intw63/*MainpLoop*Openwindowwithinitialwindowsize,titlebar,*RGBAdisplaymode,andhandleinputevents.*/voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA|AUX_DEPTH);auxInitPosition(0,0,500,500);auxInitWindow(“Lighting”);myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}/*MainpLoop64從上面的程序可以看出,對物體光照處理的步驟是:?定義物體各頂點的法向量,由此確定物體與光源的相對方向。OpenGL通過法向量來確定指定頂點從每個光源所得到的受光量,并用于像素點顏色的計算中。?光源的創建、定位和啟用。由glLight()函數創建光源,指定光源的位置。可創建8個。必須用命令glEnable(GL_LIGHTING)啟用所定義的光源。用glEnable(GL_LIGHTi)打開第i個光源。?選擇光照模型。光照模型由glModel()函數進行選擇。OpenGL的光照模型由三部分組成:全景泛光強度、觀察點的位置、對前、后面光照計算的處理。CAD計算機輔助設計技術第10章:OpenGL課件65?定義場景中物體的材料屬性。通過函數glMaterial()指定材料的環境色、漫反射色、鏡面反射色及其光亮度。?定義場景中物體的材料屬性。663.光照計算在RGBA模式下,在光照條件下屏幕上某一像素點的顏色計算公式為:頂點顏色=像素點處的材料輻射+經頂點處材料環境光屬性縮放后的全場環境光+來自各光源經衰減處理后的各種成分(環境光、漫反射光和鏡面反射光)3.光照計算67其中emission表示物體發射光,如果物體本身不是光源,則這一項為0;ambient,diffuse,specular分別表示泛光、漫反射光、鏡面反射光,其中每一項都是物體與光源的組合(相乘);shininess表示物體的光潔度;符號n表示頂點的法線方向,l表示視線方向,s表示入射光方向。上述計算對R、G、B分量分別進行,計算所得的結果被調整到0~1的范圍之內。其中emission表示物體發射光,如果物體本身不是光源,則68思考題在微機環境下,在VC++運行環境中調試并運行例10.1,10.2與10.3程序,以初步了解OpenGL程序的基本結構和編程方法。思考題在微機環境下,在VC++運行環境中調試并運行例10.69第10章OpenGL10.1簡介10.2OpenGL基本程序結構10.3OpenGL程序設計入門第10章OpenGL10.1簡介7010.1簡介10.1.1什么是OpenGL?OpenGL是一個功能強大的開放圖形庫(OpenGraphicsLibrary)。其前身是SGI公司為其圖形工作站開發的IRISGL。為使其能夠更加容易地移植到不同的硬件和操作系統,SGI開發了OpenGL。目前,OpenGL已成為開放的國際圖形標準。10.1簡介10.1.1什么是OpenGL?7110.1.2OpenGL的特點從程序開發人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述二維和三維幾何物體,并控制這些物體按某種方式繪制到顯示緩沖區中。OpenGL的API集提供了物體描述、平移、旋轉、縮放、光照、紋理、材質、像素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發二、三維圖形程序所需的各個方面。與一般的圖形開發工具相比,OpenGL具有以下幾個突出特點:10.1.2OpenGL的特點72(1)跨平臺特性

OpenGL與硬件、窗口和操作系統是相互獨立的。為了構成一個完整功能的圖形處理系統,其設計實現共分5層:圖形硬件、操作系統、窗口系統、OpenGL和應用軟件。因而,OpenGL可以集成到各種標準窗口和操作系統中。例如,操作系統包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系統包括XWindows,MicrosoftWindows等。(1)跨平臺特性73(2)應用的廣泛性OpenGL是目前最主要的二、三維交互式圖形應用程序開發環境,已成為業界最受推薦的圖形應用編程接口。自從1992年發表以來,OpenGL已被廣泛地應用于CAD/CAM、三維動畫、數字圖像處理以及虛擬現實等領域,Kinetix公司的3DStudioMax就是突出的代表。無論是在PC機上,還是在工作站甚至是大型機和超級計算機上,OpenGL都能表現出它的高性能和強大威力。(2)應用的廣泛性74(3)網絡透明性建立在客戶/服務器模型上的網絡透明性是OpenGL的固有特性,它允許一個運行在工作站上的進程在本機或通過網絡在遠程工作站上顯示圖形。利用這種性質能夠均衡各工作站的工作負荷,共同承擔圖形應用任務。(4)高質量和高性能無論是在CAD/CAM、三維動畫還是可視化仿真等領域,OpenGL高質量和高效率的圖形生成能力都能得到充分的體現。在這些領域中,開發人員可以利用OpenGL制作出效果逼真的二、三維圖像來。(3)網絡透明性75(5)出色的編程特性

OpenGL在各種平臺上已有多年的應用實踐,加上嚴格的規范控制,因此OpenGL具有良好的穩定性。OpenGL具有充分的獨立性與易使用性等。(5)出色的編程特性7610.2OpenGL基本程序結構

Windows95/98以及WindowsNT3.51以上的操作系統中提供了OpenGL的動態庫,在VC++2.0以上的版本中提供了OpenGL的靜態庫,所以,使用OpenGL編程,在微機上使用時,最好是在上述軟件環境中編寫OpenGL程序。

在微機版本中,OpenGL提供了三個函數庫,它們是基本庫、實用庫和輔助庫。

10.2.1Windows系統下的OpenGL函數10.2OpenGL基本程序結構Windows77OpenGL的基本庫是OpenGL的核心函數庫,在這個函數庫中,提供了115個函數,這些函數都是以“gl”為前綴。這類API的主要功能包括物體描述、平移、旋轉、縮放、光照、紋理、材質、像素、位圖、文字處理等。所有OpenGL提供的操作都可以使用這些函數來實現,而且,對于不同的軟件和硬件平臺,這些函數的使用是完全相同的,這個特性注定了OpenGL程序完美的可移植性。OpenGL的基本庫是OpenGL的核心函數庫,在這個函數庫78OpenGL的實用庫是OpenGL基本庫的一套子程序,它提供了43個函數,這些函數都是以”glu”為前綴。基本的OpenGL不支持傳統上同圖形標準相關的一些幾何對象,為了減少一些編程負擔,OpenGL提供了實用庫。主要功能包括繪制二次曲面、NURBS曲線曲面、復雜多邊形以及紋理、矩陣管理等。實用庫中的所有函數全都是由OpenGL基本庫函數來編寫的,所以,在使用上和OpenGL基本庫的使用是完全相同的,而且,用戶也可以使用基本函數庫來實現實用庫的函數功能。OpenGL的實用庫是OpenGL基本庫的一套子程序,它提供79OpenGL的輔助庫是為了方便用戶用標準C編寫OpenGL程序而編寫的。OpenGL是一個圖形標準,所以,在OpenGL中沒有提供窗口管理和消息事件響應的函數,這樣使用標準C編寫OpenGL程序是很不方便的,所以提供了輔助庫。它提供了31個函數,這些函數都是以“aux”為前綴。OpenGL輔助庫提供了一些基本的窗口管理函數、事件處理函數和一些簡單模型的制作函數等,例如,定義窗口的大小、處理鍵盤時間、鼠標擊鍵事件、繪制多面體等等。

OpenGL的輔助庫是為了方便用戶用標準C編寫OpenGL程8010.2.2一個簡單的OpenGL程序下面將通過一個簡單的OpenGL程序來說明OpenGL頭文件的使用、語法規則、程序的基本結構、程序的運行環境配置。例10.1OpenGL例程sample.c#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>#include<stdio.h>

voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);10.2.2一個簡單的OpenGL程序下面將通過一個簡單81voidmyinit(void)//初始化{glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色}voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色glColor4f(0.2,0.8,1.0,1.0);//選顏色(R,G,B)glRotatef(30,1.0,1.0,0.0);//做旋轉變換auxWireCube(1.0);//繪制六面體的虛線圖glFlush();//強制繪圖,不駐留緩存

}voidmyinit(void)//初始化82voidCALLBACKmyReshape(intw,inth)//用于窗口大小改變時的處理,與繪圖無關{glViewport(0,0,w,h);}voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口顯示單緩存和RGB(彩色)模式auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上點auxInitWindow(“openglsample.c”);//初始化窗口,參數是標題myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}voidCALLBACKmyReshape(intw83CAD計算機輔助設計技術第10章:OpenGL課件841.頭文件使用若應用程序使用OpenGL核心函數,應包括頭文件<GL/gl.h>;使用GLU庫函數,應包括頭文件<GL/glu.h>;使用AUX庫函數,應包括頭文件<GL/glaux.h>;使用WGL和Win32應包括頭文件<windows.h>。2.回調(CALLBACK)函數CALLBACK函數是一些用來讓系統調用的函數,系統調用它們來實現顯示、接受輸入事件功能。1.頭文件使用若應用程序使用OpenGL核心函數,應包括853.語法規則OpenGL基本庫的所有操作函數都是以“gl”為前綴的。實用庫的所有操作函數都是以“glu”為前綴。輔助庫的所有操作函數都是以“aux”為前綴的。OpenGL命令帶有后綴。以sample.c中的glColor4f為例,前綴“gl”指這個函數是OpenGL的核心庫函數,組成命令的單詞首字母大寫,如“Color”;后綴“4”表示顏色值是由4個變量來表示的;“f”表示所表示顏色的每個分量的類型為32位浮點數。OpenGL核心庫函數常量是以“GL_”開頭,均用大寫字母,并用下劃線將每個關鍵詞分開,如GL_COLOR_BUFFER_BIT。

3.語法規則OpenGL基本庫的所有操作函數都是以“gl864.程序的基本結構一個OpenGL程序的基本結構是很簡單的,無論多么復雜的OpenGL程序,可以大致分解成以下部分:(1)定義窗口Windows系統下的OpenGL實現提供了一個輔助函數庫aux,用于解決開窗口和處理輸入事件等問題。窗口管理函數:首先,調用voidauxInitDisplayMode(Glbitfieldmask)函數定義窗口的特性,如顏色和緩存區的性質。例如:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口顯示單緩存和RGB(彩色)模式4.程序的基本結構87其次,調用voidauxInitPosition(Glintx,Glinty,Glintwidth,Glintheight)定義窗口在屏幕上的位置和大小。其中,x,y為窗口左上角的坐標,width,height分別為窗口的寬和高(像素個數)。默認值為(0,0,100,100)。例如:auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上點最后,完成上述兩個函數調用后,用函數voidauxInitWindow(Glbyte*titleString)打開窗口。窗口的標題為字符串titleString。窗口把ESC鍵與退出函數聯系起來,可以用來關閉窗口,退出程序。例如:auxInitWindow(“openglsample.c”);//初始化窗口,參數是標題其次,調用voidauxInitPosition(Glin88處理輸入事件:當改變窗口尺寸、移動窗口、重新顯示窗口時,由auxReshapeFunc(myReshape)調用函數myReshape重新定義窗口屬性。通常myReshape函數調用glViewPort函數,對當前圖形進行裁剪,重新定義投影矩陣等。OpenGL輔助函數庫中還包括處理鍵盤和鼠標輸入事件的函數。處理輸入事件:89(2)初始化操作由于OpenGL的繪圖方式是由一系列的狀態確定的,因而在繪制圖形前需要做一些準備工作,包括清緩存區(buffer)、定義光照模型、定義紋理映射等基本操作的初始化狀態、設置三維視景體、定義視口。

例如:glClearColor(0.0,0.0,0.0,0.0);//將窗口清為黑色glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色(2)初始化操作90(3)設置觀察坐標系下的取景模式和取景框位置及大小主要利用了三個函數:

函數voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight):設置在屏幕上的視口大小,四個參數描述屏幕視口四個角上的坐標(以像素表示)。參數(x,y)用于指定視口的左下角在窗口坐標系中的位置,參數width和height分別確定矩形視口的寬和高,均以像素為單位。注意:視口的大小和尺寸是在窗口坐標系中進行度量的,默認狀態下其坐標原點位于窗口的左下角,其尺寸與窗口的大小相同。

(3)設置觀察坐標系下的取景模式和取景框位置及大小91視點方向觀察體積

函數voidglOrtho(left,right,bottom,top,near,far):設置投影方式為正交投影(平行投影),其取景體積是一個各面均為矩形的六面體。視點方向觀察體積

函數voidglOrtho(left92

函數voidgluPerspective(fovy,aspect,zNear,zFar):設置投影方式為透視投影,其取景體積是一個截頭錐體,在這個體積內的物體投影到錐的頂點。它通過指定x-z平面內的視角大小及寬高比來確定沿視線方向的棱錐,并通過指定遠、近剪切面與視點間的距離來截斷棱錐,得到觀察體。

函數voidgluPerspective(fovy,as93注:在默認狀態下投影方式為平行正交投影。注:在默認狀態下投影方式為平行正交投影。94

(4)使用OpenGL的庫函數構造幾何物體對象的數學描述。包括點線面的位置和拓撲關系、幾何變換、光照處理等。這是OpenGL程序的主要部分。在例10.1中,在函數voidCALLBACKdisplay(void)中寫好要繪制的三維圖形,然后,在主程序中調用auxMainLoop(display)就可讓該圖形一直顯示。

(4)使用OpenGL的庫函數構造幾何物體對象的數學描述。95(5)程序的微機運行環境配置?軟件與硬件環境操作系統:Windows95/98,WindowsNT軟件開發環境:MicrosoftVisualC++4.0及以上版本硬件:奔騰級微機,最好配有支持OpenGL硬加速的圖形卡?連接三個靜態庫程序中除了包含必需的頭文件如<windows.h><GL/gl.h><GL/glaux.h><GL/glu.h>外,在創建執行文件時,在VC環境設置中要連接opengl32.lib,glu32.lib和glaux.lib三個函數庫。運行已創建的執行文件時,在windows\system目錄下要有opengl32.dll,glu32.dll兩個動態連接庫。(5)程序的微機運行環境配置9610.3OpenGL程序設計入門OpenGL的狀態機制OpenGL中的圖元繪制坐標變換及其OpenGL實現應用變換的一個實例光照處理10.3OpenGL程序設計入門OpenGL的狀態機制9710.3.1OpenGL的狀態機制OpenGL的繪圖方式是由一系列的狀態決定的,如果設置了一種狀態或模式而不改變它,OpenGL在繪圖過程中將一直保持這種狀態或模式。

例如,當前繪圖顏色就是OpenGL的一個狀態,當選定顏色后,OpenGL就用這個顏色繪圖。在例10.1中,以下語句voidmyinit(void){glClearColor(0.0,0.0,0.0,0.0);}中的函數glClearColor(0.0,0.0,0.0,0.0)將視口背景色清為黑色,如果不改變這種狀態,視口背景色將一直保持為黑色。

10.3.1OpenGL的狀態機制98再如:glColor3f(1.0,0.0,0.0);//設置當前顏色為紅色glColor3f(0.0,0.0,1.0);//設置當前顏色為藍色glRectf(0.5,0.5,0.7,0.7);//繪制一個矩形glColor3f(0.0,1.0,0.0);//設置當前顏色為綠色glRectf(0.8,0.8,0.9,0.9);glRectf(0.2,0.2,0.4,0.4);執行結果是:一個藍色的矩形和兩個綠色的矩形。

再如:9910.3.2OpenGL中的圖元繪制任何復雜的圖形都是由基本的圖元點、線和多邊形組成的。程序格式如下:要繪制某個幾何對象,首先必須指明究竟是哪種類型的幾何對象(例如點、線和多邊形),否則系統在執行繪圖操作時無法判斷究竟是畫什么。OpenGL提供了一對用于指定頂點序列操作的函數,確定基本幾何對象的類型。glBegin(…);……//描述一組頂點,用于建構某種幾何對象glEnd();

10.3.2OpenGL中的圖元繪制任何復雜的圖形都是1001.點的繪制OpenGL中點定義為一個方塊,在默認狀態下,點是屏幕上的一個像素。在OpenGL中,一個點是當作一個n(2,3,4)維向量來處理的。OpenGL中的點是三維的,如果用戶設定二維坐標(x,y),則OpenGL在實際計算時處理的點為(x,y,0);對于由四維齊次坐標定義的頂點(x,y,z,w),在w非零時,齊次頂點(x,y,z,w)對應于三維坐標中的點(x/w,y/w,z/w);若w=0.0,則對應于無窮遠處的點。glVertex{2,3,4}{dfis}{v}(TYPEcoords);

1.點的繪制101例如:glVertex2i(0,1);glVertex3d(-1.0,1.0,3.1425926);glVertex4d(40,-15.9,0,2);Glfloatv[3]={-1.2f,3.4f,5.6f};glVertex3fv(v);以下操作的結果是在屏幕上繪制三個點:glBegin(GL_POINTS)glVertex3f(1.0,0.0,0.0);glVertex3f(1.0,1.0,0.0);glVertex3f(0.0,1.0,1.0);glEnd();

例如:1022.線的繪制與數學意義上兩端無限延伸的直線不同,OpenGL的線是數學定義中的線段,用成對的端點來描述。如:glBegin(GL_LINES)glVertex2f(0.0,0.0);glVertex2f(1.0,1.0);glEnd();上述操作描述了一條由坐標原點到點(1.0,1.0)的線段。

2.線的繪制1033.多邊形的繪制多邊形指封閉線段圍成的區域。但OpenGL中可以描述的多邊形有兩點限制:多邊形的邊除了多邊形的頂點外不允許相交,即確保多邊形為簡單多邊形;多邊形為凸多邊形,即任給多邊形的兩個內部點,其連線完全在多邊形內。多邊形的描述方式如下:glBegin(GL_POLYGON);glVertex*(v0);glVertex*(v1);……..glVertex*(vn);glEnd();其中,*表示glVertex函數的上述任一種組合形式,由多邊形頂點v0,v1,…,vn的表示形式而定。注意:多邊形頂點應按一定順序排列(如逆時針)。

3.多邊形的繪制1044.矩形的繪制由于矩形在幾何體構造中出現得比較頻繁,所以OpenGL提供了專門的矩形函數:voidglRect{dfis}(TYPEx1,TYPEy1,TYPEx2,TYPEy2);voidglRect{dfis}v(TYPE*v1,TYPE*v2);矩陣的左上、右下角點坐標分別為(x1,y1)和(x2,y2),或者用數組指針v1、v2表示。用上述函數描述的矩形位于z=0平面內,并且各邊分別平行于x、y軸。但注意:經過坐標變換之后,這些特性可能改變。

4.矩形的繪制105例10.2基本的圖元繪制程序

為簡單起見,我們僅改變例10.1中的繪制函數voidCALLBACKdisplay(void)如下:voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//將顏色緩存清為glClearColor命令所設置的顏色,即背景色

glColor4f(1.0,1.0,1.0,1.0);//選顏色(R,G,B)glPointSize(6.0);//設置點的大小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();例10.2基本的圖元繪制程序106glBegin(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);glVertex2f(-0.6,0.4);glEnd();glColor3f(1.0,0.0,0.0);//設置當前顏色為紅色glColor3f(0.0,0.0,1.0);//設置當前顏色為藍色glRectf(0.5,0.5,0.7,0.7);//繪制一個矩形

glBegin(GL_LINE

溫馨提示

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

評論

0/150

提交評論