2010-01-30 239 views
1

現在,經過一些工作之後,我終於明白了KDop包圍體積是如何創建的以及碰撞是如何相交的,並且我制定了它們的工作實現。 現在的問題是另一個。 :D不同的K和體積之間的K-Dop碰撞

我該如何相交(它必須是可能的,否則它沒有任何意義)2不同K值的K-Dop? (顯然我們事先知道哪個軸被用來創建那些2 K-Dop。)

像我怎樣才能相交DOP6(AABB)和DOP14(AABB +切角)? 或DOP14(AABB +切角)和DOP26(AABB +切角+切割邊緣)?

的簡單的方法(KDOP之間具有相同的K)是

public Boolean Intersects(kDOP a, kDOP b) 
     { 
      // TODO : How to do if the K is not the same? 
      for (int i = 0; i < a.K/2; i++) 
       if ((a.Min[i] > b.Max[i]) || (a.Max[i] < b.Min[i])) 
        return false; 
      return true; 
     } 

另一個問題是。如何做KDOP和說一個球體之間的交集? KDOP和膠囊? KDOP和OOB? KDOP和AABB? (如果我們知道如何處理不同的K,這應該會更容易一些(因爲AABB基本上是DOP6)) 我是指在這些簡單結構之間進行交集的常用方法是什麼?

非常感謝您的回答!

編輯:從網上的一些搜索看來,分離軸是要走的路,但我找不到任何關於如何在K-DOP上實現它的詳細信息。 :P

編輯2:有人通過KDOP有一個分離軸定理的工作實現? :|

回答

1

如果Ks是不同的順序,只需將您的i循環運行到a.K/2或b.K/2的最小值。

+0

它那麼簡單? XD 我的意思是軸的順序可以不同,還是必須命令它們在兩個結構中都相同?比較KDOP 14(AABB,Corners)和KDOP26(AABB,Corners,Edges)。我應該讓他們在同一個訂單(爲了檢查AABB與AABB,與角落的角落,並留下邊緣?) 其他卷呢?像球體等?一些想法? – feal87 2010-01-30 14:38:26

+0

另一個說明,如果我必須訂購他們,我將如何檢查帶有DOP8(角)的DOP6(AABB)? – feal87 2010-01-30 14:41:07

+0

它只適用於它們是子集的情況。 KDOP6,KDOP14,KDOP26以及軸的順序是否相同。 「實時碰撞檢測」(Real Time Collision Detection,http://realtimecollisiondetection.net/)有很多不同BB之間的交集。 – Greg 2010-01-30 18:07:13