因爲投影變換失去了深度信息,每每致使圖形的二義性。要消除二義性,就必須在繪製時消除被遮擋的不可見的線或面,習慣上稱做消除隱藏線和隱藏面(或可見線斷定、可見面斷定),或簡稱爲消隱。通過消隱獲得的投影圖稱爲物體的真實感圖形。html
下面這個圖就很好體現了這種二義性。
算法
消隱後的效果圖:數組
全部隱藏面消隱算法必須肯定:
在沿透視投影的投影中心或沿平行投影的投影方向看過去哪些邊或面是可見的
數據結構
一、以構成圖像的每個像素爲處理單元,對場景中的全部表面,肯定相對於觀察點是可見的表面,用該表面的顏色填充該像素.
適於面消隱。數據結構和算法
算法步驟:ide
a.在和投影點到像素連線相交的表面中,找到離觀察點最近的表面;
b.用該表面上交點處的顏色填充該像素;
spa
二、以三維場景中的物體對象爲處理單元,在全部對象之間進行比較,除去徹底不可見的物體和物體上不可見的部分.適於面消隱也適於線消隱。.net
算法步驟:
a.斷定場景中的全部可見表面;
b.用可見表面的顏色填充相應的像素以構成圖形;3d
1.假定構成物體的面不能相互貫穿,也不能有循環遮擋的狀況。
2.假定投影平面是oxy平面,投影方向爲z軸的負方向。
指針
若是構成物體的面不知足該假定,能夠把它們剖分紅互不貫穿和不循環遮擋的狀況。
例如,用圖b中的虛線即可把原來循環遮擋的三個平面,分割成不存在循環遮擋的四個面。
指可以包含該物體的一個幾何形狀(如矩形/圓/長方體等),該形狀有較簡單的邊界。
邊界盒技術用於判斷兩條直線是否相交。
進一步簡化判斷
思路:把顯然不可見的面去掉,減小消隱過程當中的直線求交數目
如何判斷:根據定義尋找外(或內)法向,若外法向背離觀察者,或內法向指向觀察者,則該面爲後向面。
注意:若是多邊形是凸的,則可只取一個三角形計算有向面積sp。若是多邊形不是凸的,只取一個三角形計算有向面積sp可能會出現錯誤,即F所在的面爲前向面也可能出現sp≥0的狀況,所以,需按上式計算多邊形F的有向面積。若是sp ≥0,則F所在的面爲後向面。
物體之間的遮擋關係與投影中心和投影方向有着密切的關係,所以,對物體的可見性斷定也和投影方式有密切的關係。
垂直投影的優勢:進行投影時能夠忽略z值,即:實物的(x,y)可直接作爲投影后的二維平面上的座標(x,y)
上述討論說明,垂直投影比非垂直投影容易實現,而且計算量小。所以在進行消隱工做以前,首先應將非垂直投影轉換成垂直投影,從而下降算法的複雜性,提升運算速度。
如何把透視投影變爲垂直投影,其本質是把棱臺變成長方體。
用多邊形的邊界對區域做劃分,其目的是儘可能減小對區域劃分的次數--利用裁剪算法
爲了生成真實感圖形,關鍵問題之一就是對圖像空間的每個像素進行處理。從場景中全部的在該像素上有投影的表面中肯定相對於觀察點是可見表面。爲了提升算法效率,天然是但願從可能在像素上有投影的面片中尋找可見表面。八叉樹算法是快速尋找可見面的一種有效方法,是一種搜索算法。
基本思想:將可以包含整個場景的立方體,即八叉樹的根結點,按照x,y,z三個方向中的剖面分割成八個子立方體,稱爲根結點的八個子結點。對每個子立方體,若是它包含的表面片少於一個給定的值,則該子立方體爲八叉樹的終端結點,不然爲非終端結點並將其進一步分割成八個子立方體;重複上述過程,直到每一個小立方體所包含的表面片少於一個給定的值,分割即了結止。
那麼對於上述圖所示,視圖平面法向量(1,1,1)那麼此時它的一個排列是0,1,2,4,3,5,6,7,即最遠的八分體是0,與八分體0共享一個面的三個相鄰八分體是1,2和4,與最近八分體7的3個相鄰八分體是3,5和6。
z緩衝器算法是最簡單的隱藏面消除算法之一。
基本思想:對屏幕上每個像素點,過像素中心作一條投影線,找到此投影線與全部多邊形交點中離觀察者最近的點,此點的屬性(顏色或灰度)值即爲這一屏幕像素點的屬性值。
須要兩個緩衝器數組,即:z緩衝器數組和幀緩衝器數組,分別設爲 Zdepth[ ][ ] 與 Frame[ ][ ]
z緩衝器是一組存貯單元,其單元個數和屏幕上像素的個數相同,也和幀緩衝器的單元個數相同,它們之間一一對應。
幀緩衝器每一個單元存放對應像素的顏色值;z緩衝器每一個單元存放對應像素的深度值;
算法的複雜性正比於m*n*N,在屏幕大小即m*n必定的狀況下,算法的計算量只和多邊形個數N成正比
z-Buffer算法沒有利用圖形的相關性和連續性,這是z-Buffer算法的嚴重缺陷,更爲嚴重的是,該算法是像素級上的消隱算法。
將z緩衝器的單元數置爲和一條掃描線上的像素數目相同。
從最上面的一條掃描線開始工做,向下對每一條掃描線做以下處理:
掃描線算法也屬於圖像空間消隱算法。該算法能夠看做是多邊形區域填充裏介紹過的邊相關掃描線填充算法的延伸。不一樣的是在消隱算法中處理的是多個面片,而多邊形填充中是對單個多邊形面進行填充。
對每一個多邊形,檢查它在oxy平面上的投影和當前掃描線是否相交?
若不相交,則不考慮該多邊形。
若是相交,則掃描線和多邊形邊界的交點是成對地出現
對每對交點中間的像素計算多邊形所在平面對應點的深度(即z值),並和z緩衝器中相應單元存放的深度值做比較。
若前者大於後者,則z緩衝器的相應單元內容要被求得的平面深度代替,幀緩衝器相應單元的內容也要換成該平面的屬性。
對全部的多邊形都做上述處理後,幀緩衝器中這一行的值便反應了消隱後的圖形。
對幀緩衝器每一行的單元都填上相應內容後就獲得了整個消隱後的圖。
每處理一條掃描線,都要檢查各多邊形是否和該線相交,還要計算多邊形所在平面上不少點的z值,須要花費很大的計算
爲了提升算法效率,採用跟多邊形掃描轉換中的掃描線算法相似的數據結構和算法.
其實是一個指針數組 ,每一個表的深度和顯示屏幕行數相同.將全部多邊形存在多邊形Y表中,根據多邊形頂點中Y座標最大值,插入多邊形Y表中的相應位置,多邊形Y表中保存多邊形的序號和其頂點的最大y座標.
要注意:Δx是下一條掃描線與邊交點的x減去當前的掃描線與邊交點的x。
其實這裏最難理解的就是Δyl和Δxr了,這裏的意思就是當前掃描線所處的y值和與該掃描線相交邊的最小y值的差值。
就好比說掃描線y=6,與第一個三角形有兩個交點,左交點(4,6),右交點(7,6)那麼Δyl=6-3 Δyr=6-3
對每一條掃描線,檢查對每一個多邊形的投影是否相交,如相交則交點成對出現,對每對交點中間的每一個像素計算多邊形所在平面對應點的深度(即z值),並和z緩衝器中相應單元存放的深度值做比較,若前者大於後者,則z緩衝器的相應單元內容要被求得的平面深度代替,幀緩衝器相應單元的內容也要換成該平面的屬性。
對全部的多邊形都做上述處理後,幀緩衝器中這一行的值便反應了消隱後的圖形,對幀緩衝器每一行的單元都填上相應內容後也就獲得了整個消隱後的圖。
算法描述以下
優先級排序表算法按多邊形離觀察者的遠近來創建一個多邊形排序表,距觀察者遠的優先級低,放在表頭;近的優先級高,放在表尾
從優先級低的多邊形開始,依次把多邊形的顏色填入幀緩衝存儲器中
表中距觀察者近的元素覆蓋幀緩衝存儲器中原有的內容
當優先級最高的多邊形的圖形送入幀緩衝器後,整幅圖形就造成了
相似於油畫家繪畫過程,所以又稱爲油畫家算法。
算法的優勢:
簡單,容易實現,而且能夠做爲實現更復雜算法的基礎;
缺點:
只能處理不相交的面,並且深度優先級表中面的順序可能出錯.
該算法不能處理某些特殊狀況。
解決辦法:把P沿Q平面一分爲二,從多邊形序列中把原多邊形P去掉,把分割P生成的兩個多邊形加入鏈表中。具體實現時,當離視點最遠的多邊形P和其餘多邊形交換時,要對P作一標誌,當有標誌的多邊形再換成離視點最遠的多邊形時,則說明出現了上述的現象,可用分割方法進行處理 。
用來解決動態顯示問題時,可大大提升效率
要處理的場景中有無限多條光線,從採樣的角度講咱們僅對穿過像素的光線感興趣,所以,可考慮從像素出發,逆向追蹤射入場景的光線路徑
由視點出發穿過觀察平面上一像素向場景發射一條射線
求出射線與場景中各物體表面的交點
離視點最近的交點的顏色即爲像素要填的顏色。
光線投射算法對於包含曲面,特別是包含球面的場景有很高的效率。
原文出處:https://www.cnblogs.com/wkfvawl/p/11911441.html