第四章-圖形變換_第1頁(yè)
第四章-圖形變換_第2頁(yè)
第四章-圖形變換_第3頁(yè)
第四章-圖形變換_第4頁(yè)
第四章-圖形變換_第5頁(yè)
已閱讀5頁(yè),還剩107頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

主講人:趙宏慶第4章圖形變換1第4章圖形變換4.1幾何變換4.2坐標(biāo)變換4.3幾何變換與坐標(biāo)變換的關(guān)系4.4顯示變換4.5裁剪4.6OpenGL的坐標(biāo)變換機(jī)制24.1圖形的幾何變換圖形變換是計(jì)算機(jī)圖形學(xué)中的一個(gè)重要內(nèi)容。通過(guò)對(duì)簡(jiǎn)單圖形進(jìn)行多種變換和組合,可以形成一個(gè)復(fù)雜圖形;同時(shí)它也是造型的方法之一。圖形變換分為:幾何變換、坐標(biāo)變換和顯示變換下面這張示意圖,舉例說(shuō)明了圖形的幾種常見變化。幾種常見的幾何變換:縮放、壓縮、旋轉(zhuǎn)、錯(cuò)切、平移。3總結(jié)以上這些變化后的圖形結(jié)果,可以得到這樣的結(jié)論:(1)圖形變化了,但原圖形的構(gòu)成規(guī)則(拓?fù)潢P(guān)系)沒有改變;(2)圖形發(fā)生的變化,是因?yàn)槠漤旤c(diǎn)位置(幾何關(guān)系)的改變決定的。通過(guò)維持圖形的拓?fù)潢P(guān)系不變,而僅改變圖形的幾何關(guān)系來(lái)實(shí)現(xiàn)改變圖形的方法,我們稱之為圖形的幾何變換。(掌握)4幾何變換的基本方法:(掌握)把變換矩陣作為一個(gè)算子,作用到圖形的一系列頂點(diǎn)的位置矢量,從而得到這些頂點(diǎn)在幾何變換后的新的頂點(diǎn)序列,連接新的頂點(diǎn)序列即可得到變換后的圖形54.1圖形的幾何變換圖形幾何變換的目的平移、旋轉(zhuǎn)、縮放變換的組合6圖形幾何變換的目的改變圖形的位置、方向、大小7平移(Translation)8縮放(scaling)P’=SP9旋轉(zhuǎn)(rotation)—z軸10旋轉(zhuǎn)(rotation)—x軸11旋轉(zhuǎn)(rotation)—y軸124.1.3組合幾何變換與齊次坐標(biāo)齊次坐標(biāo)表示就是用n+1維向量表示n維向量。例如:p(wx,wy,w).這里w是任一不為0的比例系數(shù)。三維空間也類似(wx,wy,wz,w),可以推廣到n維空間的一個(gè)點(diǎn)(p1,p2,p3….,pn),的齊次坐標(biāo)為(wp1,wp2,wp3….,wpn,

w).用笛卡爾坐標(biāo)系表示的n維空間的一個(gè)點(diǎn)向量是唯一的,而齊次坐標(biāo)表示卻是不唯一的。例(10,25,15,5),(6,15,9,3)均為(2,5,3)的齊次坐標(biāo)13這種一對(duì)多的關(guān)系往往使運(yùn)算比較復(fù)雜,所以通常(x,y,z)的齊次坐標(biāo)為(x,y,z,1)齊次坐標(biāo)可以表示無(wú)窮遠(yuǎn)點(diǎn),例n+1維向量中w=0的齊次坐標(biāo)實(shí)際上表示了一個(gè)n維的無(wú)窮遠(yuǎn)點(diǎn);用齊次坐標(biāo)使得所有幾何變換都可以用矩陣相乘來(lái)表示。4.1.3組合幾何變換與齊次坐標(biāo)14齊次坐標(biāo)平移變換的矩陣表示15齊次坐標(biāo)縮放變換的矩陣表示16齊次坐標(biāo)旋轉(zhuǎn)變換的矩陣表示(z軸)17組合變換把由若干個(gè)基本的幾何變換組合而成的一個(gè)幾何變換的過(guò)程稱為組合變換。所有的幾何變換都可以表示成P`=T*P的齊次坐標(biāo)的形式。組合變換也有同樣的形式。不同的是:T=Tn….T3*T2*T1P`=T*P=Tn….T3*T2*T1*P=(Tn….T3*T2*T1)*P18組合變換重點(diǎn)講述組合變換矩陣T的計(jì)算形式(1)相對(duì)于固定點(diǎn)P(xf,yf,zf)的縮放變換把固定點(diǎn)P和物體一起做平移變換,使P點(diǎn)被移到坐標(biāo)系的原點(diǎn)。把物體相對(duì)于坐標(biāo)原點(diǎn)進(jìn)行縮放變換;再把固定點(diǎn)P和物體一起平移變換,使點(diǎn)P移回到原來(lái)的位置。這就可以得到相對(duì)于P的縮放過(guò)的物體了。1920(2)繞任意軸旋轉(zhuǎn)如果旋轉(zhuǎn)所繞的軸不是坐標(biāo)軸,而是任意軸,則變換的過(guò)程較為復(fù)雜。首先,對(duì)物體和旋轉(zhuǎn)軸一起做平移和旋轉(zhuǎn)變換,使得旋轉(zhuǎn)軸與一條標(biāo)準(zhǔn)坐標(biāo)軸重合然后,繞該標(biāo)準(zhǔn)軸對(duì)物體做所需的旋轉(zhuǎn)。最后對(duì)物體和旋轉(zhuǎn)軸進(jìn)行逆變換,使得所繞旋轉(zhuǎn)軸恢復(fù)到原來(lái)的位置。這個(gè)過(guò)程需要由7個(gè)基本變換的級(jí)聯(lián)才能完成。2122假設(shè)P1、P2兩點(diǎn)所定義的矢量為任意軸,旋轉(zhuǎn)角度為。這7個(gè)基本變換如下:232425264.2坐標(biāo)變換4.2.1坐標(biāo)變換的概念與作用坐標(biāo)變換是根據(jù)圖形在一個(gè)坐標(biāo)系下的坐標(biāo)求出該圖形在另一個(gè)坐標(biāo)系下的坐標(biāo)。當(dāng)然,在進(jìn)行坐標(biāo)變換時(shí)必須給出兩個(gè)坐標(biāo)系之間的關(guān)系。應(yīng)用廣泛,可以使許多復(fù)雜的問題簡(jiǎn)單化。坐標(biāo)變換是在兩個(gè)坐標(biāo)系之間進(jìn)行的,圖形這時(shí)候是靜止的,而坐標(biāo)系是變動(dòng)的。274.2.2基本的坐標(biāo)變換方法282930314.2.3齊次坐標(biāo)下的坐標(biāo)變換方法324.2.3齊次坐標(biāo)下的坐標(biāo)變換方法334.2.3齊次坐標(biāo)下的坐標(biāo)變換方法344.3幾何變換與坐標(biāo)變換的關(guān)系對(duì)于簡(jiǎn)單問題用幾何變換求解非常方便、直觀,而對(duì)于復(fù)雜問題,則使用坐標(biāo)變換的方法非常方便。在4.1.3節(jié)中,講述了用幾何變換的方法來(lái)求解繞任意軸旋轉(zhuǎn)的問題。用幾何變換的方法求解時(shí)變換矩陣非常復(fù)雜,如果用坐標(biāo)變換的方法來(lái)實(shí)現(xiàn),則相對(duì)簡(jiǎn)單的多。353637383940414.4顯示變換如何將圖形顯示到窗口中窗口到視區(qū)的變換透視投影變換平行投影變換視坐標(biāo)系與視變換窗口到三維空間的變換424.4.1如何將圖形顯示到窗口中圖形在計(jì)算機(jī)內(nèi)是以數(shù)量的形式進(jìn)行加工和處理的,而坐標(biāo)則建立了圖形和數(shù)量之間的聯(lián)系。三維圖形的顯示流程幾何變換投影變換對(duì)窗口裁剪窗口到視區(qū)變換顯示434.4.2窗口到視區(qū)的變換為了在視區(qū)中顯示出窗口內(nèi)的圖形對(duì)象,需要根據(jù)用戶所定義的參數(shù),找到窗口和視區(qū)之間的坐標(biāo)對(duì)應(yīng)關(guān)系,如下圖444.4.2窗口到視區(qū)的變換要將窗口內(nèi)的點(diǎn)(xw,yw)映射到視區(qū)內(nèi)的點(diǎn)(xv,yv),應(yīng)該滿足如下關(guān)系式:可得

454.4.2窗口到視區(qū)的變換上述窗口到視區(qū)的變換,也可以通過(guò)一系列變換的組合得到。變換過(guò)程按照以下步驟進(jìn)行:將窗口左下角點(diǎn)(WXL,WYB)平移到窗口所在坐標(biāo)系的原點(diǎn);進(jìn)行縮放變換,使窗口的大小與視區(qū)相等;將窗口內(nèi)的點(diǎn)映射到視區(qū)中,再進(jìn)行反平移,將視區(qū)的左下角移回到原來(lái)的位置。464.4.2窗口到視區(qū)的變換將上述步驟寫成矩陣形式為:474.4.3透視投影變換根據(jù)投影的定義可知,空間任意一點(diǎn)的透視投影是投影中心與空間點(diǎn)構(gòu)成的投影線與投影平面的交點(diǎn)。假設(shè)投影中心在zv軸上的zPrP處,視平面與zv

軸垂直,并且在zvP處,如圖4-9所示,可以寫出透視投影線上任一點(diǎn)坐標(biāo)的參數(shù)形式:484.4.3透視投影變換494.4.3透視投影變換504.4.3透視投影變換514.4.3透視投影變換524.4.3透視投影變換534.4.3透視投影變換544.4.4平行投影變換平行投影可根據(jù)投影方向與投影面的夾角分為兩類:正投影和斜投影。正投影的變換方程很簡(jiǎn)單。如果投影屏幕垂直于zv軸,且位于zvp處,那么在視坐標(biāo)系中任意一點(diǎn)(x,y,z)的投影,是過(guò)該點(diǎn)的投影線與投影面的交點(diǎn)。因此空間點(diǎn)的坐標(biāo)與投影坐標(biāo)的關(guān)系為:554.4.4平行投影變換564.4.4平行投影變換574.4.5視坐標(biāo)系與視變換前面我們得到了在特殊情況下的透視投影和平行投影的變換矩陣。但是實(shí)際應(yīng)用中往往需要在一般情況下進(jìn)行投影變換,如果直接推導(dǎo)變換公式,則比較復(fù)雜.那么我們可以首先根據(jù)場(chǎng)景的顯示要求建立一個(gè)視坐標(biāo)系,然后構(gòu)建一個(gè)視平面,也稱為投影平面,使該平面與zv軸垂直。顯示過(guò)程即是把場(chǎng)景中物體從世界坐標(biāo)轉(zhuǎn)換成視坐標(biāo),然后把視坐標(biāo)再投影到視平面.

584.4.5視坐標(biāo)系與視變換1.視坐標(biāo)系

為了建立視坐標(biāo)系,首先指定世界坐標(biāo)系中的一點(diǎn)作為觀察參考點(diǎn),這個(gè)點(diǎn)就是視坐標(biāo)系的原點(diǎn)。然后通過(guò)指定視平面的法矢N確定zv軸的正向。法矢N的方向通常是由世界坐標(biāo)系中的某個(gè)點(diǎn)指向世界坐標(biāo)系的原點(diǎn)或者指向視坐標(biāo)系的原點(diǎn)。例如我們可以定義N的方向是從三維物體上的某一觀察點(diǎn)P指向視坐標(biāo)系的原點(diǎn),如圖4-12所示。N的正向即為zv軸的正向。

594.4.5視坐標(biāo)系與視變換確定了矢量N后,再定義正向矢量V,稱為向上方向矢量,該矢量用來(lái)建立yv軸的正向。由于一般很難選定一個(gè)恰好垂直于N的V矢量,因此,可以這樣來(lái)確定V:開始選擇任意一個(gè)不平行N的矢量V′,然后,使該矢量V′投影到垂直于法矢量N的平面上(如圖4-13),定義投影后的矢量為矢量V。這樣要比輸入一個(gè)恰好與N垂直的矢量要容易得多。

604.4.5視坐標(biāo)系與視變換最后利用矢量N和V,可以計(jì)算出既與N又與V垂直的第三個(gè)矢量U,U則對(duì)應(yīng)于x

v軸的正向。矢量N、V、U的方向就決定了視坐標(biāo)系中各坐標(biāo)軸的方向,而它們的大小則是無(wú)關(guān)緊要的。為了在視變換中計(jì)算簡(jiǎn)單,一般都是用UVN的單位向量,因此視坐標(biāo)系也稱為uvn坐標(biāo)系(如圖4-14)。

614.4.5視坐標(biāo)系與視變換建立了視坐標(biāo)系后,需要建立視平面。一般視平面總是垂直于zv,平行于xvyv坐標(biāo)平面,因此可以用與視坐標(biāo)原點(diǎn)的距離來(lái)定義。建立了視坐標(biāo)和視平面后,可以通過(guò)改變視坐標(biāo)系的原點(diǎn)或者N的方向使用戶在不同距離和角度上觀察三維物體。624.4.5視坐標(biāo)系與視變換2.視變換

由世界坐標(biāo)系變換到視坐標(biāo)系,稱為視變換。假設(shè)世界坐標(biāo)系為Owxwywzw,視坐標(biāo)系Ovuvn,視坐標(biāo)系的原點(diǎn)在世界坐標(biāo)系中的坐標(biāo)為(x0,y0,z0)視坐標(biāo)系的3個(gè)坐標(biāo)軸的單位向量分別為(u

x,u

y,uz),(v

x,v

y,v

z),(n

x,ny,n

z)?,F(xiàn)在要將世界坐標(biāo)系中的圖形變換到視坐標(biāo)系中,假設(shè)記該變換為T視。根據(jù)齊次坐標(biāo)下的坐標(biāo)變換公式(4-28),得到:

63為了將三維物體顯示到屏幕上,則需要經(jīng)過(guò)幾何變換、視變換、投影變換和窗口到視口變換等一系列變換。此組合變換的變換矩陣可以寫成

644.4.6窗口到三維空間的變換654.4.6窗口到三維空間的變換664.4.6窗口到三維空間的變換674.5裁剪4.5.1裁剪的概念與作用1視景體在相機(jī)拍攝的過(guò)程中,鏡頭的類型是決定多少場(chǎng)景被拍攝到膠片上的一個(gè)因素。廣角鏡頭拍的場(chǎng)景要比普通的范圍廣。三維顯示中,在投影平面上指定一個(gè)窗口具有同樣的效果。窗口不一定要以視坐標(biāo)點(diǎn)為中心,它可以在視平面上的任意位置。68定義窗口后,就可以根據(jù)窗口的邊界建立視景體。只有在視景體的內(nèi)的物體經(jīng)投影落在窗口的內(nèi)部才被顯示,視景體的大小依賴于窗口的大小,形狀依賴于投影的方法。69實(shí)際使用中,常常沿著zv方向定義兩個(gè)裁剪平面---前裁剪面和后裁剪面來(lái)限制視景體的范圍,如下圖所示。704.5.1裁剪的概念與作用2何時(shí)裁剪在三維圖形顯示的過(guò)程中,裁剪在投影變換之前或者之后進(jìn)行均可。一般來(lái)說(shuō),在投影之前進(jìn)行裁剪比較合理。三維空間的裁剪算法主要是確定并保存視景體的所有表面,裁剪到視景體外的部分。714.5.1裁剪的概念與作用3視景體的規(guī)范化三維空間視景體的裁剪效率直接影響圖形顯示速度。裁剪中涉及大量求交計(jì)算,為了減少計(jì)算量,引入了規(guī)范化的概念。規(guī)范化視景體的6個(gè)平面方程很簡(jiǎn)單,是得求交計(jì)算相對(duì)簡(jiǎn)單。如在視坐標(biāo)中,平行投影的規(guī)范化視景體的6個(gè)方程可以定義為:723視景體的規(guī)范化前面討論的透視投影是正四棱臺(tái),而正投影是長(zhǎng)方體,顯然對(duì)長(zhǎng)方體的裁剪要簡(jiǎn)單得多。為了是透視投影和平行投影共同用同一裁剪和投影程序,可以先把透視投影的視景體變換成平行投影的視景體。73假設(shè)透視投影的參數(shù)如下圖所示。74那么變換前后兩點(diǎn)之間的關(guān)系:75無(wú)論透視投影還是平行投影,其視景體均可變成一個(gè)矩形平行管道。但此時(shí)的視景體不是規(guī)范體,需要進(jìn)行變換。規(guī)范步驟:平移是前裁剪面上的窗口中心移至坐標(biāo)原點(diǎn);縮放視景體的尺寸規(guī)范化。其變換矩陣為:N=S2*T1(書98頁(yè))764.5.2線段的裁剪直線段是組成其它圖形的基礎(chǔ),其它任何圖形,一般都能用不同直線段或近似為直線段組合形成。直線段裁剪是其他裁剪的基礎(chǔ),下面介紹幾種基本的線段裁剪方法。

點(diǎn)的裁剪裁剪算法中最基本的也是最簡(jiǎn)單的是點(diǎn)的裁剪。設(shè)裁剪窗口是一個(gè)標(biāo)準(zhǔn)矩形,窗口左下角點(diǎn)坐標(biāo)為(Wxl,Wyb),右上角點(diǎn)坐標(biāo)為(Wxr,Wyt),若點(diǎn)P(x,y)滿足下列不等式:

Wxl≤x≤Wxr

Wyb≤y≤Wyt則該點(diǎn)在窗口內(nèi),其中等號(hào)表示點(diǎn)位于窗口邊界上。這樣的點(diǎn)屬于可見點(diǎn),應(yīng)予保留,如果這四個(gè)不等式中有任何一個(gè)不滿足,則該點(diǎn)在窗口外,應(yīng)被裁剪掉。774.5.2線段的裁剪Cohen_sutherland算法這是一個(gè)最早最流行的線段裁剪算法,是由Cohen和Sutherland提出的,也稱為Cohen-Sutherland線段裁剪算法。該算法通過(guò)初始測(cè)試來(lái)減少需要計(jì)算的交點(diǎn)數(shù)目,從而加快線段裁剪算法的速度。線段同窗口的關(guān)系在許多情形中,大多數(shù)線段不是在裁剪窗口之內(nèi)就是在裁剪窗口之外,因此需要迅速?zèng)Q定是否接受或拋棄線段。對(duì)于任意一條直線段,它相對(duì)于裁剪窗口的可能關(guān)系如圖所示787980由編碼規(guī)則可知,若線段完全在裁剪窗口內(nèi),則線段兩端點(diǎn)編碼均為0000。當(dāng)線段兩端點(diǎn)均在窗口之外,且位于裁剪窗口的同一側(cè)時(shí),則兩端點(diǎn)編碼必有一位同時(shí)為1。一旦給所有的線段端點(diǎn)建立了編碼,就可以快速判斷哪條線段完全在裁剪窗口內(nèi),哪條線段完全在窗口外。其方法如下:(1)線段兩端點(diǎn)的編碼逐位取邏輯“或”,若結(jié)果為零,則該線段必為完全可見,應(yīng)保留。(2)線段兩端點(diǎn)的編碼逐位取邏輯“與”,若結(jié)果非零,則該線段必為完全不可見,因而可立即拋棄。通過(guò)上面兩步判定得知完全可見線段和完全不可見線段后,剩下線段兩端點(diǎn)編碼邏輯“或”不為零,或兩端點(diǎn)編碼的邏輯“與”均為零,這些線段可能部分可見,也可能完全不可見。81對(duì)于不能判定完全可見和完全不可見的線段,需要對(duì)線段進(jìn)行再分割,即找到與窗口一個(gè)邊框的交點(diǎn),根據(jù)交點(diǎn)位置,也賦予4位代碼,并對(duì)分割后的線段進(jìn)行檢查,或者接受,或者舍棄,或者再次進(jìn)行分割。重復(fù)這一過(guò)程,直到全部線段均被舍棄或被接受為止。線段與窗口邊求交次序的選擇是任意的。但是無(wú)論哪種次序,對(duì)于有些線段的裁剪,可能不得不重復(fù)4次,計(jì)算與4條窗口邊的交點(diǎn)。82參數(shù)化線段裁剪算法更快的線段裁剪算法基于線段的參數(shù)化方程的分析,它是由粱友棟和Barsky提出的,也稱為粱友棟-Barsky線段裁剪算法。設(shè)線段兩端點(diǎn)坐標(biāo)分別為P1(x1,y1)和P2(x2,y2),則其參數(shù)化直線方程可寫成下列形式:0≤u≤183參數(shù)化線段裁剪算法坐標(biāo)(x,y)表示直線上兩端點(diǎn)之間的任一點(diǎn)。當(dāng)u=0時(shí),得點(diǎn)P1,當(dāng)u=1時(shí),得點(diǎn)P2。線段的裁剪條件可以由下面的不等式表示:Wxl≤x1﹢uΔx≤WxrWyb≤y1﹢uΔy≤Wyt這四個(gè)不等式可以表示為:upk≤qkk=1,2,3,4其中,參數(shù)p,q定義為:p1﹦-Δx,q1﹦x1﹣Wxlp2﹦Δx,q2﹦Wxr﹣x1p3﹦-Δy,q3﹦y1﹣Wybp4﹦Δy,q4﹦Wyt﹣y1下標(biāo)k=1,2,3,4分別對(duì)應(yīng)裁剪窗口的左、右、下、上四條邊界線。84如果線段平行于裁剪窗口的某兩邊界,則必有相應(yīng)的pk﹦0,如果還滿足qk<0,則線段的端點(diǎn)位于窗口外部,即線段在窗口外,應(yīng)該舍棄。如果qk≥0,線段在窗口內(nèi)。當(dāng)pk<0時(shí),直線是從裁剪窗口第k條邊界線的外部延伸到內(nèi)部。例如當(dāng)p1<0時(shí),則x2>x1,直線必然從裁剪窗口的左邊界線的外部進(jìn)入內(nèi)部,如下圖中的線段P1P2當(dāng)pk>0時(shí),直線是從裁剪窗口第k條邊界線的內(nèi)部延伸到外部。例如p2>0時(shí),則x2>x1,直線必然從裁剪窗口的右邊界線的內(nèi)部進(jìn)入外部,如下圖中的線段P3P4。85當(dāng)pk不等于零時(shí),可以計(jì)算出線段與第k條裁剪窗口邊界線的交點(diǎn)參數(shù):根據(jù)定義,對(duì)于每條線段,pk中必有兩個(gè)小于零,而另兩個(gè)大于零。對(duì)于小于零的pk,直線同第k條裁剪窗口邊線是從外到內(nèi)相遇的,此時(shí)如果線段同第k條裁剪窗口邊界線有交點(diǎn)的話,是參數(shù)u從0變大時(shí)遇到的,這時(shí)計(jì)算出相應(yīng)的rk值,取0和各個(gè)rk值之中的最大值記為u1。86與此相反,對(duì)于大于零的pk,計(jì)算出相應(yīng)的rk值,取1和各個(gè)rk值之中的最小值記為u2。兩個(gè)參數(shù)u1和u2定義了在裁剪窗口內(nèi)的線段部分。如果u1>u2,則線段完全落在裁剪窗口之外,應(yīng)被舍棄。否則被裁剪線段可見部分的端點(diǎn)由參數(shù)u1和u2計(jì)算出來(lái)。87梁友棟線的裁剪算法例子設(shè):Wxl=2;Wxr=4;Wyb=2;Wyt=4被裁剪線段的兩端點(diǎn):(1,2),(5,3)計(jì)算:Δx=5-1=4

Δy=3-2=1p1=-4,q1=-1p2=4,q2=3p3=-1,q3=0p4=1,q4=288p1,p3小于0,決定u1,取0與r1和r3中的大者,u1=1/4p2,p4大于0,決定u2,取1與r2和r4中的小者,u2=3/4兩交點(diǎn)由u1,u2決定:計(jì)算:(1)(2)89通常粱友棟-Barsky算法比Cohen-Sutherland算法更有效,因?yàn)樾枰?jì)算的交點(diǎn)數(shù)目減少了。一次計(jì)算就可以確定出線段的可見性及可見部分。這兩種線段裁剪算法都可以擴(kuò)展為三維線段裁剪算法(略)。904.5.3多邊形裁剪盡管多邊形是由線段組成的,但卻不能簡(jiǎn)單地將線段裁剪方法用于多邊形裁剪。這是因?yàn)?,在線段裁剪中,是把一條線段的兩個(gè)端點(diǎn)孤立地加以考慮的,而多邊形是由一些有序的線段組成的,裁剪后的多邊形仍應(yīng)保持原多邊形各邊的連接順序。還有,一個(gè)完整的封閉多邊形經(jīng)裁剪后一般不再是封閉的,需要用裁剪窗口邊界適當(dāng)部分來(lái)形成一個(gè)或多個(gè)封閉區(qū)域。所以,多邊形裁剪后的輸出應(yīng)該是定義裁剪后的多邊形邊界的頂點(diǎn)序列。下圖示出了一個(gè)多邊形裁剪的例子。914.5.3多邊形裁剪多邊形裁剪方法很多,下面介紹兩種常用的多邊形裁剪算法。921逐邊裁剪法這個(gè)算法是由Sutherland和Hodgman提出來(lái)的,也稱為Sutherland-Hoeman多邊形裁剪方法。對(duì)于矩形裁剪窗口的一條邊界線,如果稱窗口區(qū)域所在的一側(cè)為內(nèi)側(cè),另一側(cè)為外側(cè),則方法的具體做法是:每次用裁剪窗口的一條邊界對(duì)要裁剪的多邊形進(jìn)行裁剪,把落在此邊界外側(cè)的多邊形部分去掉,只保留內(nèi)側(cè)部分,形成一個(gè)新的多邊形,并把它作為下一次待裁剪的多邊形。若依次用裁剪窗口的4條邊界對(duì)要裁剪的原始多邊形進(jìn)行裁剪,則最后形成了裁剪出來(lái)的多邊形。下圖說(shuō)明了這個(gè)過(guò)程93941逐邊裁剪法按照上述處理方法,窗口的一條裁剪邊界處理完所有頂點(diǎn)后,其輸出是一個(gè)新的封閉多邊形頂點(diǎn)序列表,用于窗口的下一條邊界繼續(xù)裁剪。所有的窗口邊界都裁剪完后,得到的是裁剪后的多邊形頂點(diǎn)序列,它自然也是封閉的。要實(shí)現(xiàn)上述算法還涉及到點(diǎn)處于窗口邊界內(nèi)外側(cè)判別和求多邊形的邊和窗口邊界的交點(diǎn)。前一節(jié)線段裁剪中所述的判別和求交方法都是可用的952雙邊裁剪法此算法是由Weiler和Atherton提出來(lái)的。算法的基本做法是:有時(shí)沿著多邊形邊的方向來(lái)處理頂點(diǎn),有時(shí)沿著窗口的邊界方向來(lái)處理,從而避免產(chǎn)生多余的連線。設(shè)被裁剪多邊形和裁剪窗口都按順時(shí)針確定排列方向,因此,沿多邊形的一條邊前進(jìn),其右邊為多邊形的內(nèi)部。962雙邊裁剪法算法首先沿多邊形的任一點(diǎn)出發(fā),跟蹤檢測(cè)多邊形的每一條線段,當(dāng)線段與裁剪窗口邊界相交時(shí):

①如果線段起點(diǎn)在窗口外部而終點(diǎn)在窗口內(nèi)部,則求出交點(diǎn),輸出線段可見部分,繼續(xù)沿多邊形方向往下處理;

②如果線段起點(diǎn)在窗口內(nèi)部而終點(diǎn)在窗口外部,則求出交點(diǎn),輸出線段可見部分。從此交點(diǎn)開始,沿著窗口邊界方向往前檢測(cè),找到一個(gè)多邊形與窗口邊界的新交點(diǎn)后,輸出由前交點(diǎn)到此新交點(diǎn)之間窗口邊界上的線段;

③返回到前交點(diǎn),再沿著多邊形方向往下處理,直到處理完多邊形的每一條邊,回到起點(diǎn)為止。97下圖說(shuō)明了雙邊裁剪算法的執(zhí)行過(guò)程。Weiler-Atherton算法可適用于任何凸的或凹的多邊形裁剪,不會(huì)產(chǎn)生多余連線。984.6OpenGL的坐標(biāo)變換機(jī)制有關(guān)的數(shù)據(jù)結(jié)構(gòu)

ModelView變換機(jī)制

Model變換的使用方法

View的變換使用方法

OpenGL的投影OpenGL的深度緩沖區(qū)OpenGL中的反變換99有關(guān)的數(shù)據(jù)結(jié)構(gòu)OpenGL中的多數(shù)變換對(duì)應(yīng)相應(yīng)的變換矩陣,OpenGL就是實(shí)現(xiàn)將物體的各個(gè)頂點(diǎn)通過(guò)各種變換矩陣的作用映射到屏幕上的過(guò)程。

因此,在OpenGL中提供了一些必不可少的矩陣及矩陣操作命令。兩個(gè)坐標(biāo)變換矩陣(4X4)ModelView矩陣GL_MODELVIEW描述了物體旋轉(zhuǎn)、平移、放縮等Projection矩陣GL_PROJECTION描述了怎樣從三維空間變換到屏幕坐標(biāo)glMatrixMode(GL_MODELVIEW);//默認(rèn)glMatrixMode(GL_PROJECTION);100兩個(gè)用于存儲(chǔ)矩陣的堆棧:ModelView矩陣堆棧保存著視點(diǎn)變換和模型變換矩陣的累積乘積每一次的視點(diǎn)變換或模型變換矩陣與當(dāng)前的ModelView矩陣乘積就生成一個(gè)新的矩陣。ModelView矩陣堆棧至少包含32個(gè)4×4的矩陣,初始狀態(tài)時(shí),最頂層的矩陣為單位矩陣。Projection矩陣堆棧包含一個(gè)描述的視景體的投影變換矩陣。一般情況下,投影矩陣不要復(fù)合,投影變換之前需要調(diào)用函數(shù)glLoadIdentity()矩陣堆棧用來(lái)保存和恢復(fù)矩陣的狀態(tài),主要用于具有層次結(jié)構(gòu)的繪制中,用以提高繪圖效率。OpenGL中提供了glPushMatrix()glPopMatrix()兩條命令來(lái)進(jìn)行矩陣堆棧的操作。矩陣堆棧的好處在于,它可以保存指定的矩陣狀態(tài),并在需要的時(shí)進(jìn)行恢復(fù),從而避免了通過(guò)變換進(jìn)行狀態(tài)恢復(fù)時(shí)帶來(lái)的大量的矩陣運(yùn)算,提高了繪圖效率101ModelView變換機(jī)制Model變換的目的是改變物體的位置和尺寸相當(dāng)于幾何變換View變換的目的是改變觀察的方向相當(dāng)與坐標(biāo)變換以上兩個(gè)目的是用一個(gè)手段來(lái)實(shí)現(xiàn)的,即:操作ModelView矩陣102Model變換的使用方法首先使以下函數(shù),表示開始操作ModelView矩陣glMatrixMode(GL_MODELVIEW);操作ModelView

矩陣進(jìn)行Model變換的方法分兩類:1直接定義變換矩陣glLoadIdentity();glLoadMatrix{fd}(constTYPE*m);直接將當(dāng)前矩陣設(shè)置為m所指定的矩陣,其中m為指向列順序排列的16個(gè)值組成的4×4矩陣的指針glMultMatrix{fd}(constTYPE*m);將當(dāng)前矩陣與函數(shù)所指定的矩陣進(jìn)行乘法運(yùn)算,并將結(jié)果置為當(dāng)前矩陣。1032用OpenGL中的庫(kù)函數(shù)glTranslate{fd}(dx,dy,dz);//平移glRotate{fd}(angle,vx,vy,vz);//旋轉(zhuǎn)glScale{fd}(sx,sy,sz);//縮放104View變換的使用方法View變換是改變視點(diǎn)的位置和方向,View變換一般是平移和旋轉(zhuǎn)變換的組合。View變換命令必須在調(diào)用模型變換之前調(diào)用可以使用剛剛講過(guò)的所有函數(shù)來(lái)設(shè)值觀察方向利用以下函數(shù)則更方便:gluLookAt(ex,ey,ez,ax,ay,az,p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論