計算機圖形學筆記_第1頁
計算機圖形學筆記_第2頁
計算機圖形學筆記_第3頁
計算機圖形學筆記_第4頁
計算機圖形學筆記_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機圖形學筆記一 圖形系統(tǒng)基礎概念坐標系統(tǒng): 在圖形學中通常包括以下幾種笛卡爾坐標系: a 建模坐標系(局部坐標系) b 世界坐標系 c 觀察坐標系 (攝像機坐標系) d 設備坐標系(屏幕坐標系). 在構建一個場景的過程如下,先場景中每個對象的各自的建模坐標系(局部坐標系)中構建沖該對象的幾何形狀, 比如桌子和樹木,在3d虛擬世界每個物體都有自己的坐標系-自己的原點和坐標軸。對象與子對象之間和可能存在嵌套坐標系(父子關系),比如左眼睛在(-100,400,0), 右眼(100,400,0) 鼻子(0,300, 0) 嘴巴 (0, 100, 0) 他們的位置是對于父對象臉的建模坐標系來,而他們

2、自己也擁有各自的坐標系。 一旦指定完成每個對象的形狀,我們就將其放入成為世界坐標系的場景參照坐標系的適當位置上。 在建模坐標系和世界坐標系可以用任何浮點數(shù)和整數(shù)數(shù)值來描述,而不用受到設備的約束; 在搞好場景所有部分后,需要確定場景中那些物體需要顯示出來,這就需要建立觀察坐標系來確定觀察者(攝像機)的位置和觀察范圍,和場景中的物體在觀察坐標系中的位置。 確立以后,在通過二維投影映射到設備坐標系上,完成由虛擬場景到顯示器2維屏幕的顯示。圖形輸出原語(graphics output primitive) :圖形的基本構造塊,是最基本的圖形元素;包括字符串和幾何成分,如點/直線/曲線/填充區(qū)域(通常為

3、多邊形)以及由色彩陣列定義的形狀。簡稱圖元, 描述幾何要素的圖元一般稱為幾何圖元.二 輸出光柵圖元的相關的算法畫線算法:線段是由在坐標系中的兩頭端點(頂點)來確定的,要在光柵顯示器上顯示線段,圖形系統(tǒng)必須把兩端點的整數(shù)投影到整數(shù)屏幕坐標,并確定兩端點間直線路徑最近的像素的位置,接下來將顏色值裝入幀緩沖區(qū)內的對應像素的地址.。 視頻控制器從幀緩沖區(qū)讀出寫入的顏色值并繪制在對應屏幕坐標的像素單元上。這一過程是將一線段的數(shù)字化為離散的整數(shù)位置。但光柵線段特有的階梯現(xiàn)象在低分辨率系統(tǒng)中特別容易看出來,成鋸齒形,如下圖。yxO      

4、60;  直線方程: y=kx + b 截距式方程 斜率:k=(y1-y0)/(x1-x0) 截距: b=y0 kx0在光柵系統(tǒng)中,通過像素繪制直線,水平和垂直方向的步長都受到像素間距的現(xiàn)在。也就是說必須在離散的位置上對直線進行采樣,并且在每個采樣位置上確定距離直線最近的像素,如下圖。對于任意沿著直線方向給定的x的增量x,可以從下面公式計算對于y的增量y y = k * x 同樣 x = y/ kY1Y0X0X1DDA算法(Digital Differential Analyzer) 在坐標軸上一單位間隔對線段進行取樣,從而確定坐標軸上里線段路徑最近的整數(shù)值。 首先考慮斜率

5、k, 如果k小于1, 則在x軸按x=1進行取樣,逐個計算對應的每一個y值 yi+1 = yi+m, i為整數(shù), 計算出來的y值通過四舍五入取得整數(shù)y;而對于k>1時,則交換x和y的位置, xi+1 = xi + 1/k 此時每個計算出的x值要按y掃描線四舍五入到最近的像素位置。 上述是按左端點到右端點的假設,如果從右向左則相反,由加變減號。DDA算法的優(yōu)點是快, 利用光柵特效消除了直線方程中的乘法,但取整的誤差的累積使得較長線段所計算的像素偏離實際線段,而取整和迭代浮點運算仍然十分耗時。Bresenham 畫線算法一種精確有效光柵線生成算法,是為了“顯示器(屏幕或打印機)系由像素構成”的

6、這個特性而設計出來的算法,使得在求直線各點的過程中全部以整數(shù)來運算,因而大幅度提升計算速度。 另外Bresenham還可以用于顯示圓形和其它曲線。原理是以過各行、各列像素中心構造一組虛擬網(wǎng)格線,按直線從起點到終點的順序計算直線各垂直網(wǎng)格線的交點,然后確定該列像素中與此交點最近的像素。 該算法的優(yōu)點在于可以采用增量計算,使得對于每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素詳細推導過程: 以斜率小于1為例子,沿著線路徑的像素位置以單位x為間隔(為1個像素距離)來確定。 從最左端點(x0, y0) 開始,逐步處理后繼列(x的位置),并在屏幕上y值最接近線段的那一個像素上繪制出一點。如果

7、要顯示的像素在(xi,yi), 那么下一步需要確定在列xi+1 =xi + 1上繪制像素,始終(xi+1,yi),還是(xi+1, yi+1),在位置xi+1,我們使用dlower和dupper來標識兩個像素與數(shù)學上線路徑的垂直偏移,在像素xi+1處直線y實際坐標可計算為:y=k * (xi+1) + b dlower = y yi = k (xi + 1) + b yi;dupper = (yi + 1) y = yi + 1 - k (xi + 1) bdlowerdupperyxoyiyi+1xi + 1要確定兩個像素哪個更接近線路徑,需要測試這兩個像素偏移的差值。dlower dupp

8、er = 2k(xi + 1) 2yi +2b 1通過第i步的決策參數(shù)的pi, 從而只是用整數(shù)進行計算,設y和x分別是兩線段兩端點的垂直和水平增量,斜率k=y/x, 那么決策參數(shù)Pi: pi = x * (dlower dupper)將dupper dlower k 代入得,pi= 2y*xi 2x*yi+c, pi的符號與dlower dupper相同(因為例子中x>0), 參數(shù)c也是常量,c=2y + x(2b-1),而且會在循環(huán)計算Pi時被消除, 加入Yi處像素Yi+1處更接近線段(dlower < dupper),那么Pi是負的,此時繪制上面的像素,反之繪制下面的。直線上坐

9、標會沿著x或y的單位長度(1個像素)的距離變化,因此可以利用遞增整數(shù)運算得到后繼的決策參數(shù): pi+1= 2y*xi+1 2x*yi+1+cPi+1 pi = 2y (xi+1 - xi) 2x (yi+1 -yi) 又因為xi+1 = xi + 1 所以pi+1 = pi + 2y 2x(yi+1 - yi) ,其中yi+1 yi 為0或為1 ,取決于pi的符號。 決策參數(shù)的遞歸運算從線段的坐標端點開始每個整數(shù)x位置進行,起始像素位置(x0,y0)的第一個參數(shù)p0通過等式pi= 2y*xi 2x*yi+c獲得 p0 = 2y x當|k<1|時的Bresenham畫線算法1. 輸入線段的

10、兩個端點,并將左端點存儲在(x0,y0)中;2. 將(x0,y0)裝入幀緩存,畫出第一個點;3. 計算常量x,y 和 2y x,得到?jīng)Q策參數(shù)的第一個值p0 = 2y x;4. 從i=0,開始,在沿著路徑的每個xi處,進行下列檢測:如果pi < 0, 下一個要繪制的點是(xi + 1, yi) 并且pi+1 = pi + 2y 否則下一個要繪制的點數(shù)(xi + 1, yi + 1),并且pi+1 = pi +2y -2x5. 重復步驟4,共x-1次.并行畫線算法如有多個處理器,可將線段計算分割給每個處理器來運算。 給定n個處理器,那么可以把線段分割為n個子線段,并在每個子線段進行Brese

11、nham畫線算法。對于0<k<1且左端點位置為(x0,y0)的線段,我們沿著x訪問對線段進行分割。相鄰線段的起始x位置間距離可以寄計算為xp = (x + n 1)/n (考慮到x=1這種為單位長度的分配任務情況),從1開始編號的話,那么第i分段的起始x坐標等于 xi = x0 + xp * (i-1)。為了將Bresenham算法用于各個分段,必須得到各個分段x與y的增量yp xp ; yp = k * xp 第i分段起始y坐標yi = y0 + round( (n - 1) *yp );那么第i分段的決策參數(shù)pi 可以推出 (n-1)xp * (2y) round( (n -

12、1) *yp )(2x) + 2y-x圓生成算法圓的特性圓可以定義為所有距離中心點(xc,yc)同等距離R的點的集合,這個距離關系可以用勾股定理得到(y-yc)2 + (x-xc)2 = r2 但這并非生成圓最好的方法,因為這個方法每一步都包含大量的運算. 另一種方法是使用極坐標,來計算圓周的點,以參數(shù)極坐標形式表示圓的方程X = xc + r* cosy = yc + r * sin 但上述方法三角函數(shù)的計算十分耗時, 利用圓的對稱性可以減少計算量。 可以將圓化為4份或8分,利用方程確定圓周上的像素位置,仍然需要大量計算時間。更有效的方法是如同Bresenham畫線算法一樣通過決策參數(shù)的增量

13、計算為基礎,這樣的話僅僅需要整數(shù)運算。中點畫圓算法如同光柵畫線算法,我們在每個以單位間隔(1像素)取樣,并確定離指定圓最近的像素位置。 對于給定半徑r和中心(xc,yc),從而把計算出的每個位置(x,y)移動到合適的屏幕位置。 可以在八分圓的正x方向取單位步長,并用決策參數(shù)來確定每一步兩個可能y的位置,哪個更接近于圓的位置。然后通過對稱性來得到剩下7分圓。定義圓的函數(shù)fcirc(x,y) = x2 + y2 r2, 半徑為r的任意一點(x,y) 滿足方程fcirc(x,y) = 0; 如果點在圓內,圓函數(shù)為小于0; 如果點在圓外,圓函數(shù)大于0;在給出取樣位置xk+1上兩個候選像素間的中點,假設

14、剛在(xk,yk)上繪制了一個像素,下一步需要確定的是像素位置(xk+1,yk)還是(xk+1,yk-1)更接近于圓。我們的決策參數(shù)是通過圓函數(shù)方程在這兩個像素的中點求值而得到的:pk = fcirc(xk+1,yk-1/2),如果pk<0,那么這個點位于圓內,yk 更接近于圓邊界。否則,中點位于圓外或圓邊界上,我們選擇yk-1.后續(xù)的決策參數(shù)可以使用增量運算得到.Pk+1 = fcirc (xk+1 +1, yk+1 -1/2) = (xk+1)+12 + (yk+1 1/2)2 r2 = pk + 2(xk + 1) + ( yk+12 yk2) (yk+1 yk) + 1 其中yk

15、+1 是yk 或 yk -1, 取決于pk的符號pkykYk-1XkXk+1如果pk<0 說明,中點在圓內,yk+1=yk,否則在圓外,yk+1=yk - 1增量dp = Pk+1 pk = 2(xk + 1) + (yk+12 yk2) (yk+1 yk) + 1Pk+1 = pk + dp又因為yk+1 等于yk 或者 yk-1 取決于pk的符號, 代入求得增量 dp=2xk + 3=2xk+1 + 1 (yk+1 = yk時)或 dp = 2xk+1 + 1 2yk+1 (yk+1 = yk- 1 時)在起始位置(0, r)處,這兩項的值是0和2r, 2xk+1 每個后續(xù)值都可以通

16、過前一個值加2得到, 2yk+1同理.P0 = fcirc (1, r-1/2) = 1+ (r -1/2)2 r2 或 p0 = 5/4 r假如將半徑指定為整數(shù),就可以對p0進行簡單的取整:P0 = 1-r,因為所有增量都是整數(shù)中點畫圓法的步驟1 輸入圓的半徑r和圓心(x,y), 并得到圓周(圓心在原點)上的一個點;2計算決策參數(shù)的初始值 p0 = 5/4 r;3在每個xk位置, 從k=0開始,完成下列測試:假如Pk < 0 ,圓心在(0,0)的圓的下一個點為(xk+1, yk); 并且pk+1 = pk + 2xk+1 + 1, 否則下一個點是(xk+1, yk-1), pk+1 =

17、 pk + 2xk+1 + 1 -2yk+1 其中2xk+1 = 2xk + 2 , 2yk+1 =2yk -24 確定在其他7個8分圓的對稱點。5 將每個計算出的像素位置(x,y)移動到圓心在(xc,yc)的圓路徑上,并畫坐標值: x = x+xc , y = y+yc6 重復步驟3到步驟5,直到x>= yo橢圓生成算法橢圓的特征 如果一個平面切截一個圓錐面, ,且不與它的底面相交,也不與它的底面平行,則圓錐和平面交截線是個橢圓.穿過兩焦點并終止于橢圓上的線段 AB 叫做長軸。長軸是通過連接橢圓上的兩個點所能獲得的最長線段。穿過中心(兩焦點的連線的中點)垂直于長軸并且終止于橢

18、圓的線段 CD 叫做短軸。半長軸(圖中指示為 a)是長軸的一半:從中心通過一個焦點到橢圓的邊緣的線段。類似的,半短軸(圖中指示為 b)是短軸的一半。離心率橢圓的形狀可以用叫做橢圓的離心率的一個數(shù)來表達,習慣上指示為 。離心率是小于 1 大于等于 0 的正數(shù)。離心率 0 表示著兩個焦點重合而這個橢圓是圓。對于有半長軸 a 和半短軸 b 的橢圓,離心率是.離心率越大,a 與 b 的比率就越大,因此橢圓被更加拉長。半焦距c 等于從中心到任一焦點的距離,則.距離 c 叫做橢

19、圓的線性離心率。在兩個焦點間的距離是 2a。橢圓上任意一點到橢圓的兩個焦點的距離之和都等于一個常數(shù), 橢圓上任意一點P(x,y)到兩個焦點的距離d1,d2, 那么d1+d2 = 常數(shù).可得橢圓方程x-x12+y-y12+x-x22+y-y22=常數(shù)對方程求平方,去除剩余的根,再平方,可得橢圓一般式方程 Ax2+By2+Cxy+Dx+Ey+F=0, 其中系數(shù)A,B,C,D,E,F可以依據(jù)焦點坐標和長軸和短軸的尺寸求得在任意方向指定一個橢圓的交互方式是輸入橢圓的兩個焦點和橢圓邊界上的一點,利用這三個坐標,可以求出常數(shù),然后可以再求出一般式中的系數(shù),并利用方程生成沿途像素如果短軸和長軸按坐標軸x,y

20、軸方向分別平行,那么橢圓方程可以大大簡化。可改寫為x-xc2rx+y-yc2ry=1oxyycxcryrx利用極坐標r和,也可以按照參數(shù)方程的形式來描述標準位置的橢圓X=xc+ rxcosy=yc+ rysinr稱為包圍半徑,是包圍這個橢圓的圓的半徑,稱為橢圓離心角和圓的算法一樣,利用其對稱性可以減少計算量。 標準位置橢圓在四分象限是對稱,和圓不一樣,圓可以在八分象限對稱。中點橢圓算法中心點畫圓法將第一象限分為兩部分, 斜率絕對值小于1和大于1, 在斜率絕對值小于1的區(qū)域內x方向取單位步長,斜率絕對值大于1的區(qū)域內以y方向取單位步長。區(qū)域1和區(qū)域2可以通過多種方法進行處理??梢詮奈恢?0,ry

21、)開始,在第一象限內沿橢圓路徑順時針步進;當斜率小于-1將x方向的單位步長專為y方向的單位步長。反過來,也可以從(rx,0)開始,以逆時針方式取得點和上面剛好相反。利用并行處理器可以同時計算兩個區(qū)域類的像素位置。作為中心橢圓算法的串行實現(xiàn),則以(0,ry)為起點,在第一象限順時針沿橢圓路徑前進xyryrx區(qū)域1區(qū)域2斜率=-1去(xc,yc)=(0,0) 定義橢圓函數(shù)為felipsex,y=ry2x2+rx2y2-rx2ry2 felipsex,y<0 (x,y)在橢圓邊界內 ;felipsex,y>0 (x,y)在橢圓邊界外 ; felipsex,y = 0 (x,y)在橢圓邊界

22、上 ,因此用橢圓felipsex,y的中點做決策參數(shù),在每個位置取樣,根據(jù)橢圓函數(shù)沿橢圓軌跡對兩個候選像素間中點求值來確定一下個像素.從(0, ry)開始,在x方向取單位步長直到區(qū)域1和區(qū)域2之間的分界處,然后轉為y方向的單位步長再覆蓋第一象限的剩余曲線段. 每一步都需檢查曲線斜率值。K=dy/dx = -2ry2x2rx2y ,在區(qū)域1和區(qū)域2的交界處,在區(qū)域1和區(qū)域2的交界處,dy/dx = -1 且 2ry2x=2rx2y ;因此移除區(qū)域1的條件是2ry2x 2rx2y那么區(qū)域1的決策參數(shù)p1k=felipsexk+1,yk-12= ry2(xk+1)2+rx2(yk-12)2-rx2r

23、y2 如果p1k<0 那么中點在橢圓內,yk上的像素更接近于橢圓邊界。 否則,中點在橢圓外或橢圓邊傻瓜,yk上像素應該在yk-1上下一個取樣位置(xk+1+1=xk+2), p1k+1=felipsexk+1+1,yk+1-12=ry2(xk+1)+1)2+rx2(yk+1-12)2-rx2ry2 其中yk+1根據(jù)p1k的符號取值為yk或yk-1通過上面可以算出決策參數(shù)的增量dp = p1k+1-p1k = 2ry2xk+1+ry2 或者 = 2ry2xk+1+ry2 -2rx2yk+1p10=felipse 1,ry-12=ry2+rx2(ry-12)2-rx2ry2或=ry2-rx2

24、ry+1/4rx2 ykYk-1XkXk+1Xk+2中點pk中點pk+1區(qū)域2變成以y為單位步進,p2k=felipse(xk+12,yk-1), 推導過程同理中心橢圓算法步驟1 輸入rx,ry和橢圓中心(xc,yc), 并得到橢圓(中心在原點上)的第一個點(x0,y0) = (0, ry)2 計算區(qū)域1中決策參數(shù)的初始值p10=ry2-rx2ry+14rx23 計算區(qū)域1中每個xk的位置,從k =0開始, 完成下列測試; 如果p1k<0,沿中心在(0,0)的橢圓的下一點為(xk+1,yk),并且p1k+1=p1k+2ry2xk+1+ry2 否則下一個點為(xk+1,yk-1)并且p1k

25、+1=p1k+2ry2xk+1-2rx2yk+1+ry2 直到2ry2x2rx2y4使用區(qū)域1中計算最后的點(x0,y0)來計算區(qū)域2中的參數(shù)的初始值p20=ry2(x0+12)2+rx2(y0-1)2-rx2ry25 在區(qū)域2的每個yk位置處,從k=0 開始,完成下列測試: 假如p2k>0 ,沿中心,在(0,0)的橢圓的下一個點為(xk,yk-1),并且p2k+1=p2k-2rx2yk+1+rx2 假如p2k0,沿中心,在(0,0)的橢圓的下一個點為(xk+1,yk-1) 并且p2k+1=p2k-2rx2yk+1+2ry2xk+1+rx2 使用與區(qū)域1中相同的x,y增量進行計算,直到y(tǒng)

26、= 06 確定其他三個象限的對稱點7 劃撥給計算出的每個像素位置(x,y)移到中心在(xc,yc)的橢圓軌跡上,按坐標軸繪制點x = x +xc, y=y+yc其他曲線方法類似圓和橢圓的繪制算法多邊形填充區(qū)數(shù)學上定義為三個或更多頂點坐標位置描述的平面圖形;是平面的封閉、由有限線段(大于2)組成,且首尾連接起來劃出的形狀。多邊形的分類凸多邊形:多邊形的內角均小于180度,那么該多邊形為凸多邊形,凸多邊形的一個等價定義是它的內部完全在它任意一便及其延長線的一側。凹多邊形: 一個非凸的多邊形被稱作凹多邊形2 或凹角.3 凹多邊形至少有一個內角大于180度.退化多邊形:共線或重疊坐

27、標位置的頂點集;可能有多余線段,重疊邊,或者長度為0的邊。識別凹多邊形凹多邊形至少有一個內角大于180度,如果為每一條邊建立一個向量,則可以使用相鄰邊的叉積來測試凹凸性。凸多邊形的所有向量叉積均同號。如果某些叉積取正值,某些為負,那么可以斷定為凹多邊形。V1V2V3V3V4V5E1E2E3E4E5E6XY(E1 x E2) > 0(E2 x E3) > 0(E3 x E4) > 0(E4 x E5) > 0(E5 x E6) > 0(E6 x E1) > 0凹多邊形分割凸多邊形向量法通過順序計算各個連續(xù)邊向量的叉積,如果有些叉積的z分量為正,一些為負。 那么

28、可延叉積中第一邊向量執(zhí)行進行切割。EK = VK+1 - VKE1E2E3E4E5E6V1V2V3V4V5V6旋轉法1、對多邊形的一個頂點Vi,平移多邊形使Vi位于坐標原點;2、繞原點旋轉多邊形,使Vi+1落在X軸的正半軸上;3、檢查第i+2個頂點y坐標分量的符號。如果符號為正或零,那么多邊形在該邊處是凸的;反之,則是凹的。分割多邊形。4、分割多邊形的時候,檢查第i+2個頂點后面的各頂點的y坐標分量,直至發(fā)現(xiàn)一個頂點的y坐標分量大于或等于零。這個頂點在x軸的上方,或恰好落在x軸上,記為Vi+j。那么,分割下來的多邊形為Vi+1Vi+2.Vi+jVi,剩下的多邊形為ViVi+1Vi+j.Vi。5

29、、多分割的多邊形再次使用該算法,直到它們都為凸多邊形。 這個算法也可以以一邊為參考,判斷其他頂點在這一邊的方向(左、右)來確定多邊形的凹凸性;分割多邊形時步驟1、以多邊形的一邊AB為參考,判斷其他點在AB的那一邊,直到一點反向(比如這一點為點C),然后連接BC對多邊形進行分割;2、再根據(jù)此算法對分割出來的多邊形繼續(xù)進行分割。內 外測試不自交的多邊形:多邊形僅在頂點處連接,而在平面內沒有其他公共點,此時可以直接劃分內-外部分。    自相交的多邊形:多邊形在平面內除頂點外還有其他公共點,此時劃分內-外部分需要采用以下的方法。  

30、;  (1)奇-偶規(guī)則(Odd-even Rule):奇數(shù)表示在多邊形內,偶數(shù)表示在多邊形外    從任意位置p作一條射線,若與該射線相交的多邊形邊的數(shù)目為奇數(shù),則p是多邊形內部點,否則是外部點。    (2)非零環(huán)繞數(shù)規(guī)則(Nonzero Winding Number Rule):若環(huán)繞數(shù)為0表示在多邊形內,非零表示在多邊形外    首先使多邊形的邊變?yōu)槭噶俊h(huán)繞數(shù)初始化為零。再從任意位置p作一條射線。當從p點沿射線方向移動時,對在每個方向上穿過射線的邊計數(shù),每當多邊形的

31、邊從右到左穿過射線時,環(huán)繞數(shù)加1,從左到右時,環(huán)繞數(shù)減1。處理完多邊形的所有相關邊之后,若環(huán)繞數(shù)為非零,則p為內部點,否則,p是外部點。判斷點p是否在多邊形內,從點p向外做一條射線(可以任意方向),多邊形的邊從左到右經(jīng)過射線時環(huán)數(shù)減1,多邊形的邊從右往左經(jīng)過射線時環(huán)數(shù)加1,最后環(huán)數(shù)不為0,即表示在多邊形內部。當然,非零繞數(shù)規(guī)則和奇偶規(guī)則會判斷出現(xiàn)矛盾的情況,如下圖所示,左側表示用 奇偶規(guī)則判斷繞環(huán)數(shù)為2 ,表示在多邊形外,所以沒有填充。右側圖用非零繞環(huán)規(guī)則判斷出繞數(shù)為2,非0表示在多邊形內部,所以填充。另外一個例子,如下平面方程這個方程是法向量(垂直與這個平面)和一個在這個平面已知的

32、點在3D空間中定義的。假設平面的法向量,還有在這個平面上已知的點P1 和在這個平面上的任意一點P Graph of a plane in 3D我們可以在平面上定義一個向量連接P1到P, ,由于向量和法向量相互垂直,所以點積的結果因該為0這個向量與法向量的點積在平面上成為這個的平面的方程,通過計算點積,我們得到如果我們替換常數(shù)項 ,那么平面方程可以簡化平面與原點的距離如果法向量歸一化,那么平面方程的常數(shù)項d將成為與原點的距離 Plane with unit normal如果單位法向量(a1,b1,c1)和點P1(Da1,Db1,Dc1)在平面上,D將成為與原點的距離

33、。為了展示距離D是方程的常數(shù)項,這個平面方程可以用單位向量和點來改寫。 因此,我們用(歸一化的)法向量的長度來確定原點與標準平面方程的距離,例如原點與下面用法向量(1,2,2)的平面方程的距離是2平面與點的距離從點P2到平面最短距離可以被計算為兩個向量 和 的點積,然后投影向量 到這個平面的法向量  ,通過下圖可以看出 Distance between Plane and Point那個平面方程 和一個點P2的距離D:將上面方程的分子部分 擴展開最終,將它代入前面的方程求得距離公式看起來像是插入點P2到平面方程除以

34、法向量的長度,例如點 (-1, -2, -3) 到平面x + 2y + 2z - 6 = 0 的距離等于注意的是這個距離是有符號的,可以為負值,它用以點的方向,例如:如果距離是正值,這個點與法向量的指向在同一面,如果為負值,意味著這個點在另外一面基本圖形管線如上圖OpenGL的圖形管線客戶端與服務器設計模式:客戶端的與服務器的那邊分離,在OpenGL中客戶端的代碼存在于執(zhí)行的應用程序中主CPU的內存中,或者在是主系統(tǒng)內存中的驅動程序,驅動將組合/渲染命令和數(shù)據(jù)發(fā)送到服務器端去執(zhí)行;而服務器實際上是圖形卡上的硬件和內存。 客戶端和服務器兩者異步獨立執(zhí)行,這樣才能達到

35、最大的效能??蛻舳搜b配塊數(shù)據(jù)和命令到緩存中,然后發(fā)送給服務器;服務器處理緩存中的這些內容。如果客戶端同一時刻準備將下一次渲染的數(shù)據(jù)位和信息發(fā)送,或者服務器處理完等待客戶端,或者客戶端等待服務返回數(shù)據(jù)和命令;這種情況叫管線停滯,管線停滯會影響程序的性能Shader圖形處理的基礎執(zhí)行單元, 著色器程序Vertex shader: 處理來自客戶端的信息,并對它們進行幾何轉換/光照計算/置換/色彩值。Fragment shader 對于已經(jīng)裝備好的圖元的片段,F(xiàn)ragmentShader將圖元分解為一系列像素單元的大小的片段,并對其進行顏色填充。 Shader傳輸?shù)娜N基本數(shù)據(jù)Attributes 屬

36、性:每個頂點都可改變的數(shù)據(jù)元素,例如頂點的位置,opengl中它存儲在一個有四個分量的向量中,x,y,z 三個坐標信息,還有一個分量W. 其它的屬性還有紋理坐標,色彩值,表面法線。 屬性是客戶端存儲在本地內存中的緩存指針在圖形設備上的拷貝。 屬性只應用在Vertex Shader上。Openg可以支持16個通用屬性,從0到15編號屬性名 描述GLT_ATTRIBUTE_VERTEX 頂點位置的三分量(x,y,z)GLT_ATTRIBUTE_COLOR 顏色分量(r,g,b,a)GLT_ATTRIBUTE_NORMAL 表面法線的三個分量(x,y,z)GLT_ATTRIBUTE_TEXTURE0

37、 紋理坐標的主分量 (s, t) GLT_ATTRIBUTE_TEXTURE1 紋理坐標的第二分量(s, t)Uniforms 一組的值, Uniforms最普遍的應用是在VertexShader中設置矩陣的變換,可以是標量或向量類型。Texture紋理 : 紋理信息Outs : shader之間輸入輸出的變量幾何轉換Transformation簡單中的幾種變換視圖View : 其實上就是變換觀察者或者攝像機的位置模型Modeling : 在場景中移動,旋轉, 縮放物體模型視圖ModelView: 描述視圖和模型的對偶像, 視圖和模型變換其實是一致的,模型視圖將其進行合并投影:Projecti

38、on 改變可視區(qū)域的大小和形狀,將3D空間轉換為2d平面視口Viewport : 實際上是一種偽變換,對窗口的輸出進行縮放幾何轉換過程:將原始的頂點數(shù)據(jù)1X4的矩陣x,y,z和縮放因子w, 然后將其與模型視圖矩陣相乘,經(jīng)過視圖模型變換后的視覺坐標(對于觀察者和攝像機而言)。然后將這個視覺坐標與投影矩陣相乘,產(chǎn)生剪裁坐標,這樣就消除了所有可視區(qū)域之外的所有數(shù)據(jù),這個剪裁坐標可隨后除以w,產(chǎn)生規(guī)范化的設備坐標。W值可能會被投影矩陣和視圖矩陣所修改,具體取決與頂點發(fā)生的變換。幾何數(shù)據(jù)頂點位置,和標準向量(normal vectors),在OpenGL 管道raterization 處理過程之前可通過

39、頂點操作(Vertex Operation)和基本組合操作改變這些數(shù)據(jù)。模型坐標Object Coordinates對象的本地坐標系任何變換之前的最初位置.為了變換(transformation)這些對象,可以調用glRotate(),glTranslatef(),glScalef()這些方法。視覺坐標Eye Coordinates使用GL_MODELVIEW矩陣和Object 坐標相乘所得。在OpenGL中用GL_MODELVIEW將對象對象空間(Object Space)變換到視覺空間(eye space)。GL_MODELVIEW矩陣是模型矩陣(Model Matrix)和視覺矩陣(Vi

40、ew Matrix)的組合 ()。其中,Model 變換指的是將對象空間轉換到世界空間(世界空間指的是OpenGL中的三維空間),而View 變換是將世界空間變換到視覺空間注意:在OpenGL中沒有單獨的攝像機/視圖矩陣。因此,為了模擬攝像機或者視圖的變換,其中的場景(3D物體和光照)必須通過和視圖相反的方向變換。也就是說,OpenGL總是將攝像機定義在(0,0,0)點,并且強制在視覺空間的-Z軸方向,而且不能變換。法向量(Normal vectors)從對象坐標系(Object coordinates)變換到視覺坐標系(eye coordinates),它是用來計算光照(light

41、ing calculation)的.注意標準向量(Normal vectors)的變換和頂點的不同。其中視覺矩陣(view matrix)是GL_MODELVIEW逆矩陣的轉置矩陣和標準向量(Normal vector是)相乘所得,即:更多關于標準向量變換(Normal Vector Transformation)的資料可連接到此處: 剪裁坐標系(Clip Coordinates)視覺坐標系和GL_PROJECTION矩陣相乘,得到剪切面坐標系。GL_PROJECTION矩陣定義了可視的空間(截頭錐體)(譯注:關于什么是截頭錐體,我還查了下資料,發(fā)現(xiàn)它是這個樣子的:,這個就是投影的效果啦)以及

42、頂點數(shù)據(jù)如何投影到屏幕上(視角或者正交化(orthogonal)),它被稱為剪切面坐標系的原因是(x,y,z)變換之后要和±w比較。標準化設備坐標系(NDC)將剪切面坐標系除以w所得.它更像是窗口坐標系,只是還沒有轉換或者縮小到屏幕像素。其中它取值范圍在3個軸向從-1到1標準化了。窗口坐標系(Window Coordinates)/屏幕坐標系(Screen Coordinates)將標準化設備坐標系(NDC)應用于視口轉換。NDC將縮小和平移以便適應屏幕的透視。窗口坐標系最終傳遞給OpenGL的管道處理變成了fragment。glViewPort()函數(shù)用來定義最終圖片映射的投影區(qū)域

43、。同樣,glDepthRange()用來決定窗口坐標系的z坐標。窗口坐標系由下面兩個方法給出的參數(shù)計算出來glViewPort(x,y,w,h);glDepthRange(n,f);視口轉換公式很簡單,通過NDC和窗口坐標系的線性關系得到:OpenGL 轉換矩陣OpenGL使用4x4矩陣變換。注意,這16個元素存儲在1D數(shù)組中,這些元素按列順序排列。假如你想以行為順序排列,你需要轉置該矩陣。OpenGL有4種不同的矩陣:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE和GL_COLOR.你可以在代碼中使用glMatrixMode()函數(shù)改變當前的類型。例如,為了選擇G

44、L_MODELVIEW矩陣,可以這樣:glMatrixMode(GL_MODELVIEW);-模型視圖矩陣(GL_MODELVIEW)GL_MODELVIEW矩陣在一個矩陣中包含view矩陣和model 矩陣,為了變換view(camera),你需要將整個場景施以逆變換。gluLookAt()用來設置視圖變換最右邊的三個矩陣元素 (m12, m13, m14) 是用作位移變換 glTranslatef().的。m15元素是齊次坐標,該元素是用來投影變換的。3個元素集(m0, m1, m2),(m4, m5, m6)

45、和(m8, m9, m10) 是用作歐拉變換和仿射變換,例如glRotate(),縮放glScalef().注意這三個元素集實際上指得是3個正交坐標系:(m0, m1, m2): +X 軸,向左的向量(left vector)(估計是相對屏幕自己來說),默認為(1,0,0)(m4, m5, m6) :   +Y軸,向上的向量(up vector),默認為(0,1,0)(m8, m9, m10):  +Z軸,向前的向量,默認為(0,0,1). 4 columns of GL_MODELV

46、IEW matrix我們能夠不使用OpenGL變換函數(shù),直接構造GL_MODELVIEW矩陣。下面有一些有用的代碼構建GL_MODELVIEW矩陣1. Angles to Axes  轉向角度直接影響到OpenGl GL_MODELVIEW矩陣的前三列,精確的說是x,y,z的正方向軸元素。例如,如果一個單位向量沿著X軸 (1,0,0)被一個任意的3X3旋轉矩陣相乘,其結果是選擇后的向量 這意味第一列 (m0, m1, m2)代表了坐標左軸的旋轉矩陣,同樣的,第二列對于上軸,第三列對應前軸。下面詳解構建帶旋轉角度的GL_MODELVIEW矩陣單軸旋轉Axis Rot

47、ations首先,我們看一個圍繞+X,+Y,+Z每個軸的旋轉; 我們設置三個軸放置在一個平面的3條不同方向,所以我們要將這個軸旋轉來面朝你, 正旋轉直接變成逆時針方向(右手法則)對于圍繞X軸的旋轉初始化Y軸和Z軸的值為(0,1,0)和(0,0,1),如果X軸旋轉了A度,那么新的(Y')軸變成(0, cosA, sinA)還有新的(Z') 軸變成 (0, -sinA, cosA). ,把新產(chǎn)生的軸代入原來的矩陣替換掉對應的列分量,這個選擇矩陣會變成這樣對于圍繞Y軸的旋轉現(xiàn)在,我們旋轉Y向量,將它面朝你旋轉B角度,X軸從(1,0,0)變換為 

48、X' (cosB, 0, -sinB).,而Z軸從(0,0,1)變換為 Z' (sinB, 0, cosB).對于圍繞Z軸的旋轉如果你旋轉Z軸C度,那么原始的X軸 (1, 0, 0)變成 X' (cosC, sinC, 0) ,而Y軸 (0, 1, 0) 變成Y' (-sinC, cosC, 0).組合軸旋轉 Angles to Axes我們可以用三個矩陣相乘來組合三個分離的軸旋轉到一個矩陣中,注意矩陣乘法的位置是不可以交換的,以至于成為不同的矩陣乘法的命令而來不同的結果輸出。有6種組合RxRyRz, RxRzRy, Ry

49、RxRz, RyRzRx, RzRxRy 和 RzRyRx.      用C+語言實現(xiàn)RX,RY,RZ組合旋轉例子,結果包含左,上,前軸可以用于構建GL_MODELVIEW 矩陣struct Vector3 float x; float y; float z; Vector3() : x(0), y(0), z(0) ; / initialze when created;/ convert Euler angles(x,y,z) to axes(left, up, forward)/ Each column of

50、the rotation matrix represents left, up and forward axis./ The order of rotation is Roll->Yaw->Pitch (Rx*Ry*Rz)/ Rx: rotation about X-axis, pitch/ Ry: rotation about Y-axis, yaw(heading)/ Rz: rotation about Z-axis, roll/ Rx Ry Rz/ |1 0 0| | Cy 0 Sy| |Cz -Sz 0| | CyCz -CySz Sy |/ |0 Cx -Sx|*| 0

51、 1 0|*|Sz Cz 0| = | SxSyCz+CxSz -SxSySz+CxCz -SxCy|/ |0 Sx Cx| |-Sy 0 Cy| | 0 0 1| |-CxSyCz+SxSz CxSySz+SxCz CxCy|/void anglesToAxes(const Vector3 angles, Vector3& left, Vector3& up, Vector3& forward) const float DEG2RAD = 3.141593f / 180; float sx, sy, sz, cx, cy, cz, theta; / rotation

52、angle about X-axis (pitch) theta = angles.x * DEG2RAD; sx = sinf(theta); cx = cosf(theta); / rotation angle about Y-axis (yaw) theta = angles.y * DEG2RAD; sy = sinf(theta); cy = cosf(theta); / rotation angle about Z-axis (roll) theta = angles.z * DEG2RAD; sz = sinf(theta); cz = cosf(theta); / determ

53、ine left axis left.x = cy*cz; left.y = sx*sy*cz + cx*sz; left.z = -cx*sy*cz + sx*sz; / determine up axis up.x = -cy*sz; up.y = -sx*sy*sz + cx*cz; up.z = cx*sy*sz + sx*cz; / determine forward axis forward.x = sy; forward.y = -sx*cy; forward.z = cx*cy;2. Lookat to Axes 觀察坐標系這個旋轉矩陣可以被在3d空間的中2或3個點構成的一個觀

54、察向量所構造,如果一個對象在P1面朝P2,這個觀察向量就是 P2 - P1.首先,前軸(Z)向量計算很簡單,直接由觀察向量歸一化得到其次,左軸(X)的向量是由特定的上方向向量和前軸(Z)的叉積來計算求得,這個上向量可以確定這個對象的滾轉roll 角度,還有它沒有必要垂直于前(世界坐標系的Z)軸,如果你不考慮向前滾轉旋轉這個對象,那么我們用(0,1,0)代替它,意味著這個對象是正立的實際上上軸向量,它正交與前和左軸,由前和左的叉積計算的到,左和上軸以便后來的叉積有單位長度應該被歸一化。計算左,上,前軸觀察向量的C+實現(xiàn)代碼/ minimal implementation of Vector3 structstruct Vector3 float x; float y;

溫馨提示

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

評論

0/150

提交評論