最近我一直在研究我的游戲,到目前為止,我的SAT碰撞檢測-解析度作業得很好(我可以檢測到兩個相交的多邊形,并找出正確的矢量來將一個多邊形推出另一個多邊形('推出'矢量))
。然而,當我將推出的向量應用于其他多邊形時,我遇到了一個問題。當一個多邊形與2個或更多的多邊形接觸時,我最終會產生2個或更多的推出向量,這些向量需要以正確的順序應用,以獲得一個現實的結果(也就是不會在其他多邊形中出現故障或卡在不存在的角落里)
目前,我已經將一個多邊形推到了另一個多邊形上。
目前,我應用每一個推送矢量,每次應用時,我都會檢查多邊形是否仍然與它所碰撞的其他多邊形相交,如果是,我就繼續應用其余的矢量。如果不是,就停止應用,因為它們不再相撞了。
這樣做的問題是,我需要以特定的順序應用這些向量,而不僅僅是以它們在串列中的其他順序。我不知道有什么好的解決方案來排列它們。
這就是我的代碼(collider是需要應用推送向量的物件)(otherColliders是collider相交的colliders串列):
List<Vector2> pushoutVectors = getPushoutVectors(otherColliders) 。
foreach (Vector2 pushout in pushoutVectors)
{
collider.Transform.Position = pushout;
if (! collider.checkForIntersecting(otherColliders))
break。
}
下面的圖片顯示了我目前的問題。有什么辦法可以在(0, 1)之前獲得矢量(-1, 0)?
uj5u.com熱心網友回復:
好的,解決了!
如果有人感興趣的話,解決方案是根據與每個碰撞器中心的距離進行排序。不要從原點或類似的地方開始排序--按兩個碰撞器中心的距離以ASCENDING順序排序。這確保了推送矢量被正確應用,并且不會發生剪切或卡住的情況。
(哦,還有,不管是誰把這個問題降權了,請告訴我為什么,這樣我就可以對這個問題進行必要的編輯)
示例
示例代碼:
標籤: 上一篇:尋找特定素數的程式以無限回圈結束
public struct Hit
{
public Collider Me;
public Collider Other;
public Vector2 Pushout;
public float getCenteredDistanceFromOtherSquared()
{
return Vector2.DistanceSquared(Me.getWorldBounds().Center, Other.getWorldBounds() .Center)。
}
}
List<Hit> hits = getHits(otherColliders);
//注意:為了清楚起見,這是一個很長的函式名稱。
///它回傳碰撞中 "碰撞器 "和 "其他 "碰撞器之間的距離。
//它的平方只是因為我們只需要按大小排序,而不是得到實際的大小,所以它只是為了防止使用性能昂貴的sqrt函式。
List<Hit> sortedhits = hits.OrderBy(x => x.getCenteredDistanceFromOtherSquared()).ToList()。
foreach (Hit hit in sortedhits)
{
//apply pushout[/span]。
collider.Transform.Position = hit.Pushout;
//檢查我們是否還在與其他碰撞器碰撞。
//如果我們沒有,就停止應用撞擊。
// if we are, keep applying hits[/span].
//這是為防止卡在邊緣之類的地方。
if (! collider.checkForIntersecting(otherColliders))
break。
}
