AABB或軸對齊邊界框是用於測試兩個3D區域的相交/包含的非常簡單且快速的對象。
正如您所建議的,您正在計算要比較的兩個區域的最小值和最大值x,y,z,例如描述平截頭體的區域和描述網格的區域。它是軸對齊的,因爲隨後的立方體的邊與座標系的每個軸都平行。顯然,這可能會有些不準確(交集/遏制的誤報,但絕不會出現假陰性),所以一旦用AABB測試篩選列表,您可能會考慮對其餘網格進行更準確的測試。
您測試相交/遏制如下:
F =平截頭體的AABB
M =網格
bool is_mesh_in_frustum(const AABB& F, const AABB& M)
{
if(F.min.x > M.max.x || M.min.x > F.max.x || F.min.y > M.max.y || M.min.y > F.max.y || F.min.z > M.max.z || M.min.z > F.max.z)
{
return false;
}
return true;
}
還可以查找算法包圍球,方向包圍的AABB盒子(OBB)和其他類型的邊界卷。根據您渲染的網格數量,您可能需要也可能不需要更準確的方法。
要首先創建一個AABB,您可以簡單地走過網格的頂點並記錄您遇到的最小/最大x和y和z值。還可以考慮,如果網格不變形,那麼網格座標空間中的邊界框將是靜態的,因此,只要有頂點數據,就可以爲所有網格計算AABB。
然後你只需要確保你變換預先計算的AABB最小值和最大值的頂點爲圓臺座標空間,你做了測試每個渲染通道之前。
(徵求意見)編輯:
的AABB可以提供假陽性,因爲它充其量你界定該區域的精確形狀,但更通常比你邊界的區域更大。
考慮一個球,如果你使用AABB,它就像把一個籃球成箱,你把所有這些在框,球斜面接觸不到的角落縫隙。
或者對於截錐體向內照相機傾斜的情況,AABB將沿着朝向照相機的軸簡單地繼續,實際上限制了比照相機大的區域。
這是一個不準確的來源,但它不應該導致你剔除一個甚至稍微在平截頭體內部的對象,所以在最壞的情況下,你仍然會畫出一些靠近相機但仍然不在平截頭體內的網格。
您可以通過首先進行AABB測試並生成一個較小的網格列表來返回true,然後在較小的列表上對截錐體和/或網格使用更精確的邊界體積執行更準確的測試。
謝謝!我只是很好奇,當它不是一個盒子或者更多的金字塔形狀時,如何在平截頭體中有一個AABB。 – 2011-06-09 04:55:32
謝謝澄清! – 2011-06-09 05:12:36