2011-06-01 214 views
1

我想製作一個遊戲,其中角色是可以旋轉的矩形棱鏡,而地圖的其餘部分是軸對齊的矩形棱鏡。除了角色以外的所有東西都是靜態的,所以我想知道如果角色與地圖中的任何部分發生碰撞,最好的算法是什麼。任何教程/代碼/建議將不勝感激:)矩形棱鏡碰撞

此外,字符只會在Y軸上旋轉,如果有幫助。

+0

你也可以嘗試[GameDev.Stackexchange](http://gamedev.stackexchange.com) – 2011-06-01 22:12:20

+0

好的,http://gamedev.stackexchange。com/questions/13025 /矩形棱鏡碰撞 – Matt 2011-06-01 22:33:46

回答

0

我相信,以測試這一個方法是檢查16例的直線相交處:

http://www.math.niu.edu/~rusin/known-math/95/line_segs

如果你想優化你也可以檢查,如果矩形沒有重疊,即有機會如果所有的角落都在另一個矩形的右/左/上/下。

編輯:

硒下面的評論。

+0

這裏是「線路交點的16種情況」是什麼?邊緣段相交的失敗不能保證棱鏡(或矩形)的非交叉。例如,一個對象可能在另一個對象內。 – hardmath 2011-06-02 02:20:09

+0

真的,但除了這種情況,它會覆蓋所有其他人。對於最後的情況,你仍然可以使用決定因素,因爲他們會告訴你一個點是在一條線上還是另一條線上。因此,如果您已經以旋轉方式組織矩形中的所有線條,則可以找出某個點是內部還是外部。那麼你甚至不需要檢查16個交叉口! – Pedery 2011-06-02 03:38:15

+0

我假設你所指的16個交點意味着一個矩形的四個邊和另外四個的交點。然後你可以用三個相互排斥的情況來涵蓋所有的可能性:(1)矩形不相交,(2)一個矩形的邊與另一個矩形的邊相交,(3)一個矩形位於另一個矩形的內部。這似乎不像「分離軸」方法那麼高效,但更重要的是,問題是關於棱鏡(3D),而不是矩形(2D)。在3D中,需要概括(2)檢查面的交點。 – hardmath 2011-06-02 14:45:37

0

在該字符僅圍繞其平行於Y軸的軸旋轉的特殊情況下,碰撞檢測與另一軸對齊矩形棱柱簡化爲:

  1. 檢查字符的Y間隔與另一個棱鏡的Y間隔相交。

  2. 檢查兩個棱鏡的相應XZ截面是否相交,這相當於兩個旋轉矩形之間的碰撞檢測問題。

如果對上述兩個答案都是肯定的,那麼只有棱鏡重疊。

在將特定問題減少爲重疊間隔和相交(旋轉)矩形的問題後,對於這些任務中的每一個都有許多很好的代碼資源。第一項任務是相當簡單:

重疊的間隔

兩個封閉區間[A,B]和[C,d]相交,當且只有c ≤ b和a ≤ d。這裏我們還假設區間的符號是一致的,即,一個≤b和c≤d(否則根據需要交換端點以實現它)。

貫旋轉矩形

高度額定SO回答這個特定問題是here。我爲一個稍微更一般的問題編寫的Lua實現Shortest distance between two rectangles包括我提到的on this thread的「提前退出」優化(矩形中的邊界圓和頂點)。如果旋轉的矩形相交,我的Lua代碼返回「false」,否則返回它們之間的距離。對於Java而言,碰撞情況下的返回值爲零。