視景體裁剪的最大優勢是層次化的裁剪方法。這意味著我們的世界將被分解成乙個樹形結構。一旦我們裁掉了上一層的結點就沒有必要去裁剪切一層的結點了,因為無論如何都是不可見的。這也就意味著我們沒有必要裁剪所有的結點。我們簡單的按層次結構來處理結點,這將大大的減少要進行視景體裁剪的結點的數量。沒有乙個層次處理的方法,視景體裁剪依舊比不進行裁剪有著較高的效率,但是沒有它,問題的規模是和所有結點的數量是乙個級別的。換句話說,有100
個結點就要進行
100次視景體裁剪計算。
1,000,000
個結點就要進行
1,000,000
次裁剪運算。某些時候我們最終花費了這麼多的時間去做裁剪卻發現速度並沒有提高。在設計乙個快速的遊戲是,我們絕對不希望我們的算數運算在乙個線性的規模上,除非只有2到
3個去處理,或者是沒有任何更好的方法來處理。這意味著乙個層次化的的裁剪方法是有必要的。假設在100個結點中僅有
1個結點是可見的,我們用二分的方式進行裁剪(這個例子非常簡單)。通常的線性方法,我們要簡單的測試每個單獨的結點(所有這
100個)並判斷它是否是可見的。現在考慮二分方式。第一次的判斷可以將數量減少到
50,下一次判斷數量減少到
25,在下一次
13,再下一次
7,再下一次
4,再下一次
2,再下一次
1。總共六次判斷!這與
100相去甚遠。並且隨著數量的增長,其相對於線性方法將更具優勢。事實上在這種情況下,線性方法將判斷
n次而二分法只需判斷
logn
次(以2
為底)。
在這個例子中我將在我的層次化裁剪方法中使用四叉樹。八叉樹、二叉樹或者是其他的結構也是可以的。事實上,大部分的**都很容易地進行。我選擇四叉樹是因為它比較容易想象。四叉樹基本上是乙個二維區域用乙個每個結點有四個孩子節點的樹結構構成的(見圖2
)。在這種情況下,孩子結點佔父結點的所在區域的四分之一。然後它可以被每個孩子結點重複的定義(遞迴)。這樣定義的就是乙個層次結構,每個孩子結點都被完全包含在父結點中。當我們認定父結點是不可見時,可以認為孩子節點也是不可見的。通過這樣的設定方式,我們可以通過簡單少量的裁剪判斷來快速的裁剪數量龐大的結點。這種方式對於地形引擎是非常有利的。並且有著很好的可擴充套件性。我們可以在四叉樹上新增我們的樹木、灌木、石頭等,把它們完全融入到合適的最小的結點上。
首先必須要有乙個基本的裁剪的方法。這意味著我們要根據view matrix
和projection matrix
構造視景體的六個平面,然後判斷乙個包圍球或者是包圍盒是否在視景體外。更簡單的說,我們想知道包圍球和包圍盒都是不是完全包含在視景體內,完全超出或跟視景體相交。這將 允許我們之後對我們的層次化裁剪做更多的調整。
1、先判斷結點的包圍球是否在視景體內,如果包圍球完全在視景體內則不進行包圍盒測試
2、層次化處理:從頂層的結點開始處理,判斷結點是否可見
a) 完全不可見:則其子結點也完全不可見;
b) 部分可見:遞迴的判斷其子結點是否可見;
c) 完全可見:其子結點也全部可見;
詳見:
視景體裁剪課程 視景體形狀
在這個章節中我們將在opengl應用程式中引進視景體的形狀。它是使用函式gluperspective 來定義透視投影,然後使用glulookat 函式來定義相機的位置。首先,讓我們回味一下這些函式的引數 都是float型別 1.gluperspective fovy,ratio,neardist,f...
pandas層次化索引
import numpy as np import pandas as pd from pandas import series,dateframe dd dataframe np.random.rand 4,2 columns data1 data2 index a a b b 1 2 1 2 d...
pandas層次化索引
import pandas as pd import numpy as np from numpy import nan as na df pd.dataframe np.random.randn 7,3 index a b c d e f g columns q w t in 106 df out...