計(jì)算機(jī)圖形系統(tǒng)_第1頁
計(jì)算機(jī)圖形系統(tǒng)_第2頁
計(jì)算機(jī)圖形系統(tǒng)_第3頁
計(jì)算機(jī)圖形系統(tǒng)_第4頁
計(jì)算機(jī)圖形系統(tǒng)_第5頁
已閱讀5頁,還剩108頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第六章三維真實(shí)感物體顯示技術(shù)第六章三維真實(shí)感物體顯示技術(shù)計(jì)算包括所有應(yīng)用中非圖形的計(jì)算,幾何模型包括一個(gè)計(jì)算中的數(shù)據(jù)的高級圖形表示或者叫科學(xué)計(jì)算可視化,觀察指用戶查看應(yīng)用數(shù)據(jù)。行為體是指以同樣方式仿真用戶的系統(tǒng)中的交互對象,用戶對象的仿真有三個(gè)方面的研究:幾何仿真、物理仿真和行為仿真。其中幾何仿真是核心技術(shù),是三維圖形學(xué)研究熱點(diǎn),也是立體虛擬現(xiàn)實(shí)的基礎(chǔ)。第六章三維真實(shí)感物體顯示技術(shù)本章主題是:三維計(jì)算機(jī)圖形學(xué)(CG),介紹三維計(jì)算機(jī)圖形學(xué)中一些基本方法,基本概念以及基本技巧。本章主要內(nèi)容是:立體多面體的消隱算法,基本光照模型以及紋理貼圖方法等。第六章三維真實(shí)感物體顯示技術(shù)要求:在模仿現(xiàn)實(shí)基礎(chǔ)上,自己編程實(shí)現(xiàn)相應(yīng)的程序,達(dá)到舉一反三,從而熟練掌握這些基本方法和基本技巧以及基本概念。6.1隱藏面和隱藏線的消除

三維計(jì)算機(jī)圖形學(xué)方法中,利用計(jì)算機(jī)處理立體對象,所使用的表示立體對象的模型稱為立體模型。主要模型有:(1)線框架結(jié)構(gòu)模型(wireframemodel);(2)表面模型(surfacemodel);(3)實(shí)體模型(solidmodel)

6.1隱藏面和隱藏線的消除

線框架結(jié)構(gòu)模型它是將立體對象用輪廓線和小的元素面描述的模型,這種模型的對象立體數(shù)據(jù)輸入方式簡單,容易操作,可以實(shí)現(xiàn)描述的快速性,經(jīng)常被人們使用。但是由于線推表示會出現(xiàn)錯(cuò)誤理解。如下圖所示。6.1隱藏面和隱藏線的消除6.1.1凸多面體的隱藏線消除

凸多面體是由若干個(gè)平面圍成的物體,這些平面的方程設(shè)為:

6.1.1凸多面體的隱藏線消除平面的法向量n為(ai,bi,ci)或(-ai,-bi,-ci)即-aix-bix-cix=0也是平面方程。為了下面討論方便,規(guī)定n的取法滿足下列條件:對物體內(nèi)一點(diǎn)P0(x0,y0,z0)使得n·(x0,y0,z0)T+di<0,這樣規(guī)定的法向量n指向了物體外部。6.1.1凸多面體的隱藏線消除視覺與第i個(gè)面上一點(diǎn)連線方向?yàn)椋╨i,mi,ni)則第i個(gè)面為自隱藏面的判斷方法是:6.1.1凸多面體的隱藏線消除對于任意凸對面體,可先求出所有隱藏面,然后檢查每條邊,若此邊為兩隱藏面的交線,則此邊是隱藏線,用虛線表示或消除。6.1.2凹多面體的隱藏線消除注意到凹多面體的表面也都是多邊形,因此,一條邊是否為隱藏線的判斷實(shí)質(zhì)上是這樣一個(gè)問題:空間一段線段P1P2和一個(gè)多邊形π,判斷線段是否被多邊形遮擋。如果全被遮擋則是隱藏線,若部分遮擋,則求出隱藏部分,以視點(diǎn)為投影中心,把線段與多邊形頂點(diǎn)投影到屏幕,將各對應(yīng)投影點(diǎn)連線的方程與直線聯(lián)立求解,即可求得線段與多邊形投影得交點(diǎn)。6.1.2凹多面體的隱藏線消除這樣,線段AB投影多邊形有兩種可能:1、線段與多邊形的任何邊都不相交;2、線段AB與投影多邊形有交點(diǎn)。下面分別討論:6.1.2凹多面體的隱藏線消除1、線段與多邊形的任何邊都不相交 此時(shí)又有兩種可能值,即線段AB與投影多邊形分離;或線段AB在投影多邊形之中。前一種情況,線段完全可見。后一種,空間線段完全可見或完全隱藏。可以通過空間線段中點(diǎn)與視點(diǎn)連線,判斷此連線段與空間多邊形是否有交點(diǎn),若沒有交點(diǎn),則空間線可見,若有交點(diǎn),則空間線段被空間多邊形隱藏。6.1.2凹多面體的隱藏線消除2、線段AB與投影多邊形有交點(diǎn)此時(shí)投影多邊形的邊把投影線段分割成若干段,如圖所示6.1.2凹多面體的隱藏線消除每條線段上所有點(diǎn)具有相同的隱藏性,究竟是隱藏的還是可見的需進(jìn)一步判斷是否落在投影多邊形內(nèi)部。若在內(nèi)部則需要隱藏。根據(jù)上述方法,依次把多邊形的邊進(jìn)行對比便得到所有隱藏線。6.1.3曲面隱藏線消除由方程

(5.2)表示則曲面經(jīng)常出現(xiàn)在實(shí)際應(yīng)用和科學(xué)計(jì)算中,在表示這個(gè)曲面的線框式立體圖中。一般用x=xi和z=zi兩簇曲線表示,曲面隱藏線的消除就是對這兩簇曲線進(jìn)行檢測判斷曲線哪些部分要被遮擋而隱藏的。6.1.3曲面隱藏線消除為此先討論z=zi的一簇曲線的消隱算法。設(shè)

i=1,2……n(5.3)平面z=zn是最靠近視點(diǎn),于是平面Z=zn上曲線

(5.4)都是可見的。6.1.3曲面隱藏線消除而對于z=zi平面上的曲線y=f(x,zi),在區(qū)間x∈[a,b]上只有兩種情況是可見的。f(x,zi)>maxf(x,zj)x∈[a,b]f(x,zi)<minf(x,zj)x∈[a,b]其余線段上應(yīng)當(dāng)消隱,如圖5.5。6.1.3曲面隱藏線消除6.2消除隱藏面為了讓曲面在圖形顯示器上顯示,需要把對應(yīng)的曲面某點(diǎn)在屏幕某位置決定出來,即把曲面點(diǎn)變換成圖像中點(diǎn),這過程就是光柵化過程,于是有些曲面或曲面一部分會被遮擋住,因此需要解決消除隱藏面的問題。6.2.1畫家算法畫家算法是把對象空間方法與圖像空間方法結(jié)合在一起來消除隱藏面的方法,其原理是,先把顯示窗口設(shè)置成背景色,再把物體各個(gè)面按其離視點(diǎn)的遠(yuǎn)近進(jìn)行排序,離視點(diǎn)遠(yuǎn)的多邊形平面放在表頭,離視點(diǎn)近的在表尾,這樣得到一個(gè)存放深度優(yōu)先的表,然后按表頭到表尾的順序逐個(gè)繪制各個(gè)面。由于后顯示的面取代先顯示的面,而后顯示的面離視點(diǎn)更近一些,因此由遠(yuǎn)及近的繪制各個(gè)面,就相當(dāng)于消除隱藏面。因?yàn)檫@方法與畫家作畫過程類似,故取名為畫家算法。6.2.1畫家算法這里涉及了一個(gè)問題,即多邊形究竟如何排序呢?下面給出一種建立深度優(yōu)先級表的方法。6.2.1畫家算法每個(gè)多邊形有一些頂點(diǎn),這些頂點(diǎn)有一個(gè)Z坐標(biāo),取其中Z坐標(biāo)最小的記為Zmin,于是這個(gè)多邊形都有這么個(gè)Zmin,按Zmin的大小把多邊形作為初步排序。設(shè)Zmin最小的多邊形為P,它暫時(shí)成為優(yōu)先級最低的一個(gè)多邊形。對其他任意一個(gè)多邊形Q,研究P與Q的關(guān)系。(1)若Zmax(P)<Zmin(Q),則P不為遮擋Q。(2)若Zmax(P)>Zmin(Q)而又有Zmin(P)<Zmin(Q),則需要作進(jìn)一步檢查。6.2.1畫家算法按下面五種情況進(jìn)行討論6.2.1畫家算法P和Q在xoy平面上投影的包圍盒在x方向上不相交。P和Q在xoy平面上投影的包圍盒在y方向上不相交。P和Q在xoy平面上投影不相交。P的各頂點(diǎn)均在Q的遠(yuǎn)離視點(diǎn)的一側(cè)。Q的各頂點(diǎn)均在P的靠近視點(diǎn)的一側(cè)。五項(xiàng)中有一項(xiàng)成立,則P就不遮擋Q。如果上述五項(xiàng)都不成立,則說Q有部分被P遮擋了。6.2.1畫家算法多邊形的畫家算法如下:①對每個(gè)多邊形頂點(diǎn)求Zmin。以Zmin為排序關(guān)鍵碼,建立相應(yīng)的深度排序表。表中第一個(gè)多邊形是最小的Zmin,記這多邊形為P,同時(shí),設(shè)視點(diǎn)位于Z軸方向的無窮遠(yuǎn)處,于是根據(jù)坐標(biāo)系規(guī)定,P是離視點(diǎn)最遠(yuǎn)的多邊形。②取第二個(gè)多邊形為Q③檢查Q與P的關(guān)系如果Zmax(P)<Zmin(Q),則P不遮擋Q,將P寫入幀緩存。如果滿足上述五個(gè)條件之一,則P不遮擋Q,于是P寫入幀緩存。6.2.2Z緩沖算法Z緩沖算法又稱為深度緩沖算法,這是一種簡單而且有效的圖像空間隱藏面消除的算法,是由Catual于1975年提出的。這主要針對畫家算法中,深度排序計(jì)算量大,而且排序后還需檢查相鄰的面,以確保在深度優(yōu)先級表中前者在前,后者在后,若遇到多邊形相交或循環(huán)無序時(shí)還必須分割多邊形等復(fù)雜運(yùn)算而求出的一種新方法,在這個(gè)算法中,需要兩張表存放相應(yīng)數(shù)據(jù),一張表叫幀緩存,用來存放對應(yīng)象素的顏色值,另一張叫Z緩存存儲器,用來存放對應(yīng)象素的深度值。如圖所示。6.2.2Z緩沖算法

屏幕幀緩存Z緩沖器每個(gè)單元存放對每個(gè)單元存放對6.2.2Z緩沖算法Z緩存器中每個(gè)單元的值是對應(yīng)像素點(diǎn)所反映對象的Z坐標(biāo)值,Z緩沖器中每個(gè)單元初值先完成Z的極小值,而幀緩存中對應(yīng)單元的初值取為背景色,圖形消隱的過程實(shí)際上就是根據(jù)Z緩沖器的情況給幀緩存對應(yīng)單元填充相應(yīng)的顏色值。具體講,Z緩沖器的值與空間一點(diǎn)的Z值進(jìn)行比較,若Z緩沖器的值大,則不變,即Z緩沖器的值不變,幀緩存的值也不變;若Z緩沖器的值小,則Z緩沖器的值用此Z值表示,同時(shí)幀緩存的對應(yīng)值用空間點(diǎn)對應(yīng)的多邊形的顏色填。對顯示對象的每個(gè)面上的每個(gè)點(diǎn)都作了上述處理后,便又得到清除了隱藏面的圖。6.2.2Z緩沖算法Z-buffer算法(){

幀緩存置背景色;

Z緩存置為-1;//表示取為最小值

for(每個(gè)多邊形面) {

掃描轉(zhuǎn)換多邊形;

for(多邊形所覆蓋的每個(gè)象素(x,y)) {

計(jì)算深度值Z(x,y);

if(Z(x,y)>Z緩沖器中(x,y)的值) {

把Z(x,y)替換Z緩沖器(x,y)的值; 把多邊形在(x,y)處的顏色值存入幀緩存的(x,y)處;

} } }}6.2.2Z緩沖算法深度緩沖器算法的優(yōu)點(diǎn)是①方法簡單,在象素級上由近物代替遠(yuǎn)物,從面達(dá)到消除隱藏面的要求,對于復(fù)雜形狀也可以實(shí)現(xiàn);②計(jì)算量為線性復(fù)雜度O(n),其中n場景中景物表面采樣點(diǎn)的樹目,所以,對于復(fù)雜畫面,此方法能較有效的顯示出來;③由于景物表面上的可見點(diǎn)可按任意次序?qū)懭隯緩沖器和幀緩存,所以不必首先把多項(xiàng)式面進(jìn)行排序,省了畫家算法中的排序時(shí)間。④容易推廣至空間的自由曲面。事實(shí)上只需在上述算法中把多邊形面改為自由曲面便可,故對描述一般場景是個(gè)有效方法;⑤由于目前涉及的三維顯示都存在運(yùn)行速度慢的問題,許多實(shí)時(shí)顯示需要硬件實(shí)現(xiàn)算法來加速,固而能否易于硬件實(shí)現(xiàn)也是衡量一個(gè)算法的指標(biāo)之一,Z緩沖器算法只涉及比較小而易于硬件實(shí)現(xiàn),所以,Z緩沖算法已在計(jì)算機(jī)圖形學(xué)中成了一個(gè)標(biāo)準(zhǔn)。6.2.2Z緩沖算法Z緩沖算法也有許多缺點(diǎn)①該算法并沒有考慮物體固有的拓?fù)鋷缀谓Y(jié)構(gòu)事實(shí)上,物體固有的幾何結(jié)構(gòu)在空間構(gòu)成一種空間構(gòu)架,在這構(gòu)架中有一些面本身不可見,無須再拿來判斷。因而,z緩沖算法的運(yùn)算或沒有必要,計(jì)算量還是挺大的。②有一些處理相對而言實(shí)現(xiàn)不了,如對透明半透明效果無法實(shí)現(xiàn)。6.2.2Z緩沖算法多面體消隱的改進(jìn)z緩存算法:Z_Buffer(){ //幀緩存置為背景色;//掃描整個(gè)屏幕

For(屏幕上的每個(gè)象素(i,j)) {

深度緩存變量zb=-1;//置最小值

For(多面體上的每一個(gè)多邊形) { If(象素點(diǎn)i,j在p的投影多邊形內(nèi)P) {If(像素點(diǎn)(i,j)在P的投影多邊形內(nèi))

計(jì)算P在i,j點(diǎn)的深度值depth; If(depth>zb) { zb=depth;

幀緩存相應(yīng)位置置p的顏色; } } }}按幀緩存進(jìn)行顯示;}6.2.3掃描線z-buffer算法掃描線z緩沖器算法如下:For(各條掃描線){

將掃描線楨緩存置為背景色;

將掃描線z緩沖器置最大值;

For(各個(gè)多邊形) {

求出該多邊形與當(dāng)前掃描線的相交區(qū)間;

For(相交區(qū)間內(nèi)各個(gè)象素點(diǎn)) {

計(jì)算多邊形在該處的深度值Z;

If(多邊形在該處深度值z<Z緩沖器在該處的值) {

用多邊形在該處的深度值z取代Z緩沖在該處的值; 用多邊形的顏色替代幀緩存中相應(yīng)值;

} } }

用幀緩存顯示當(dāng)前掃描線;}6.2.3掃描線z-buffer算法由于在處理每條掃描線時(shí),都要判斷所有多邊形是否與其相交,若相交還要計(jì)算相交區(qū)間內(nèi)每個(gè)象素點(diǎn)的深度值,所以掃描線z緩沖算法的運(yùn)算量還是很大的。因此,在實(shí)現(xiàn)算法時(shí),還要采用一些方法降低運(yùn)算量。6.2.3掃描線z-buffer算法首先,建立一個(gè)多邊形的表及一個(gè)邊的表,這兩個(gè)表行數(shù)是一樣的,是窗口的掃描線。6.2.3掃描線z-buffer算法6.2.3掃描線z-buffer算法6.2.3掃描線z-buffer算法多邊形表用于存放多邊形信息,存放原則為:對于一個(gè)多邊形,根據(jù)多邊形頂點(diǎn)中y坐標(biāo)最小的y值,以此值確定多邊形在多邊形表中的位置,其數(shù)據(jù)結(jié)構(gòu)包括:多邊形的編號ID,多邊形頂點(diǎn)y坐標(biāo)的最大值,以及指向存儲在多邊形表中的同一行的下一多邊形的指針。根據(jù)多邊形編號,可以從定義多邊形的數(shù)據(jù)表中取出多邊形平面方程ax+by+cz+d=0的系數(shù)a,b,c,d以及多邊形的邊,頂點(diǎn)坐標(biāo)和多邊形的顏色屬性信息。6.2.3掃描線z-buffer算法邊的表用于存放多邊形的邊信息,其存放原則為:對于一個(gè)多邊形的邊,根據(jù)邊的兩端點(diǎn)中較大的y值,確定邊在表中的位置。多邊形的表的數(shù)據(jù)結(jié)構(gòu)包括:邊的兩端點(diǎn)中y坐標(biāo)的最大值。該邊在xoy面上的投影和相鄰的兩條掃描線交點(diǎn)的x坐標(biāo)值之差△x,y值較小的那個(gè)端點(diǎn)的x坐標(biāo)和z坐標(biāo)值以及指向存于邊表的同一行的下一條邊的指針。如下圖所示的多邊形中,邊表的結(jié)構(gòu)6.2.3掃描線z-buffer算法6.2.4區(qū)間掃描算法由于掃描線z緩沖器酸法的運(yùn)算量較大,下面的區(qū)間掃描線算法考慮了各個(gè)邊的拓?fù)浣Y(jié)構(gòu)關(guān)系,運(yùn)算量就少許多。6.2.4區(qū)間掃描算法每條掃描線被多邊形邊界在xoy平面上的投影分割成為一些小區(qū)間,從結(jié)構(gòu)上看,這些區(qū)間上的象素的顯示或隱藏性質(zhì)應(yīng)當(dāng)一樣的。因此,只須分析清楚每個(gè)區(qū)間上的顯示與否的屬性便可。于是,只要在區(qū)間上任意一點(diǎn)處,找出在該處z值最大的面。這個(gè)區(qū)間上的每個(gè)象素就用這個(gè)面顏色來顯示??朔藪呙杈€z緩沖器算法在每個(gè)象素處計(jì)算多邊形z值而工作量大的困難,這種區(qū)間上計(jì)算z值的做法叫區(qū)間掃描線算法。6.2.4區(qū)間掃描算法如下圖所示,掃描線l與A、B、C三個(gè)投影多邊形的邊相交形成9個(gè)小區(qū)間。下面如何確定這些小區(qū)間的顏色呢?6.2.4區(qū)間掃描算法按下列情況進(jìn)行討論:小區(qū)間上沒有任何多邊形,如[d,e]段和掃描線l兩頭此時(shí)用背景色顯示該小區(qū)間。當(dāng)小區(qū)間只有一個(gè)多邊形,如[a,b],[e,d]等,這時(shí)用此多邊形的顏色便可顯示該小區(qū)間。當(dāng)小區(qū)間存在兩個(gè)或兩個(gè)以上的多邊形,如圖中的[f,g],必須通過深度測試判斷哪個(gè)多邊形是可見的,再顯示此多邊形的顏色。6.2.4區(qū)間掃描算法如果允許物體表面相互貫穿,那么還必須求出它們在xoz掃描平面上的交點(diǎn),再進(jìn)一步細(xì)分這些小區(qū)間。更進(jìn)一步作深度判斷哪個(gè)多邊形是可見的。如下圖(a)所示,A、B、C三個(gè)多邊形是在xoy面上投影重疊。于是應(yīng)當(dāng)從他們與掃描平面的交線才能看出它們在空間中的相互位置。這時(shí)有兩種情況,第一種,各多邊形與掃描平面的交線互不相交,如下圖(b)所示,則不必將小區(qū)間細(xì)分為更小的區(qū)間。第二種,各多邊形與xoz掃描平面的交線相交,則需要將小區(qū)間進(jìn)一步細(xì)分,如下圖(c)中增加一條g點(diǎn)線,同時(shí)[c,g],[g,d]中顯示不同的多邊形。具體如何顯示,需要在數(shù)據(jù)結(jié)構(gòu)中進(jìn)行處理,以提高交點(diǎn)的計(jì)算效率。6.2.4區(qū)間掃描算法6.2.5Warnock算法這是一種分而治的算法,既適合于消去隱藏線又適合于隱藏面,其基本思想如下:首先觀察整個(gè)窗口區(qū)域,如果窗口中只需顯示一個(gè)多邊形面,則可以直接顯示出來,此時(shí)稱窗口為單純的,否則為非單純的。例如:窗口內(nèi)沒有可見物體,則直接顯示背景或窗口內(nèi)只有一個(gè)多邊形面顏色,則就是單純的。若窗口內(nèi)有兩個(gè)多邊形或非單純的時(shí)候,則將窗口分為四部分,進(jìn)一步判斷它們是否單純。不單純時(shí)再細(xì)分,直到窗口單純或窗口不能再分為止。如圖5.13所示6.2.5Warnock算法6.2.5Warnock算法這過程可以用一棵四叉樹來描述,有很好的效率。即使1024*1024的視圖窗口,被細(xì)分十次后也成為一個(gè)象素面而不能再分。當(dāng)然,算法中關(guān)鍵在窗口是否單純的判斷,這就要分析窗口與物體的所有投影后的多邊形面之間的關(guān)系,如圖5.14所示,多邊形面與窗口的關(guān)系有4種類型:6.2.5Warnock算法6.2.5Warnock算法(a)分離,是指多邊形在窗口之外。(b)內(nèi)含,是指多邊形在窗口之內(nèi)。(c)相交,是指多邊形與窗口部分相交。(d)包圍,是指多邊形把窗口全部包含。6.2.5Warnock算法根據(jù)這四種情況,Warnock算法描述如下:步驟一:對每個(gè)窗口進(jìn)行判斷,若所有多邊形沒在某個(gè)窗口,則該窗口設(shè)為背景色。步驟二:若窗口內(nèi)含一個(gè)多邊形,則窗口中多邊形部分著此多邊形色,其余部分著背景色。步驟三:若窗口與一個(gè)多邊形相交,同步驟二一樣。步驟四:若窗口被一多邊形包圍,則全部著多邊形顏色。步驟五:若窗口被若干多邊形包圍,并且所有多邊形不交叉,則把距離視點(diǎn)近的多邊形顏色給窗口著色。步驟六:若以上條件都不滿足,那么繼續(xù)細(xì)分窗口,并重復(fù)上述步驟。以上幾個(gè)步驟中,步驟五是關(guān)鍵,要找出包圍窗口的多邊形中距離視點(diǎn)最近的一個(gè)多邊形,需要作深度檢測,具體實(shí)現(xiàn)時(shí),可將面片根據(jù)它們距離視點(diǎn)的最小距離先進(jìn)行深度排序,然后,再取最小深度的多邊形的顏色作為窗口顏色。6.3編程實(shí)例本節(jié)主要介紹VisualC++圖形程序設(shè)計(jì)所必須的基礎(chǔ)知識。包括畫筆和畫刷的建立,常用繪圖函數(shù)及其在應(yīng)用程序中的使用方法等,后面針對前述算法做一些例子。6.3.1繪圖函數(shù)的用法1)畫筆畫筆的顏色確定所畫線條顏色,具體畫筆創(chuàng)建方法有三種:CPen::CPen()CPen::CPen(intnPenStyle,int

nWidth,COLORREFcrColor)CPen::CPen(intnPenStyle,intnWidth,constLOGBRUSH)6.3.1繪圖函數(shù)的用法2)畫點(diǎn)函數(shù)畫點(diǎn)是通過調(diào)用CDC::SetPixel()或CDC::SetPixelv()函數(shù)來實(shí)現(xiàn)的,原形如下:COLORREFSetPixel(intx,inty,COLORREFcrColor)COLORREFSetPixel(Pointpoint,COLORREFcrColor)BOOLSetPixelv(intx,inty,COLORREFcrColor)BOOLSetPixelv(Pointpoint,COLORREFcrColor)6.3.1繪圖函數(shù)的用法3)MoveTo()和LineTo()函數(shù)MoveTo()函數(shù)是把光標(biāo)位置移到所希望的位置,而LineTo()函數(shù)則從光標(biāo)位置開始畫一條直線到所希望的位置,其函數(shù)原型如下:CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);6.3.2實(shí)現(xiàn)函數(shù)立體圖例5.1采用上面所介紹的消隱算法,實(shí)現(xiàn)函數(shù)的圖形。程序見書。6.3.2實(shí)現(xiàn)函數(shù)立體圖6.4光照模型6.4.1顏色模型和顏色應(yīng)用1、光和顏色物體的顏色不僅取決于物體本身,還與光源,周圍環(huán)境的顏色有關(guān)。如,紅光照在物體上,使其帶有紅色成份,紅色物體使其附近物體泛紅等,不僅如此,物體顏色還與人們感覺心里系統(tǒng)有關(guān)。例如有些人看紅色的物體時(shí)并不產(chǎn)生紅色的感覺,這就我們常講的色盲。6.4.1顏色模型和顏色應(yīng)用2、CIE色度圖對自然界的一種顏色c可以表示為:等號表示兩邊代表的光看起來完全相同,“+”號表示光的疊加,r、g、b為顏色配對中所需要的RGB三原色光的相對比例量,R、G、B為紅、綠、藍(lán)三原色光。6.4.1顏色模型和顏色應(yīng)用1931年國際照明委員會CIE給出了任意可見光所需的三原色光的比例曲線,如下圖所示。注意到圖中對于500μm的光要用R、G、B線性組合表示時(shí),r值應(yīng)當(dāng)為負(fù),否則無法表示。這帶來一個(gè)問題,即對于500μm的光如何用R、G、B實(shí)現(xiàn)。因?yàn)槲覀儾⒉淮嬖谝环N負(fù)的光強(qiáng),即負(fù)的rR是不能實(shí)現(xiàn)的。因而有一些顏色不能通過將三原色混合起來得到并在CRT上顯示。6.4.1顏色模型和顏色應(yīng)用6.4.1顏色模型和顏色應(yīng)用于是,CIE在1931規(guī)定了三種假想的標(biāo)準(zhǔn)原色,x、y、z以便能得到的顏色匹配的比例量全為正。注意:除了用紅、綠、藍(lán)三色混合成一般顏色外,還可以用補(bǔ)色青、品紅、黃來構(gòu)成三原色,即只要滿足下列二條件的三種顏色均可作為原色:1、任何一種顏色可以用三種顏色混合而成;2、三種顏色中任意一種顏色不能由其余兩種顏色混合而成。6.4.1顏色模型和顏色應(yīng)用CIE用XYZ形成一個(gè)CIE—XYZ系統(tǒng),該系統(tǒng)的光顏色匹配函數(shù)定義為如下的一個(gè)式子:6.4.1顏色模型和顏色應(yīng)用對于同一顏色C的CIE_RGB的值(R,G,B)與CIE_XYZ的值可以通過以下形式相互轉(zhuǎn)換:3、常用顏色模型1)RGB模型RGB顏色模型是用紅(r)、綠(G)、藍(lán)(B)為坐標(biāo)軸定義的單位方體。如圖5.20所示:原點(diǎn)表示黑色,其對角線上點(diǎn)表示灰度色,角點(diǎn)為白色,坐標(biāo)軸上的立方體頂點(diǎn)表示原色,而其余相對的頂點(diǎn)為補(bǔ)色,在立方體范圍內(nèi)的每個(gè)彩色點(diǎn)都可以用三個(gè)參數(shù)(R,G,B)表示,值在0~1的范圍內(nèi)。這模型對顯示器而言是方便的,顯示器總是從暗到亮的增強(qiáng)顏色,而對打印機(jī)而言卻不方便了,打印機(jī)總是從亮到暗的增強(qiáng)顏色,故采用下列顏色模型。3、常用顏色模型3、常用顏色模型2)CMY模型用青(C)、淡紅(M)、和黃(Y)3種原色所定義的一種顏色模型叫CMY模型,除了原點(diǎn)是白色,對角線頂點(diǎn)為黑色以外,CMY的坐標(biāo)空間與RGB的完全相同。它是減色系統(tǒng),故有利于打印機(jī)實(shí)現(xiàn)。3、常用顏色模型RGB模型和CMY模型的原色是互補(bǔ)色。因此,它們的轉(zhuǎn)換是很方便的。4、OpenGL顏色OpenGL顏色模型實(shí)際上有兩種(1)RGB(RGBA)模式;(2)顏色表模式。4、OpenGL顏色1)RGBA模式下的顏色函數(shù)函數(shù)glColor*()用來設(shè)置當(dāng)前待繪制幾何對象的顏色。VoidglColor3{bsifdubusui}(TYPEr,TYPEg,TYPEb);VoidglColor4{bsifdubusui}{TYPEr,TYPEg,TYPEb,TYPEa};VoidglColor3{bsifdubusui}v(TYPE*v);VoidglColor4{bsifdubusui}v(TYPE*v);參數(shù)*v是包含RGBA顏色數(shù)值的指針,r、g、b分別表示紅、綠、藍(lán)三種顏色組合,參數(shù)a即是表示融合度的數(shù)值。{}內(nèi)是可選數(shù)據(jù)類型,相應(yīng)的數(shù)據(jù)范圍如下表所示:4、OpenGL顏色表5.1參數(shù)類型列表前

綴類

型對應(yīng)C變量b8-bitintsignedints16-bitintshorti32-bitintlongF32-bitintfloatd64-bitintdoubleub8-bitunsignedintunsignedcharus16-bitunsignedintunsignedshortui32-bitunsignedintunsignedlong4、OpenGL顏色2)顏色索引模式下的顏色函數(shù)該模式下使用的函數(shù)為:

voidglIndex{sifd}(TYPEc);voidglIndex{sifd}v(TYPE*c);這些函數(shù)用于從顏色索引表中選取顏色,當(dāng)前顏色索引值存于c中。注意:當(dāng)索引值發(fā)生變化后,相應(yīng)像素點(diǎn)的顏色會發(fā)生變化的;其次,索引表可由用戶自己定義;第三,RGB模式是OpenGL默認(rèn)的模式。6.5簡單光照模型生成具有真實(shí)感的圖象的重要因素是加入光照效果來進(jìn)行表現(xiàn)。這種表現(xiàn)光照效果的模型稱為明暗模型或稱為光照模型。在現(xiàn)實(shí)世界中,光照射到物體上,光線可能被吸收、反射、和透射。被物體吸收的部分轉(zhuǎn)化為其它的能量。反射和透射的光則進(jìn)入我們的視覺系統(tǒng),我們便看見物體。為此,我們需要了解已知物理形態(tài)和光源性質(zhì)的條件下,計(jì)算物體的光照效果的數(shù)學(xué)模型——光照模型6.5簡單光照模型從一般情況看,物體在場景中產(chǎn)生的顏色和當(dāng)前的光源、物體材料有關(guān)。由于計(jì)算機(jī)進(jìn)行光譜計(jì)算和光譜至顏色的轉(zhuǎn)換將耗費(fèi)很大的時(shí)間,因而采用較為簡單的處理方式。考慮到許多應(yīng)用場合中照明光源的顏色和構(gòu)成物體表面的材料并不關(guān)心,因而簡單光照模型只考慮物體表面的幾何對反射和透射光的影響,即在簡單照明模型中,環(huán)境假設(shè)為由白光照明,且反射光和透射光的顏色可以選定,這樣使光照明模型的建立和應(yīng)用變得十分方便。下面討論不含透射光的簡單照明模型。6.5簡單光照模型在物體不透明的情況下,物體表面的顏色僅由其反射光決定。反射光有三種類型的分量組成:環(huán)境反射、漫反射和鏡面反射。環(huán)境反射是人射光均勻地從周圍環(huán)境入射到物體表面后等量地向各個(gè)方向反射的光。例如:透射厚厚云層的陽光,室內(nèi)各物體之間光的多次反射結(jié)果也可以視作環(huán)境反射光。漫反射分量表示特定光源在景物表面的反射光中那些向空間各方向均勻反射出去的光,而鏡面反射光為朝一定方向的反射光。這幾種反射光是我們看見物體的關(guān)鍵。下面詳細(xì)討論這幾種光的計(jì)算6.5.1環(huán)境光不同的物體對環(huán)境光有不同的反射屬性,記為Ka,若用Ia表示環(huán)境光的強(qiáng)度,于是物體某點(diǎn)的反射光強(qiáng)度為:注意到我們所接受的是Iambien的強(qiáng)度,也就是在圖上要用Iambien表示物體上的點(diǎn),Ka與物體有關(guān),根據(jù)物體而定,Ia由環(huán)境光定,其越強(qiáng)自然使Iambien越強(qiáng),符合我們的習(xí)慣。6.5.2漫反射漫反射是物體并不光滑形成的,這種不光滑的物體叫漫反射體。如圖5.22所示,其特點(diǎn)是反射光是由于表面從各個(gè)方向等強(qiáng)度地反射而成,因而從各個(gè)視角出發(fā),物體表面呈現(xiàn)相同的亮度,所看到的物體表面某點(diǎn)明暗程度不隨觀測者的位置變化而變化。漫反射光的強(qiáng)度或某點(diǎn)的明暗程度服從Lambert漫反射模型6.5.2漫反射其中Idiffuse是物體表面某點(diǎn)的漫反射光強(qiáng),Id為點(diǎn)光源的光強(qiáng)度。表示物體表面該點(diǎn)對漫反射光的反射屬性,Kd(0<K<1)是入射光線與物體表面在該點(diǎn)出法線的夾角。6.5.2漫反射這里具體計(jì)算是要注意的,令L是該點(diǎn)到光源的單位向量,

N為單位法向量,則:6.5.3鏡面反射其實(shí),光照射到物體上,除了產(chǎn)生漫反射外,還會產(chǎn)生鏡面反射,相當(dāng)于光照射到理想的光滑表面一樣,其特點(diǎn)是在光滑表面會產(chǎn)生一塊高光區(qū)的特亮區(qū)域。反射光與人射光滿足光的反射定律,鏡面反射強(qiáng)度與反射光和視線的夾角相關(guān)。6.5.3鏡面反射其中,n為物體鏡面反射指數(shù),為反射光與視線的夾角6.5.4phong模型一個(gè)物體在一個(gè)場景中,若沒有光的照射,我們肯定是看不見的,只有在某種光照下,反射光才能進(jìn)入我們視覺系統(tǒng),而光照下物體的反射光有三種類型,也就是說,進(jìn)入我們視覺系統(tǒng)的反射光有三種類型。因此,物體某點(diǎn)上的反射光的強(qiáng)度應(yīng)當(dāng)是三種反射光的迭加。即6.5.4phong模型注意到上式中I是光譜量,為避免光譜計(jì)算,直接用光柵圖形顯示器的RGB三基色顏色系統(tǒng)。即寫成6.5.4phong模型用戶可直接指定物體表面環(huán)境反射,漫反射和鏡面反射光的顏色。也就是說。物體上某一點(diǎn)的顏色可以用上式進(jìn)行計(jì)算而得。6.5.4phong模型例5.2把曲面(x-120)+z40(20y100)顯示出來。具體做法見教材!6.5.4phong模型6.6OpenGL的光照處理從上面可見,要顯示一張簡單的曲面所涉及的內(nèi)容和計(jì)算是相當(dāng)復(fù)雜的,若再添加各種場景或增加幾個(gè)光源,情況更加麻煩。現(xiàn)在OpenGL把相當(dāng)復(fù)雜的工作已集成在相應(yīng)地函數(shù)中,只須對參數(shù)的處理便可得到需要的光照模型,方便了我們的使用,下面就介紹如何使用OpenGL進(jìn)行光照處理。6.6.1光源的定義光源有許多特性,如顏色、位置、方向等。不同特性的光源,作用在物體上的效果是不一樣的。定義一個(gè)光源的主要工作就是定義它的各種特性,OpenGL通過光源特性的函數(shù)glLight*()來定義光源。VoidglLight{if}(GLenumlight,GLenumpname,TYPE*param);VoidglLight{if}v(GLenumlight,GLenumpname,TYPE*param);6.6.1光源的定義函數(shù)定義光源不等的某特性,其中l(wèi)ight指定光源編號,在一個(gè)場景最多定義八個(gè)不同的光源,編號為GL-LIGHT0,GL-LIGHT1,…,GL-LIGHT7,參數(shù)pname指定光源特性的名稱,即是什么種類的光。如下表取值,參數(shù)param為指向param所指屬性值的指針,它可以指向一個(gè)數(shù)值,也可以指向一個(gè)值,具體有所定義的屬性而定6.6.1光源的定義

表5.2pname參數(shù)的取值及意義GL_AMBIENT(0.0,.0.0,0.0,1.0)環(huán)境光的RGBA強(qiáng)度值GL_DIFFUSE(1.0,1.0,1.0,1.0)漫反射光的RGBA強(qiáng)度值GL_SPECULAR(1.0,1.0,1.0,1.0)鏡面反射光RGBA強(qiáng)度值GL_POSITION(0.0,0.0,1.0,0.0)光源坐標(biāo)(x,y,z,w)GL_SPOT_DIRECTION(0.0,0.0,-1.0)聚光燈投影方向(x,y,z)GL_SPOT_EXPONENT0.0聚光燈指數(shù)GL_SPOT_CUTOFF180.0聚光燈截止角度GL_CONSTANT_ATTENUATION1.0定長衰減因子GL_LINER_ATTENUATION0.0線性衰減因子GL_QUADRATIC_ATTENUATION0.0二次衰減因子6.6.1光源的定義1、顏色在glLight()參數(shù)pname取值為GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR時(shí)指定光源中相應(yīng)組成部分的顏色強(qiáng)度。GL_AMBIENT指定環(huán)境光的RGBA強(qiáng)度,當(dāng)其特性值為{0.0,0.0,0.0,1.0},表示沒有環(huán)境光這是默認(rèn)狀態(tài)。GL_DIFFUSE指定漫反射光的RGBA強(qiáng)度,默認(rèn)情況下對于GL_LIGHT0,GL_DIFFUSE特性值為{1.0,1.0,1.0,1.0},對于其他編號為GL_LIGHT1,…,LIGHT7的光源,該特性值為{0.0,0.0,0.0,0.0}這特性可以視為光源的顏色。GL_SPECULAR用于指定鏡面反射的RGBA強(qiáng)度,默認(rèn)時(shí),對于GL_LIGHT0該特性值為{1.0,1.0,1.0,1.0},對于其他光源,該特性值為{0.0,0.0,0.0,0.0}。6.6.1光源的定義2、位置使用GL_POSITION定義光源位置坐標(biāo)(x,y,z,w),當(dāng)w=0時(shí),表示定義的位置在無窮遠(yuǎn),而(x,y,z)僅說明光的方向,此時(shí)叫方向光源。當(dāng)w≠0時(shí),則定義一個(gè)較近的光源,(x,y,z)表示光源的坐標(biāo)。6.6.1光源的定義3、衰減光線強(qiáng)度隨光源距離的增加而減少,若光源是無限遠(yuǎn)時(shí),則光線強(qiáng)度不衰減。對于一般的位置光源,OpenGL使用下面的衰減因子來衰減光線的強(qiáng)度。衰減因子=6.6.1光源的定義其中,d為光源位置到物體頂點(diǎn)的距離。kc為GL_CONSTANT_ATTENUATION默認(rèn)值為1.0ke為GL_LINER_ATTENUATION默認(rèn)值為0.0kg為GL_QUADRATIC_ATTENUATION默認(rèn)值為0.06.6.1光源的定義4、聚光一般情況下,光源光線是向四周發(fā)射,可以使用GL_DOT_CUTDFF來限制光線的范圍,缺省是1800。當(dāng)然,除了指定光發(fā)散角度外,還需指定聚光狀態(tài)下的方向,例如:glLlightf(GL_LIGHT0,GLSPOT_CUTOFF,45.0);//45角范圍GLfloatspot_direction[]={-1.0,-1.0,0.0};glLightfv(GL_LIGHTO,GL_SPOT_DIRECTION,spot_direction)6.6.2材質(zhì)的定義OpenGL用材質(zhì)來描述物體表面特性,通過制定物體表面對光的反射率來確定物體的顏色設(shè)置材質(zhì)屬性的函數(shù)是:VoidglMaterial{if}(GLenumface,GLenumpname,TYPEparam);VoidglMaterial{if}(GLenumface,GLenumpname,TYPEparam);其中參數(shù)face是GL_FRONT,GL_BACK或GL_FRONT_AND_BACK指定當(dāng)前材質(zhì)作用物體的哪一面.6.6.2材質(zhì)的定義參數(shù)pname設(shè)置材質(zhì)的屬性,由表5.3所示表5.3pname的取值及意義屬性名稱默認(rèn)值

意義GL_AMBIENT(0.2,0.2,0.2,1.0)對環(huán)境光的反射率GL_DIFFUSE(0.8,0.8,0.8,1.0)對漫反射的反射率GL_AMBIENT_AND_DIFFUSE對環(huán)境和漫反射的反射率GL_SPECULAR(0.0,.0,0.0,1.0)反射顏色GL_SHININESS0.0反射指數(shù)GL_EMISSION(0.0,0.0,0.0,1.0)輻射光色GL_COLOR_INDEX(0,1,1)環(huán)境散射和反射索引6.6.2材質(zhì)的定義例如,將當(dāng)前材質(zhì)的散射和環(huán)境反射率設(shè)置為(0.1,0.5,0.8,1.0)GLfloatmat_amb_diff[]={0.1,0.5,0.8,1.0}glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff

6.6.3OpenGL的光照實(shí)例程序見教材.6.7紋理映射在三維圖形繪制中僅有光滑曲面顯示是不夠的,在一定的面上采用相應(yīng)的紋理會增強(qiáng)真實(shí)感。因而,三維圖形繪制中紋理映射是廣泛使用的,進(jìn)行紋理映射需完成以下幾件事:1)定義紋理;2)控制濾波;3)說明映射方式;4)繪制場景給求頂點(diǎn)的文理坐標(biāo)和幾何坐標(biāo)。6.7.1定義紋理一般情況下,紋理是單個(gè)圖像,通常是二維的當(dāng)然也有一維紋理和二維紋理進(jìn)行圖形繪制,調(diào)用以下函數(shù)定義二維紋理映射:VoidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);其中target指定目標(biāo)紋理,只能GL_TEXTURE_2D;Level表示多級分辨率的紋理圖像的級數(shù),若只有一種分辨率,level為0;Components是從1~4的數(shù),1:選擇R;2:選擇RA;3:選擇RGB;4:選擇RGBA。Width,height是紋理大??;Border是指邊界寬度,只能是0,1;Format描述映射格式,可以是以下符號常量6.7.1定義紋理Type

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論