![第三章繪制基本圖元_第1頁](http://file4.renrendoc.com/view/2bac513858808d1fe67b45ce7e249e0f/2bac513858808d1fe67b45ce7e249e0f1.gif)
![第三章繪制基本圖元_第2頁](http://file4.renrendoc.com/view/2bac513858808d1fe67b45ce7e249e0f/2bac513858808d1fe67b45ce7e249e0f2.gif)
![第三章繪制基本圖元_第3頁](http://file4.renrendoc.com/view/2bac513858808d1fe67b45ce7e249e0f/2bac513858808d1fe67b45ce7e249e0f3.gif)
![第三章繪制基本圖元_第4頁](http://file4.renrendoc.com/view/2bac513858808d1fe67b45ce7e249e0f/2bac513858808d1fe67b45ce7e249e0f4.gif)
![第三章繪制基本圖元_第5頁](http://file4.renrendoc.com/view/2bac513858808d1fe67b45ce7e249e0f/2bac513858808d1fe67b45ce7e249e0f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第三章繪制基本圖元第1頁,課件共65頁,創(chuàng)作于2023年2月3.1坐標系統(tǒng)計算機只能處理數(shù)據(jù),為了能在屏幕上顯示三維圖形,必須將三維圖形與數(shù)據(jù)相聯(lián)系,將數(shù)據(jù)與三維圖形聯(lián)系在一起的唯一紐帶,就是坐標。為了描述圖形,首先必須建立一個世界坐標系(二維或三維笛卡爾坐標系),在世界坐標系中給出圖形對象的位置和方向,然后投影到顯示設備的顯示區(qū)域?qū)亩S平面上,并掃描轉(zhuǎn)換到幀緩存的整數(shù)像素位置。如可以通過兩個端點定義一條直線段,通過一組頂點定義一個多邊形。對象的坐標范圍(x、y、z坐標的最大最小值)稱為對象的包圍盒,對于二維圖形,坐標范圍就是包圍矩形。第2頁,課件共65頁,創(chuàng)作于2023年2月屏幕坐標及圖形坐標顯示器上的位置用整型的屏幕坐標來描述,與幀緩存中的像素位置相對應。坐標y值給出像素的行序號,x值給出列序號。屏幕刷新硬件一般從屏幕的左上角開始對像素進行編址,從最上面的0行到最下面的ymax行,對掃描行進行編號;每行從左到右,從0到xmax按列進行編號。圖形軟件可以按照任意方式設定屏幕位置的圖形坐標系統(tǒng),如可以設定屏幕區(qū)域的左下角為原點(視區(qū)的默認值),用整數(shù)坐標或非整數(shù)笛卡爾坐標來描述圖形。描述物體對象的坐標值最終轉(zhuǎn)換為幀緩存中的整數(shù)像素位置。圖元的掃描轉(zhuǎn)換根據(jù)給定的坐標來確定要顯示的像素位置,如給定一條直線段的兩個端點,顯示函數(shù)必須計算出兩端點間位于線段上的所有像素的位置。由于一個像素位置占有屏幕上的一個有限范圍,因此圖形顯示算法必須考慮像素的有限大小,一般假定像素坐標對應于像素區(qū)域的中心。第3頁,課件共65頁,創(chuàng)作于2023年2月屏幕上的笛卡爾坐標系第4頁,課件共65頁,創(chuàng)作于2023年2月顯示窗口上一章的繪圖實例中應用gluOrtho2D(xmin,xmax,ymin,ymax)函數(shù)設定了一個二維視見空間(二維笛卡爾坐標系),其參數(shù)指定了顯示窗口的x、y坐標范圍。顯示窗口的左下角位于坐標(xmin,ymin)處,右上角位于坐標(xmax,ymax)處。如果一個圖元的坐標范圍完全在顯示窗口內(nèi),該圖元將完整地顯示出來,否則,僅僅位于顯示窗口范圍內(nèi)的部分圖元能顯示出來,這涉及到裁剪。第5頁,課件共65頁,創(chuàng)作于2023年2月3.2頂點及圖元在OpenGL中所有的幾何物體最終都要描述成一個頂點的有序集合,包括單個點、線段的端點或多邊形的頂點。點由其坐標來描述,線是指線段,可由兩個端點來描述,多邊形是指由線段組成的封閉區(qū)域,由各線段的端點來描述。要繪制一個三維點,只需在世界坐標系中指定該點的坐標,OpenGL按指定的大小和顏色來顯示這個點,默認的顏色為白色,默認的大小為一個屏幕像素大小,屏幕上繪制的像素是一個正方形區(qū)域。多邊形常常通過充填其內(nèi)部的像素來顯示,也可以顯示其輪廓線。一般而言,多邊形可能很復雜,所以OpenGL對多邊形做了一些強制限定。首先,多邊形的邊不能相交,其次多邊形必須是凸的,如果指定一個非凸的多邊形,將繪出意想不到的結(jié)果。對多邊形類型作出限制,是為了提高繪制多邊形的速度和性能。由于頂點一般是三維的,如果多邊形的頂點并不處于同一平面內(nèi),經(jīng)過一系列旋轉(zhuǎn)及改變視點后,這些點將不再組成一個簡單的凸多邊形,OpenGL無法保證這個多邊形得到正確繪制。一般可以通過一系列三角形來逼近多邊形,因為三角形的三個頂點肯定位于同一個平面內(nèi)。第6頁,課件共65頁,創(chuàng)作于2023年2月指定頂點坐標OpenGL中,可以使用函數(shù)glVertex()指定頂點的坐標,但頂點既可以是一個純粹的點,也可以是線段的端點,還可以是多邊形的角點,OpenGL中共有10種圖元,必須明確指明這些頂點構(gòu)成何種圖元。OpenGL中將每組頂點放在函數(shù)glBegin()和glEnd()之間,由glBegin()的參數(shù)來指定相應的幾何圖元,然后調(diào)用glEnd()來結(jié)束這組頂點的定義。第7頁,課件共65頁,創(chuàng)作于2023年2月幾何圖元的參數(shù)和含義參數(shù)值意義GL_POINTS獨立的點GL_LINES一對頂點表示一條線段GL_LINE_STRIP各頂點連接成的線段GL_LINE_LOOP各頂點連接成的封閉線段GL_TRIANGLES三個頂點構(gòu)成的三角形GL_TRIANGLE_STRIP相連的三角形條帶GL_TRIANGLE_FAN相連的扇形GL_QUADS四個頂點構(gòu)成的四邊形GLQUAD_STRIP相連的四邊形條帶GL_POLYGON簡單的凸多邊形第8頁,課件共65頁,創(chuàng)作于2023年2月第9頁,課件共65頁,創(chuàng)作于2023年2月繪制三維點例3-1(POINTS)繪制一系列的三維點,使它們沿Z軸形成一個螺旋圈。 glBegin(GL_POINTS); z=-50.0f; for(angle=0.0f;angle<=(2.0f*GL_PI)*3.0f;angle+=0.1f) { x=50.0f*sin(angle); y=50.0f*cos(angle);
//SpecifythepointandmovetheZvalueupalittle glVertex3f(x,y,z); z+=0.5f; } //Donedrawingpoints glEnd();第10頁,課件共65頁,創(chuàng)作于2023年2月點的屬性點的屬性包括顏色和大小,可以調(diào)用函數(shù)glPointSize()來改變點的大小,該函數(shù)有1個參數(shù),指定點的近似直徑(以像素為單位),但點的大小設置還是存在限制。另外,點和其它幾何圖形不同,它不會受到透視的影響,即離視點較遠時,看上去并不會變小,離視點更近時,看上去也不會變大。例3-2(POINTSZ):產(chǎn)生一個點逐漸增大的螺旋圈。for(angle=0.0f;angle<=(2.0f*3.1415f)*3.0f;angle+=0.1f){ //Calculatexandyvaluesonthecircle x=50.0f*sin(angle); y=50.0f*cos(angle);
//Specifythepointsizebeforetheprimativeisspecified glPointSize(curSize); //Drawthepoint glBegin(GL_POINTS); glVertex3f(x,y,z); glEnd(); //Bumpupthezvalueandthepointsize z+=0.5f; curSize+=step;}第11頁,課件共65頁,創(chuàng)作于2023年2月3.3直線段的掃描轉(zhuǎn)換算法例2-2給出了一個繪直線段的例子,代碼如下:glBegin(GL_LINES);//開始定義一組頂點坐標,
//每相鄰的兩個兩點組成一對,在該兩點之間繪直線 glVertex2i(180,15);//定義頂點坐標 glVertex2i(10,145);//結(jié)束定義一組頂點坐標glEnd();例3-3(LSTRIPS)給出了一個由直線段逼近三維螺旋曲線的例子場景中的直線段由其兩端點的坐標來定義,要在光柵顯示器上顯示一條線段,必須先將兩個端點投影到整數(shù)屏幕坐標,并確定離兩端點間的直線路徑最近的像素位置,將顏色值賦予幀緩存中的對應位置。這一過程將一條連續(xù)的線段離散為一組整數(shù)光柵位置。一般而言,這些位置是實際線段路徑的逼近。如計算出的直線位置(10.48,20.51),轉(zhuǎn)換為像素位置為(10,21)。坐標值舍入到整數(shù),使線段呈鋸齒狀,這就是走樣。光柵化特有的鋸齒現(xiàn)象在低分辨率系統(tǒng)中特別明顯,在高分辨率系統(tǒng)中可以得到改善。平滑光柵線段的有效方法是反走樣技術(shù)。第12頁,課件共65頁,創(chuàng)作于2023年2月直線段的掃描轉(zhuǎn)換算法直線的掃描轉(zhuǎn)換:根據(jù)直線的幾何特征,可確定最佳逼近于該直線的一組象素,并且按掃描線順序,對這些象素進行寫操作。兩種常用算法:數(shù)值微分法(DDA)Bresenham算法。第13頁,課件共65頁,創(chuàng)作于2023年2月數(shù)字微分法基本思想:根據(jù)線段斜率的不同,在某個坐標軸上以單位間隔對線段采樣,在另一個坐標軸上確定最靠近線段的對應整數(shù)值。已知過端點P0(x0,y0),P1(x1,y1)的直線段L的方程為:
y=kx+b直線斜率為當斜率的絕對值小于1時,從x的左端點x0開始,向x的右端點逐步遞增。步長=1(象素單位),計算相應的y坐標y=kx+b;取象素點(x,round(y))作為當前點的坐標。第14頁,課件共65頁,創(chuàng)作于2023年2月由直線方程可得下一個采樣點的y坐標為:yi+1=kxi+1+b
=kxi+b+k
x =yi+k
x
當
x=1時; yi+1=yi+k
即:當x每遞增1,y遞增k(即直線斜率);注意上述分析的算法僅適用于
k
≤1的情形。在此情況下,x每增加1,y最多增加1。當
k
1時,必須把x,y的地位互換:xi+1=xi+1/b該算法能在有限的線段長度內(nèi),根據(jù)斜率的不同合理確定盡可能多的像素來逼近該直線段。DDA算法計算像素的位置比直接使用直線方程計算的速度要快,它利用光柵特性消除了直線方程中的乘法,在x或y方向使用合適的增量,在直線路徑上逐步得到各像素的位置。但在浮點增量的連續(xù)累加中,取整誤差的積累使得對于較長線段所得到的像素位置偏離實際線段,且該過程中的取整操作和浮點運算仍然十分耗時。促使人們考慮既能用于直線,又能用于曲線的更通用的掃描線算法。第15頁,課件共65頁,創(chuàng)作于2023年2月例:畫直線段P0(0,0)--P1(5,2)k=0.4
xint(y+0.5)y+0.50 0 01 0 0.4+0.52 1 0.8+0.5 3 1 1.2+0.54 2 1.6+0.55 2 2.0+0.5第16頁,課件共65頁,創(chuàng)作于2023年2月Bresenham算法Bresenham畫線算法是一種精確而有效的光柵線生成算法,該算法還可用于圓和其它曲線。如下圖,首先考慮斜率小于1的直線的掃描轉(zhuǎn)換過程,沿線段路徑的像素位置由以單位x間隔的采樣來確定。從給定線段的左端點(x0,y0)開始,逐步處理每個后繼列(x位置),并在其掃描線y值最接近線段的像素上繪出一點。下圖顯示了這個過程的第k步。假設已經(jīng)決定要顯示的像素在(xk,yk),那么下一步需要確定在列xk+1=xk+1上繪制那個像素,是在位置(xk+1,yk),還是在(xk+1,yk+1)。從(xk,yk)像素開始,繪制斜率0<m<1的直線的屏幕局部第17頁,課件共65頁,創(chuàng)作于2023年2月在采樣位置xk+1,用dlower和dupper來表示兩個像素與直線段路徑的垂直偏移。直線段上像素列位置處的y坐標為:y=m(xk+1)+b則:dlower=y-yk
=m(xk+1)+b-yk
dupper=(yk+1)-y=yk+1-m(xk+1)-b要確定兩像素中哪一個更接近線段路徑,需要測試這兩個像素偏移的差:
dlower-dupper=2m(xk+1)-2yk++2b-1在采樣位置xk+1處,像素位置到直線上y坐標之間的垂直距離第18頁,課件共65頁,創(chuàng)作于2023年2月設
y和
x分別為兩端點的垂直和水平偏移量,則m=y/x,定義決策參數(shù)pk為:
pk=x(dlower-dupper)
=2yxk-2
xyk+c3-1
其中c=2y+
x(2b-1),pk的符號與dlower-dupper的符號相同(此例中x>0
)。假如yk處的像素比yk+1的像素更接近于線段(即dlower<dupper),那么參數(shù)pk是負的,此時繪制下面的像素,反之,繪制上面的像素。可以利用遞增整數(shù)運算得到后繼的決策參數(shù)值。在k+1步,可得決策參數(shù)為:pk+1=2yxk+1-2
xyk+1+c3-2將兩式相減,可得:
pk+1
-pk=2y(xk+1-xk
)-2
x(yk+1
-yk)但xk+1=xk+1,因而pk+1=pk+2y-2
x(yk+1
-yk)其中yk+1
-yk取0或1,取決于參數(shù)pk的符號。決策參數(shù)的遞歸運算在線段的坐標端點開始的每個整數(shù)x位置進行,起始像素位置(x0,y0)的第一個參數(shù)p0由式3-1及m=y/x可得:p0=2y-
x遞推時,僅進行兩個常量2y及2y-2
x之間的整數(shù)加減。第19頁,課件共65頁,創(chuàng)作于2023年2月正斜率小于1的線段的Bresenham畫線算法的主要步驟概括如下:(1)輸入線段的兩個端點,并將左端點儲存在(x0,y0)中;(2)將(x0,y0)裝入幀緩存,畫出第一個點;(3)計算常量x、y、2y和2y-2
x,并得到?jīng)Q策參數(shù)的第一個值;p0=2y-
x(4)從k=0開始,在線段路徑的每個xk處,進行下列檢測:如果pk<0,下一個要繪制的點是(xk+1,yk),并且pk+1=pk+2y否則,下一個要繪制的點是(xk+1,yk+1),并且
pk+1=pk+2y-2
x(5)重復步驟4,共x-1次。當斜率
1時,也必須把x,y的地位互換。例:會直一條線段,端點為(20,10)和(30,18)。該線段的斜率為0.8,且
x=10,y=8初始決策參數(shù)為:p0=2y-
x=6后繼決策參數(shù)的增量為:2y=16,2y-2
x=-4繪制初始點(x0,y0)=(20,10),并根據(jù)決策參數(shù)確定后即像素點的位置為:第20頁,課件共65頁,創(chuàng)作于2023年2月kpk(xk+1,yk+1)06(21,11)12(22,12)2-2(23,12)314(24,13)410(25,14)kpk(xk+1,yk+1)56(26,15)62(27,16)7-2(28,16)814(29,17)910(30,18)沿端點(20,10)和(30,18)用Bresenham畫線算法繪制的像素點第21頁,課件共65頁,創(chuàng)作于2023年2月線的屬性直線段的屬性包括顏色、線寬和線型。OpenGL中,線的顏色用圖元的顏色函數(shù)設定,而線寬和線型則用單獨的線函數(shù)選擇。例3-4(LINESW):用glLineWidth()函數(shù)設置線寬,以不同的寬度繪直線。還可以用點線或虛線模式繪直線,稱為點畫線glEnable(GL_LINE_STIPPLE)啟用點畫線功能glLineStipple(GLintfactor,GLushortpattern)創(chuàng)建點畫模式。pattern是一個16位的值,指定了一個模式,它的每一位都表示線段的一部分,處于打開或關(guān)閉狀態(tài),缺省情況下,每位對應一個像素。factor作為一個乘法因子,用于增加模式的寬度。例3-5(LSTIPPLE):顯示加寬的點畫線第22頁,課件共65頁,創(chuàng)作于2023年2月3.4圓的生成算法圓的方程為:(x-xc)2+(y-yc)2=r23.4.1利用這個方程,可以沿x軸從xc-r到xc+r以單位步長計算對應的y值,從而得到圓周上每點的位置:y=yc±(r2-(xc-x)2)1/23.4.2該方法的每一步包含很大的計算量,而且所繪制像素的間距不一致,如下圖所示。我們可以在圓斜率的絕對值大于1后,交換x和y(即步進y值并計算x值)來調(diào)整間距,但增加了計算量和處理過程??傊摲椒ú皇且环N理想的畫圓方法。
用方程3.4.2繪制的正半圓第23頁,課件共65頁,創(chuàng)作于2023年2月另一種消除不等間距的方法是使用極坐標r和
來計算圓周上的點,圓的極坐標方程為:x=xc+rcos
y=yc+rsin使用上述方法以固定角度為步長可以生成等間距得點來繪制圓,盡管利用極坐標能生成等距點,但三角函數(shù)的計算十分耗時??梢岳脠A的對稱性減少計算量,圓的形狀在每個象限中是相似的,如果確定了圓在第一象限中的位置,則可以生成圓在第二象限的部分,因為圓相對于y軸是對成的。根據(jù)圓相對于x軸的對稱性,由第一象限和第二象限中的圓弧,可以得到第三象限和第四象限中的圓弧。在八分圓之間也有對稱性,一個象限中相鄰八分圓的圓弧對于45°直線是對稱的,如下圖。圖中八分之一圓上的一點(x,y)可映射到其它7個八分圓的點。利用圓的對稱性,可由1個八分圓上的點,映射到其余7個八分圓上的點第24頁,課件共65頁,創(chuàng)作于2023年2月利用圓的對稱性,僅需計算從x=0到x=y這段圓弧的點就可得到整個圓的所有像素位置。在該八分圓中,圓弧斜率的絕對值≤1,x=0時的斜率為0,x=y時圓弧的斜率為-1.0。使用對稱性及圓的方程來確定圓周上的像素位置,仍然需要大量的計算,更有效地畫圓算法是采用類似Bresenham畫線算法,通過設定在每一步采樣步驟中尋找最接近圓周像素的決策參數(shù)。但圓的方程是非線性的,包含平方運算,一個避免平方運算的方法是:檢驗兩像素間的中點位置是在圓邊界之內(nèi)還是之外。中點畫圓算法:對于中心為(xc,yc)、半徑為r的圓,先計算圓心在(0,0)的圓的像素位置,然后通過將xc加到x且yc加到y(tǒng),將圓平移到真正位置。在第一象限,圓弧段從x=0到x=y,曲線的斜率從0變到-1.0??梢栽谠摪朔謭A上的正x方向取單位步長,并使用決策參數(shù)來確定每一步兩個可能的y位置中,哪一個更接近于圓的位置,其余7個八分圓中的位置可由對稱性得到。定義圓函數(shù):
f(x,y)=x2+y2-r2任何點的相對位置可由圓函數(shù)的符號來決定:第25頁,課件共65頁,創(chuàng)作于2023年2月<0,如果(x,y)位于圓內(nèi)f(x,y)=0,如果(x,y)位于圓上>0,如果(x,y)位于圓外圓函數(shù)即為決策參數(shù),下圖給出了采樣位置xk+1上兩個候選像素間的中點。
圓周上采樣位置xk+1上候選像素間的中點假設剛在(xk,yk)繪制了一個像素,下一步需要確定是像素(xk+1,yk)還是像素(xk+1,yk-1)更接近于圓,在兩像素的中點求決策參數(shù)的值:
pk=f(xk+1,yk-1/2)=(xk+1)2+(yk-1/2)2-r2假若pk<0,則該中點位于圓內(nèi),掃描線yk上的像素接近于圓周邊界。否則該中點位于圓外或圓周上,選擇掃描線yk-1的像素。第26頁,課件共65頁,創(chuàng)作于2023年2月后續(xù)的決策參數(shù)可以使用增量運算得到,如對采樣位置xk+1=xk+2處的圓函數(shù)求值,可以得到下一個決策參數(shù)的循環(huán)表達式:
pk+1=f(xk+1+1,yk+1-1/2)=[(xk+1)+1]2+(yk+1-1/2)2-r2=pk+2(xk+1)+(y2k+1-y2k)-(yk+1-yk)+1其中,yk+1是yk或yk-1,取決于pk的符號。若pk為負,則yk+1=yk,pk+1的增量為2xk+1+1;若pk為正,則yk+1=yk-1,pk+1的增量為2xk+1+1-2yk+12xk+1和2yk+1的求值也可以通過增量的方式求得:2xk+1=2xk+22yk+1=2yk-2在起始位置(0,r)處,這兩項的初始值分別為0和2r。在起始位置(0,r)處,初始決策參數(shù)為:p0=f(1,r-1/2)=1+(r-1/2)2-r2=5/4-r若以整數(shù)屏幕坐標為參數(shù),則中點方法使用整數(shù)加減來計算圓周的像素位置。第27頁,課件共65頁,創(chuàng)作于2023年2月中點畫圓算法的步驟:(1)輸入圓半徑r和圓心(xc,yc),并得到圓周(圓心在原點)上的第一個點:(x0,y0)=(0,r)(2)計算決策參數(shù)的初始值:
p0=5/4-r(3)在每個xk位置,從k=0開始,計算決策參數(shù),若pk<0,則圓周下一像素位置為(xk+1,yk),并且
pk+1=pk+2xk+1+1否則圓的下一點為(xk+1,yk-1),并且
pk+1=pk+2xk+1+1-2yk+1其中,2xk+1=2xk+2且2yk+1=2yk-2(4)確定其它7個八分圓中的對稱點。(5)將每個計算出來的像素位置(x,y)平移到圓心在(xc,yc)的圓周上,并繪出各點(x+xc,y+yc)。(6)重復步驟3到步驟5,直至x≥y。第28頁,課件共65頁,創(chuàng)作于2023年2月例,使用中點畫圓算法畫圓給定圓半徑r=10,確定在第一象限從x=0到x=y沿八分圓的各像素點位置。決策參數(shù)的初始值為:p0=1-r=-9對于中心在原點的圓,初始點(x0,y0)=(0,10),決策參數(shù)的初始增量值:2x0=0,2y0=20使用中點畫圓法計算的后續(xù)決策參數(shù)值及像素位置如下:kpkxk+1,yk+12xk+1,2yk+10-6(1,10)2201-6(2,10)4202-1(3,10)62036(4,9)8184-3(5,9)101858(6,8)121665(7,7)1414第29頁,課件共65頁,創(chuàng)作于2023年2月用中點畫圓法得到的像素位置(空心圓為第一象限的對稱位置)第30頁,課件共65頁,創(chuàng)作于2023年2月使用折線來逼近曲線常見的曲線除圓以外,還有橢圓、圓錐曲線、三角和指數(shù)函數(shù)、樣條曲線等。生成圓和橢圓等基本曲線的函數(shù)并未作為圖元包含在OpenGL的核心庫中,但核心庫中包含了Bezier樣條曲線,該曲線是由一組離散點定義的多項式。顯示曲線的簡單方法是使用直線段來逼近曲線,僅需確定一組曲線上的點并將它們連接成一組直線段。折線中的線段越多,曲線越平滑。第31頁,課件共65頁,創(chuàng)作于2023年2月3.5填充區(qū)圖元圖形學中常常需要用一種顏色或某種圖案來填充一個區(qū)域,盡管有可能使用各種形狀,但圖形庫一般不支持任意的填充形狀,多數(shù)庫函數(shù)要求填充區(qū)為多邊形。多邊形是由三個或更多的頂點連接而成的封閉圖形,由于多邊形的邊界為直線段,因而比其他形狀更容易處理??蓪⑶€轉(zhuǎn)換為由分段折線構(gòu)成的多邊形,曲面也可以用一系列多邊形面片來逼近。如果一個多邊形的所有內(nèi)角均小于180°,則該多邊形為凸(convex)多邊形。等價定義:它的內(nèi)部完全在它的任一邊及其延長線的一側(cè)。如果任意兩點位于凸多邊形的內(nèi)部,則其連線上的任一點也在凸多邊形的內(nèi)部。不是凸多邊形的多邊形稱為凹(concave)多邊形。退化多邊形是指有共線或重合頂點的多邊形,共線的頂點生成一條線段,重疊的頂點可以生成多余線段、重疊邊或長度為0的邊。為了軟件的魯棒性,圖形軟件可以拒絕退化或非平面的多邊形。凹多邊形也會產(chǎn)生一些問題,對凹多邊形的填充及其它處理比較復雜,常常將凹多邊形分割成一組凸多邊形以提高效率。第32頁,課件共65頁,創(chuàng)作于2023年2月可以為多邊形的每一條邊建立一個向量,用相鄰邊的叉積來測試凸凹性,凸多邊形的所有向量叉積均同號,如果某些叉積為正而另一些為負,則為凹多邊形。識別凹多邊形的另一個方法是觀察多邊形頂點位置與每條邊延長線的關(guān)系。如果有些頂點在某一延長線的一側(cè)而有些頂點在另一側(cè),則為凹多邊形。多邊形的填充算法分為掃描線填充算法和種子填充算法。掃描線的含義來源于光柵顯示器,對屏幕上的每個像素點,按從上到下,從左到右的順序進行顯示,水平方向從左到右每掃描一行,就是一條y方向的掃描線,同理,從上到下也能形成x方向的掃描線。掃描線填充算法的原理是:待填充區(qū)域按y方向(或x方向)掃描線的順序,計算掃描線與多邊形的相交區(qū)間,再用指定的顏色填充這些區(qū)間的像素,區(qū)間的端點可以通過計算掃描線與多邊形邊界的交點求得。第33頁,課件共65頁,創(chuàng)作于2023年2月通用多邊形的掃描線填充算法下圖給出了多邊形區(qū)域?qū)嵭奶畛涞膾呙杈€過程。對每一條與多邊形相交的掃描線,與邊的交點從左到右排序,且將每一對交點之間的像素位置包括這對像素在內(nèi),設定為指定顏色,本例中與邊界的四個交點定義了兩段內(nèi)部像素:從x=10到14的5個像素,以及從x=18到x=24的7個像素。如果是用圖案填充多邊形,則沿一條掃描線的每一個像素顏色由與圖案重疊的位置確定。穿過多邊形區(qū)域的掃描線上的內(nèi)部像素第34頁,課件共65頁,創(chuàng)作于2023年2月有時情況比較復雜,當一條掃描線經(jīng)過多邊形的一個頂點時,掃描線在該頂點處與多邊形的兩條邊相交,這種情況可能導致在這條掃描線上的交點要增加兩個點。下圖給出了在頂點處與多邊形相交的兩條掃描線。掃描線y’與偶數(shù)條邊相交,必須將該頂點處的交點作為2個交點,才能正確標識該掃描線上的兩對交點之間為內(nèi)部像素段。掃描線y與多邊形的5條邊相交,必須將該頂點除的交點作為1個交點,才能正確標識該掃描線上的兩對交點之間為內(nèi)部像素段。通過觀察相交邊相對于掃描線的位置,可以發(fā)現(xiàn)掃描線y和掃描線y’間的拓撲差異。對于掃描線y,共享一個頂點的兩條相交邊位于掃描線的兩側(cè),對于掃描線y’,兩條相交邊位于掃描線的同一側(cè)。掃描線與多邊形頂點相交,y’生成奇數(shù)個交點,y’生成偶數(shù)個交點第35頁,課件共65頁,創(chuàng)作于2023年2月可以通過順時針或逆時針方向來搜索多邊形邊界,并觀察從一條邊移動到另一條邊時頂點y坐標的相對變化來判別這個點。假如兩條相鄰邊的三個端點y坐標值單調(diào)遞增或遞減,那么對于任何穿過該頂點的掃描線,必須將該相交頂點(中間的共享頂點)計為1個交點。否則,該相交頂點(中間的共享頂點)即為多邊形邊界上的一個局部極值,(極大或極小),須將該相交頂點計為2個交點凸多邊形的掃描線填充對于凸多邊形,掃描線填充過程可以簡化,每一條掃描線與多邊形至多有兩個交點,可以使用坐標范圍來確定哪些邊與掃描線相交,當掃描線與單個頂點相交時,僅繪出該點本身,當有兩個交點時,兩交點之間的部分都是多邊形內(nèi)部的點。第36頁,課件共65頁,創(chuàng)作于2023年2月種子填充算法區(qū)域填充的另一種方法是從區(qū)域的一個內(nèi)部點開始,由內(nèi)向外逐點繪制直到邊界。可以使用單一顏色或一個圖案來填充一個區(qū)域。假如邊界是以單一顏色指定的,則填充算法可逐個像素地向外處理,直至遇到邊界顏色。該算法從一個內(nèi)點開始檢測相鄰位置的顏色,若檢測位置不是該邊界顏色,就將它設置成邊界顏色,并再檢測其相鄰位置,這個過程持續(xù)到檢測完區(qū)域邊界顏色范圍內(nèi)的所有像素為止。區(qū)域填充算法要求區(qū)域是連通的。從一個當前位置檢測其相鄰像素有兩種方法:4-連通和8-連通。4-連通即檢測當前位置的上、下、左、右4個方向的相鄰像素,8-連通即檢測當前位置的上、下、左、右、左上、右上、左下及右下8個方向的相鄰像素。4-連通8-連通4-連通區(qū)域8-連通區(qū)域第37頁,課件共65頁,創(chuàng)作于2023年2月第38頁,課件共65頁,創(chuàng)作于2023年2月圖案填充可以將一個區(qū)域填充為單一顏色,也可以用某種圖案進行填充,也可以不填充而只繪制其邊界。對多邊形可以使用不同顏色、線寬和線型繪制其邊框,還可以為區(qū)域的前向面和后向面設置不同的顯示屬性。填充圖案可以用一個為不同位置指定不同顏色的矩形顏色陣列來給出,即一個填充圖案可當作一個點陣來指定,其中每一位置指定一種顏色。描述填充圖案的矩陣是一個應用于顯示區(qū)域的掩模。有些圖形系統(tǒng)可以設置掩模的初始位置,從該初始位置開始,掩模在水平方向和垂直方向反復填充直到整個區(qū)域都填滿無重疊的掩模。這種用矩形圖案填充一個區(qū)域的處理稱為平鋪,而矩形填充圖案有時也稱為平鋪圖案。填充圖案的起始位置可設定在填充區(qū)內(nèi)的任意位置,有些軟件包將顯示窗口的坐標原點作為圖案的起始位置。第39頁,課件共65頁,創(chuàng)作于2023年2月用OpenGL繪制填充區(qū)繪線圖元時,用GL_LINE_LOOP參數(shù)可以繪制封閉的多邊形,得到的是線框圖,還可以用顏色對多邊形進行填充。最簡單的多邊形是三角形,下面的代碼繪制兩個三角形,并用當前顏色進行填充,如下圖。glBegin(GL_TRIANGLES)glVertex2f(0.0f,0.0f);//V0glVertex2f(25.0f,25.0f);//V1glVertex2f(50.0f,0.0f);//V2glVertex2f(-50.0f,0.0f);//V3glVertex2f(-75.0f,50.0f);//V4glVertex2f(-25.0f,0.0f);//V5glEnd;兩個使用GL_TRIANGLES繪制的三角形第40頁,課件共65頁,創(chuàng)作于2023年2月三角形的環(huán)繞方向上圖中標出了連接三角形頂點的邊線的箭頭,第一個三角形邊線的走向依次從V0到V1,然后再到V2,最后回到V0,這個路徑是由頂點的指定次序決定的,呈順時針方向排列,第二個三角形也呈順時針排列。頂點的指定次序以及排列方向稱為環(huán)繞(winding)。上圖中的三角形具有順時針方向的環(huán)繞,如果將左邊的三角形交換V4和V5的位置,就得到一個逆時針方向的環(huán)繞,如下圖。兩個具有不同環(huán)繞的三角形第41頁,課件共65頁,創(chuàng)作于2023年2月缺省情況下,OpenGL認為逆時針的環(huán)繞方向是多邊形的正面,因此上圖左側(cè)的三角形是這個三角形的正面,右側(cè)的三角形是那個三角形的背面。一個多邊形有兩個面,正面和背面,可以給正面和背面設定不同的顏色及其它屬性??梢哉{(diào)用函數(shù)glFlortFace(GL_CW)指定多邊形的正面和背面,參數(shù)GL_CW定義順時針環(huán)繞的多邊形為正面,參數(shù)GL_CCW定義逆時針環(huán)繞的多邊形為正面。三角條帶:對于許多表面和形狀,有時需要使用GL_TRIANGLE_STRIP圖元繪制一串相連的三角形。下圖顯示了一組由5個頂點構(gòu)成的3個三角形的繪制過程,可以看出,這些頂點并不是按照他們的指定順序遍歷的,原因是為了保持每個三角形的環(huán)繞方向一致。它的連接次序是V0、V1、V2,接著是V2、V1、V3,然后是V2、V3、V4,依此類推。三角條帶的環(huán)繞方向第42頁,課件共65頁,創(chuàng)作于2023年2月三角扇形:還可以使用參數(shù)GL_TRIANGLE_FAN來創(chuàng)建一組圍繞一個中心點的相連三角形,稱為三角扇形。下圖為由4個頂點所產(chǎn)生的包括3個三角形的三角扇形。在指定前3個頂點表示第一個三角形之后,后續(xù)的頂點和原點(V0)以及前面最近鄰的那個頂點(Vn-1)組成下一個三角形。有4個頂點構(gòu)成的三角扇形第43頁,課件共65頁,創(chuàng)作于2023年2月創(chuàng)建實心物體例3-6(TRIANGLE)使用兩個三角扇形創(chuàng)建一個實心的圓錐,第一個三角扇形圍成這個圓錐的側(cè)面,將圓錐的頂點作為第一個頂點,剩下的頂點沿z軸向下分布在圓錐底面的圓周上。第二個三角扇形圍成圓錐的底面,是一個圓,位于xy平面上。通過對三角形交替地著以綠色和紅色,可以清楚地顯示各個三角形。創(chuàng)建圓錐側(cè)面的代碼如下:glBegin(GL_TRIANGLE_FAN); glVertex3f(0.0f,0.0f,75.0f); for(angle=0.0f;angle<(2.0f*GL_PI);angle+=(GL_PI/8.0f)) { //Calculatexandypositionofthenextvertex x=50.0f*sin(angle); y=50.0f*cos(angle); //Alternatecolorbetweenredandgreen if((iPivot%2)==0) glColor3f(0.0f,1.0f,0.0f); else glColor3f(1.0f,0.0f,0.0f); //Incrementpivottochangecolornexttime iPivot++; //Specifythenextvertexforthetrianglefan glVertex2f(x,y); }glEnd();第44頁,課件共65頁,創(chuàng)作于2023年2月創(chuàng)建圓錐底面的代碼如下glBegin(GL_TRIANGLE_FAN);//CenteroffanisattheoriginglVertex2f(0.0f,0.0f);for(angle=0.0f;angle<(2.0f*GL_PI);angle+=(GL_PI/8.0f)){//Calculatexandypositionofthenextvertexx=50.0f*sin(angle);y=50.0f*cos(angle);
//Alternatecolorbetweenredandgreenif((iPivot%2)==0)glColor3f(0.0f,1.0f,0.0f);else glColor3f(1.0f,0.0f,0.0f);
//IncrementpivottochangecolornexttimeiPivot++;//SpecifythenextvertexforthetrianglefanglVertex2f(x,y);}//DonedrawingthefanthatcoversthebottomglEnd();可用右鍵彈出菜單第45頁,課件共65頁,創(chuàng)作于2023年2月設置多邊形的顏色上例中我們給多邊形設置了不同的顏色,顏色實際上是以頂點為單位指定的。而不是以多邊形為單位,最后一個頂點的顏色作為整個多邊形的填充顏色。代碼:glShadeModel(GL_FLAT);指定用當前顏色填充這個多邊形,代碼:if((iPivot%2)==0) glColor3f(0.0f,1.0f,0.0f);else glColor3f(1.0f,0.0f,0.0f);在指定下一個頂點前將當前顏色修改為紅色或綠色。第46頁,課件共65頁,創(chuàng)作于2023年2月3.6字符圖元圖形顯示中常包括文字信息,包括字母、數(shù)字或其他字符等。字體是指一組按照特定尺寸和格式的模板字符樣式。字體有兩種不同的表示方法,第一種稱為位圖字體(或光柵字體),每個字符都由一個二值形式的點陣圖案表示,如圖3.6a,由于所有字符都以完成掃描轉(zhuǎn)換,繪制一個字符只需將該字符的位圖直接映射或復制到幀緩存的指定位置,值為1的位對應的像素位置將用當前顏色進行顯示。盡管可以由一組點陣字符生成不同尺寸以及類似粗體、斜體等其它字體,但效果并不好。第二種表示方法稱為輪廓字體,又稱筆畫字體或向量字體。每個字符的外形輪廓均由直線和曲線段來描述,如圖3.6b,字符輪廓的內(nèi)部按填充區(qū)進行掃描轉(zhuǎn)換處理。與位圖字符相比,輪廓字體在進行放大時其字符形狀不會變形。第47頁,課件共65頁,創(chuàng)作于2023年2月第48頁,課件共65頁,創(chuàng)作于2023年2月OpenGL字符函數(shù)OpenGL基本庫僅為顯示單個字符和文字串提供基本支持。GLUT中預定義了一些字庫,可以顯示位圖和輪廓字體。調(diào)用函數(shù)glutBitmapCharacter(font,character)以當前光柵位置作為左下角顯示GLUT位圖字符。參數(shù)font用GLUT符號常量賦值,用來指定一特定字符集,參數(shù)character賦以ASCII碼或其它要顯示的字符。調(diào)用函數(shù)glutStrokeCharacter(font,character)顯示GLUT輪廓字符第49頁,課件共65頁,創(chuàng)作于2023年2月3.7反走樣在圖形光柵化的過程中由于圖元的坐標點離散化為整數(shù)像素位置,因此光柵化后生成的圖元具有鋸齒形或階梯狀的外觀。當我們把對象的連續(xù)表示(無限的分辨率)變換成對象的離散表示時,不可避免地會出現(xiàn)此類誤差,這種由于低頻采樣(不充分采樣)而造成的圖形失真稱為走樣(aliasing)。另一個不太引人注目的走樣現(xiàn)象是不同走向的線段具有不同的亮度,雖然所有線段都用同樣的顏色亮度來顯示,但一條斜線看上去要比一條水平或垂直線暗一些。這一現(xiàn)象的原因可由圖3.7.1解釋,圖中水平線上的像素間的距離為一個單位長度,而斜線上的像素間的距離大約為1.414個單位長度,密度上的帶來亮度感覺上的差異。如果一個物體沒有與像素柵格對齊,或者不能與像素柵格吻合,會出現(xiàn)籬柵問題。圖3.7.2(a)表示一道樁與樁之間的距離并非像素間距整數(shù)倍的籬柵。將該籬柵掃描轉(zhuǎn)換后樁的端點都要向像素位置靠攏對齊,結(jié)果是樁之間的距離不再均勻相等圖3.7.2(b)。此現(xiàn)象有時稱為局部走樣,這時籬柵的總長度基本上是正確的。若要保持樁距均勻,籬柵的總長度就會明顯失真圖3.7.2(c),這一現(xiàn)象有時稱為總體走樣。第50頁,課件共65頁,創(chuàng)作于2023年2月反走樣盡管數(shù)學上的線段只有長度沒有寬度,但光柵化后的線段為了可見性,必須有一個寬度,幀緩存以像素為最小單位,若一條理想的線段在幀緩存里的寬度為一個像素,當仔細觀察理想的一個像素寬的直線時,會發(fā)現(xiàn)該線段只是部分覆蓋了1像素大小的方形區(qū)域,如圖3.7.3。第51頁,課件共65頁,創(chuàng)作于2023年2月第52頁,課件共65頁,創(chuàng)作于2023年2月反走樣提高顯示器的分辨率只能減輕而不能消除鋸齒問題。第53頁,課件共65頁,創(chuàng)作于2023年2月反走樣對于能顯示兩級以上亮度的光柵系統(tǒng),可以采用反走樣方法適當?shù)匦薷难貓D元邊界的像素亮度,平滑邊界,減小鋸齒狀、斑塊狀的亮度差異,改善顯示效果。一種簡單、直接的反走樣方法,就是把屏幕看成由比實際更細的網(wǎng)格所覆蓋,從而增加采樣頻率,然后根據(jù)這種更細網(wǎng)格,使用采樣點來確定每個屏幕像素的合適亮度。這種在高分辨率下對對象進行采樣并在較低分辨率上顯示其結(jié)果的技術(shù)稱為過采樣(supersampling),也稱為后濾波(postfiltering)。另一種方法是通過計算待顯示的每個像素在對象上的覆蓋區(qū)域來確定像素的亮度。計算覆蓋區(qū)域的反走樣稱為區(qū)域采樣(areasampling),也稱為前濾波(prefiltering)。還可以通過移動像素區(qū)域的顯示位置而實現(xiàn)反走樣,這種技術(shù)稱為像素移相(pixelphasing)。第54頁,課件共65頁,創(chuàng)作于2023年2月前濾波與后濾波濾波的概念來源于信號處理領(lǐng)域。若將亮度作為信號,則顏色均勻的、亮度緩慢變化的區(qū)域?qū)诘皖l部分,具有邊界清晰的、亮度快速變化的區(qū)域?qū)诟哳l部分。為了減少圖像空間里的線段與其它線段的參差不齊現(xiàn)象,希望將亮度的突然變化“抹平”,從信號處理角度來看,就是將高頻率的成分“過濾掉”。前濾波就是在采樣前對原始連續(xù)信號進行處理直接獲取各個像素應有的亮度(在采樣之前進行濾波)。后濾波則首先從原始連續(xù)信號獲取離散采樣值,然后再用這些采樣值計算像素值(在采樣之后進行濾波)。第55頁,課件共65頁,創(chuàng)作于2023年2月區(qū)域采樣區(qū)域采樣屬于前濾波技術(shù),把一個柵格網(wǎng)疊放在需要柵格化的物體上,對于每一個與該物體相疊交的像素區(qū)域,計算該區(qū)域與物體疊交的百分比。該百分比決定了該像素的總體顏色中有多少成分來源于該物體,該像素區(qū)域與物體疊交的百分比越高,該物體對像素總體顏色的影響就越大。圖3.7.4a中用寬度為1個像素的長方形區(qū)域來代表一條直線,該長方形區(qū)域與每個與其疊交的像素的面積百分比通過解析方式算出。如果背景為黑色,直線為白色,計算所得的百分比可直接用來設定各像素的顏色(圖3.7.4b)。第56頁,課件共65頁,創(chuàng)作于2023年2月雖然圖3.7.4b所示經(jīng)過區(qū)域采樣得到的直線的離散逼近看起來有些“模糊”,但它不再有從物體顏色到背景顏色之間的突然過渡。而這種突然過渡是使
溫馨提示
- 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年個人投資合同標準版本(三篇)
- 2025年二年級語文教師個人工作小結(jié)(3篇)
- 2025年五年級班主任期末工作總結(jié)范例(二篇)
- 2025年個人租車給公司合同協(xié)議(2篇)
- 2025年產(chǎn)業(yè)技術(shù)合作協(xié)議經(jīng)典版(三篇)
- 產(chǎn)業(yè)園辦公區(qū)設計合同
- 書法教室裝修合作協(xié)議范本
- 住宅精裝修水電施工合同
- 水泥運輸車輛調(diào)度協(xié)議
- 廠房改造工程勞務協(xié)議
- 新員工入職通識考試(中軟國際)
- 四星級酒店工程樣板房裝修施工匯報
- 圓翳內(nèi)障病(老年性白內(nèi)障)中醫(yī)診療方案
- 博士后進站申請書博士后進站申請書八篇
- 華為攜手深圳國際會展中心創(chuàng)建世界一流展館
- 2023版思想道德與法治專題2 領(lǐng)悟人生真諦 把握人生方向 第3講 創(chuàng)造有意義的人生
- 全過程工程咨詢服務技術(shù)方案
- GB/T 41509-2022綠色制造干式切削工藝性能評價規(guī)范
- 土木工程畢業(yè)設計(論文)-五層宿舍樓建筑結(jié)構(gòu)設計
- 青年卒中 幻燈
- 典型倒閘操作票
評論
0/150
提交評論