2011-02-25 130 views
2

我需要檢查一個框是否與球體碰撞。我有一個用x,y,z,寬度,高度,深度定義的BoundingBox類。我也有一個用x,y,z,radius定義的BoundingSphere類。如何檢查它們是否相交?框與球碰撞

+0

可能的重複:http://stackoverflow.com/questions/4578967/cube-sphere-intersection-test(雖然主題那裏說「立方體」,答案適用於所有軸對齊框)。 – 2011-02-25 20:33:50

回答

1

如果您想保持測試的水平,您可以在寬度,高度和深度= 2r的球體周圍放置邊界框。當然,這承認球體上「非極性」或「非赤道」點的碰撞誤報風險。爲了解決這個問題,你可以考慮構建一系列層次邊界框來增加這些問題區域中命中測試的粒度。

您可能還會從渲染級別解決問題。由於您無法渲染球體,因此通常會使用某種多邊形網格。在2D(或3D)多邊形之間進行打擊測試是一項直接的練習。

+0

不錯的發現,鏈接是最新的,涵蓋多個案例。實體盒實體球算法是我見過的大多數遊戲引擎使用的(以各種優化形式)。 – Kaganar 2013-05-14 21:58:12

-2

你只需要檢查邊界框的所有角落與球體中心的距離。這是一些僞代碼:

bool collidesWith(BoundingBox b, BoundingSphere s) { 
    for(Vertex v in b) { 
    if(distanceBetween(v, s.center) <= s.radius) 
     return true; 
    } 
    return false; 
} 
+4

這不處理只有一個邊相交的情況。 – corsiKa 2011-02-25 20:35:49

+0

好點 - 謝謝。 – 2011-02-25 20:37:30

+0

這是非常不典型的,因爲OP所要求的軸對齊邊界框周圍有頂點。更重要的是,「正義」不起作用(正如已經指出的那樣),對於這種情況也僅僅有點太慢。 – Dude 2012-09-23 21:29:52

3

首先要檢查的是BoundingSphere的BoundingBox是否相交。這是因爲這是一個排除更復雜數學的簡單方法。

下一步將採用邊界框的六個平面(或十二個三角形)中的每一個,並對它們執行從點到多邊形測試的距離到球體的中心。如果其中一個小於球體的半徑,那麼你有一個命中。

多邊形,以點距離Matlab代碼:http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon

0

有由吉姆·帕特在圖形寶石的一章。

我想上面陳舊的鏈接用來指向他的代碼,因爲URL中有「arvo」。這link作品 - 至少現在。