Bounding Volume Performance Test:AABB vs OBB vs Sphere

來源:互聯網
上載者:User

     任何即時三維互動式程式,如果沒有碰撞檢測,都是沒有價值,甚至無法使用的。遊戲中最常用的碰撞檢測技術莫過於包圍盒(bounding volume)碰撞檢測。對於以60pfs啟動並執行遊戲來說,處理每一幀資料的時間只有0.0167s左右,對於不同的遊戲,碰撞檢測大概需要佔10~30%的時間,也就是說,所有碰撞檢測必須在0.002~0.005s內完成,非常巨大的挑戰。因此,任何包圍盒都應該滿足以下特性:

1. 快速的碰撞檢測
2. 能緊密覆蓋所包圍的對象
3. 包圍盒應該非常容易計算
4. 能方便的旋轉和變換座標
5. 低記憶體佔用

     最常見的包圍盒有:Sphere,AABB,OBB等,外加一個比較特殊的frustum。Sphere能很好的滿足1,3,4,5條,但通常包含了太多無用的空間,容易導致錯誤的碰撞結果。AABB應該是sphere與obb之間的解決方案,同時兼顧了效率和空間覆蓋範圍。OBB是三者中精度最高的,但檢測代價也是最高的。
   
     最終使用哪一種包圍盒,是一個非常痛苦的過程,我們需要在效率和精度之間做出權衡取捨。前幾天剛好完成了基本的碰撞檢測函數,以下是我的一些測試資料,在一定程度上可以作為參考。純C#代碼實現,沒有任何GPU加速,單線程在Q6600上運行。

Sphere-Sphere:100萬次測試,大約有16000次碰撞,耗時0.016s。

AABB-AABB:100萬次測試,1000次碰撞,耗時0.014s。

OBB-OBB: 使用傳統的separate axis演算法,100萬次測試,30萬次碰撞,耗時0.160s左右。對於沒有碰撞的情況,幾乎在前6條軸的檢測中,就能結束檢測,也就是說大約50萬次(50%)測試都在檢測第七條軸之前結束。

Vertical-agliened OBB - Vertical-agliened OBB:普通OBB的特殊版本,只能繞Y軸旋轉。100w次測試,同樣30萬次碰撞,耗時0.08s,幾乎比普通OBB快了一倍。

最後Frustum-AABB:使用<<Optimized View Frustum Culling Algorithms for Bounding Boxes>>中的演算法,100w次測試,6萬次碰撞,耗時0.096s。目前我計算n-vertex和p-vertex的方法是瓶頸,大約0.016s的時間花在計算這兩個點上。 相比XNA中的BoundingFrustum.Intersects,同樣的測試需要0.5s左右。
(以上均為對隨機資料的測試,因此不同包圍盒之間的實際碰撞次數並沒有可比性,也不代表不同類型間的精度)

     顯然,AABB是性價比最高的,OBB雖然有較高精度,但相對其計算代價來說,並不划算,可以考慮用多個AABB來近似OBB,或者使用代價相對較低的Vertical-agliened OBB。Sphere看起來簡單,但計算涉及到開方(雖然Math.Sqrt會直接編譯為fsqrt指令),因此仍然沒有AABB快(只需要6條邏輯比較指令)。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.