2011-06-09 109 views
1

我正在渲染一箇舊的遊戲格式,我有一個組成你是在網格列表。我終於得到了PVS(區域可見從另一個區域)工作和這削減了很多我不需要渲染但不太多的網格。所以現在,我應該渲染的網格列表僅包含我可以看到的其他網格。但它並不完美。仍然有很多網格包括超過剪輯的真正遙遠的網格。邊界框平截頭體渲染 - 距離渲染 - OpenGL

現在首先,我試圖挑出不在我的視角內的網格。我聽說一個邊框是最好的方法去做這件事。有沒有人有一個關於如何去做這件事的想法?我知道我需要最大點(x,y z)和最小點(x,y z),以便一個盒子包含所有的頂點。

然後,我檢查一下,看看這兩點之一是否在我的視角?這很簡單嗎?

謝謝!

回答

2

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,然後在較小的列表上對截錐體和/或網格使用更精確的邊界體積執行更準確的測試。

+0

謝謝!我只是很好奇,當它不是一個盒子或者更多的金字塔形狀時,如何在平截頭體中有一個AABB。 – 2011-06-09 04:55:32

+0

謝謝澄清! – 2011-06-09 05:12:36