2D碰撞分辨率卡在墙上

我一直在使用我阅读的文章中的教程来编写这个碰撞检测系统,而我却无法让我的生活正常运作。 这里是初学者的代码:

BoundingBox aBox; aBox.Convert(a); BoundingBox bBox; bBox.Convert(b); Vector2 aMin = aBox.GetTopLeft(); Vector2 aMax = aBox.GetBotRight(); Vector2 bMin = bBox.GetTopLeft(); Vector2 bMax = bBox.GetBotRight(); Vector2 minDistance; float left = (bMin.x - aMax.x); float right = (bMax.x - aMin.x); float top = (bMin.y - aMax.y); float bottom = (bMax.y - aMin.y); // Check for intersection internally if (left > 0 || right < 0) return; if (top > 0 || bottom < 0) return; // Find the minDistance if (abs(left) < right) minDistance.x = left; else minDistance.x = right; if (abs(top) < bottom) minDistance.y = top; else minDistance.y = bottom; // Null axis with biggest value if (abs(minDistance.x) < abs(minDistance.y)) minDistance.y = 0; else minDistance.x = 0; 

现在的问题是这个角色很好的行走,拥抱着一个街区的顶部和一个街区的底部,但是一旦他走上了两个街区,他就会被困在他们之间。 巧合的是,走下来工作非常好。 只是想知道如果有人有这个问题的解决scheme,将不胜感激!

这里有一个更好的显示问题的gif:

在这里输入图像描述

Solutions Collecting From Web of "2D碰撞分辨率卡在墙上"

我想这是发生了什么事情:

 +---+ | A | +---+ | B |P (player) +---+ (A, B are wall "blocks") 

当玩家试图走到左上方,然后用块A和B运行冲突解决scheme时,会发生什么情况:

 +\--+ | A | ----- "A: You're hitting me from below! Go left!" +--\+ \P \ \ +--\+ | B \P ----- "B: You're hitting me from the right! Go up!" +---+ 

但是,既然你首先处理A ,你就“听”它(左边),等到你到达B并试图向左移动时,你就会停下来。

注意,如果你以相反的顺序( B然后是A )完成了这个工作,这就解释了为什么这个错误只有在你向上而不是向下时才会出现。

我认为可能有很多方法来解决这个问题,但是一个简单的方法是:

  • 使用原始运动vector运行碰撞检测(而不是分辨率),在附近的所有障碍物(例如,左上移动,A表示“否”,B表示“否”)
  • 由于我们正在左上移动,请尝试只移动顶部和左侧,再次运行完整的碰撞检测:
    • 顶部:A说“是”,B说“是”
    • 左:A说“是”,B说“不”

自从搬到最顶层的作品之后,我们会这样做的。

还要注意,这是一种只有在AABB的情况下才能工作的方法 – 所有的墙都是水平/垂直的,等等。 在一般情况下,比如当你有对角墙时,你需要确定墙的走向,以便“滑动”它们。