簡易視錐剔除技巧總結

2021-04-27 02:14:17 字數 1926 閱讀 6124

1.

背景視錐剔除可以大大提高

3d場景的渲染效率。但隨著顯示卡的發展,

cpu上過多的視錐剔除計算可能會消耗過多的時間,從而拖累了整體的渲染速度。同時,在我最近接觸到的一些專案中,經常需要做一些比較特殊的場景,通用的視錐平面相乘容易出現誤差導致誤判,而且在除錯的時候比較麻煩。

因此,我在實際程式設計中喜歡用一些比較簡單快速的視錐剔除函式。

2.平面場景

a.城市場景

利用二維視錐投影代替三維包圍盒。

城市場景由於主要是建築物。這樣的場景一般建築物的高度比較一致,如果採用地表與視錐求交作為剔除的依據,則當鏡頭仰視時容易把建築物誤剔除,而如果將地表拉高做成立方體與視錐求交作為剔除依據,則比較難確定拉高的高度。

我採用的辦法是將視錐投影到地面上,這樣就不需要再確定拉高的高度了。在具體剔除的時候,同樣可以利用包圍球、包圍盒之類的方法進行計算,只需要把三維的判斷公式改為二維。

b.四叉樹組織式的無限規模場景

利用視錐投影包圍盒確定根節點。

現在有很多場景的規模是無限或不確定的,這時四叉樹如果從整個組織樹的根節點開始判斷,則有可能造成浪費,甚至有時候無法得知根結點。

我的做法是將視錐投影後的包圍盒向上取對數求得乙個可以包圍視錐的最小四叉樹節點,將此節點作為根結點在進行四叉樹遞迴和剔除。

3.其他場景

有時我們需要構造一些其他形狀的場景。例如地球等球體。視錐剔除時我首先將視錐假設成為乙個

90度角的圓錐體(當然也可以改為其他度數),然後按以下的步驟進行剔除。 a.

距離剔除

根據視錐的遠近平面可以得到它的可見距離範圍。如果被測物體在

此距離外,可直接剔除。當被測物體相對於視錐比較大時,我採用類似於包圍球的方法進行簡易判斷,即物體中心到攝像機的距離減去物體包圍球半徑所得的值大於視點到視錐遠平面的距離,則判斷為不可見。

經過此步驟,可以得到以視點為中心的球狀場景。我可以用這類方法作為視訊記憶體載入的依據,因為一般使用者在漫遊時比較喜歡原地旋轉鏡頭,不大樂意接受旋轉時帶來的卡幀或者場景空白的效果。

b.背面剔除

物體向量點乘視向量,得出的結果時兩個向量長度積乘以

cos夾角值之積,當這個值小於

0時,表明這個物體在視錐的背面,可以剔除。

如果被測物體相對於視錐比較大,我採用的時取邊界點進行判斷。如果全部小於

0則完全不可見,部分小於

0則部分可見。

經過此步驟,理論上可以剔除

a步驟後的一半場景物件。

c.視錐夾角剔除

b步驟中物體向量點乘視向量的乘積經過單位化,可以得到兩個向量夾角的

cos值。當此

cos值大於視錐夾角的

cos值時,一般為不可見,我的視錐為

90度,半形為

45度,所以閥值取了

0.707。

但測物體相對於視錐比較大時,如果只以邊界點判斷,則有可能將離鏡頭很近或很大的物體誤判為不可見。因為邊界點可能全部在視錐夾角範圍外,但是物體是可見的。我解決此問題的方法是將各邊界點點乘右向量,如果結果有正有負,則說明該物體跨越視錐上向量和視向量組成的平面,因此還是可見的;如果全部為正或全部為負,則說明他們全部在此平面的一側,為不可見的。

這個判斷回將視錐背面同樣範圍的物體判為可見,因此背面的物體需要現在步驟

b中剔除。

經過此步驟,理論上可以剔除

b步驟後的一半場景物件。

d.增加插值點判斷

如果物體比較不規則,取邊界點時不容易取到全部的邊界點,因此還是容易造成誤判。此時可以再增加一些插值點,按

c步驟判斷是否在視錐夾角內,如果在的話仍為部分可見。

e.其他判斷

考慮到最後的螢幕投影,視錐有可能出現長寬比相差較大,如果需要的話可以在判斷時採用更精確的計算。例如採用

2個不同方向的仰角分別判斷是否在視錐角內。但此加入步驟後視錐判斷的時間消耗已經與用

4個視錐平面與物體相乘求交的消耗差不多了。

mysql技巧總結

mysql技巧總結 2005 09 23 15 02 pm 1.修改mysql中root的密碼 shell mysql u root p mysql set password for root password root 2.遠端登入mysql server 當然server必須首先給某個遠端使用者...

Word Vba技巧總結

確定文字是否被選定 if selection.type wdselectionip then msgbox nothing is selected word中選擇單元格 selection.selectcell 移動到選定內容之後 selection.collapse direction wdcol...

總結 Perl技巧

1.perl超時機制eval sub alarm 10 my startcmdresult qx tmpcmd alarm 0 if timeout 2.忽略sigchld訊號,避免產生殭屍程序 sig ignore 3.等待 sub show flower print r local 0 4.pe...