SAT碰撞检测 - 角落修复

问题描述:

我正在构建一个游戏,我目前正在研究物理。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

一张图片值得多言。

图像有两个箱测试红与黑..

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的原因。我可以在碰撞前检查角色是否被留下 - 右 - 红框上方或下方(旋转或不旋转),但这对我没有多大帮助! –