-2

我正在構建一個遊戲,我目前正在研究物理。SAT碰撞檢測 - 角落修復

我正在使用SAT算法來檢測碰撞。在字符(AxisAlignedBoundingBox)和某些矩形(帶有旋轉)之間的衝突爲

一切正常,除在特定情況下在角落附近碰撞。 (這是一個相當已知的問題,但我沒有找到任何好的解決方案)。

enter image description here實施例1,在第二場景中的字符應該向上移動(留在障礙物)。
它正好向左移動。
例2,在第二個場景中字符不應該起來。有時會得到。

我知道爲什麼發生這種情況,因爲DXDY,則最小平移向量並不總是想要一個

這個問題有幾種解決方案,但不是一個很好的解決方案(解決問題而不是創建其他問題!)。 我甚至願意從一開始就使用完全不同的算法。

請給我一個比SAT更好的算法暗示,或者一些解決方法。
謝謝!

+0

你能展示一些代碼嗎?你在每種情況下獲得的正常接觸是什麼,你期望什麼? (對於我來說,第一個應該是'(0,1)'和第二個'(-1,0)',這就是你應該看到的最小平移向量) – Zouch

+0

不,比簡單的運動。 dx,dy,重力對此起作用。恩。 MTV:(-2,-0.35) - >角色需要在X軸和-0上移動-2。35在Y軸上脫離碰撞 –

+0

您需要提供一些代碼並更準確地說明您的問題。如果您在處理碰撞時遇到問題,則可能與您用於檢測它們的算法無關,但與計算響應的方式有關。 – Zouch

回答

0

一張圖片值得多言。

圖像有兩個箱測試紅與黑..

enter image description here

注意黑盒子的中心是如何總是在暗紅色的盒子,當它僅僅是感人。

您可以簡化任何AABB測試,方法是將其中一個框的大小增加一個框的大小。只要你在他們的中心保留箱子的位置,一切運作良好。

// x,y are box centers 
var bBox = { w : 100 , h : 50, x : ?, y ? }; // black 
var rBox = { w : 200 , h : 200, x : ?, y ? }; // red 

來測試是否BBOX裏面rBox

if(bBox.x > rBox.x - (rBox.w + bBox.w)/2 && 
    bBox.x < rBox.x + (rBox.w + bBox.w)/2 && 
    bBox.y > rBox.y - (rBox.h + bBox.h)/2 && 
    bBox.y < rBox.y + (rBox.h + bBox.h)/2) 
    // boxes are touching. 
} 

同樣工作,如果框移動。您只需測試bBox移動的矢量是否與rBox的任何四邊相交。

+0

非常感謝您的回答!聰明的解決辦法,我唯一關心的是輪換。 RED盒子可以旋轉,這就是我使用SAT的原因。我可以在碰撞前檢查角色是否被留下 - 右 - 紅框上方或下方(旋轉或不旋轉),但這對我沒有多大幫助! –