SAT碰撞检测 - 角落修复
我正在构建一个游戏,我目前正在研究物理。SAT碰撞检测 - 角落修复
我正在使用SAT算法来检测碰撞。在字符(AxisAlignedBoundingBox)和某些矩形(带有旋转)之间的冲突为。
一切正常,除在特定情况下在角落附近碰撞。 (这是一个相当已知的问题,但我没有找到任何好的解决方案)。
在实施例1,在第二场景中的字符应该向上移动(留在障碍物)。
它正好向左移动。
对例2,在第二个场景中字符不应该起来。有时会得到。
我知道为什么发生这种情况,因为DX和DY,则最小平移向量并不总是想要一个。
这个问题有几种解决方案,但不是一个很好的解决方案(解决问题而不是创建其他问题!)。 我甚至愿意从一开始就使用完全不同的算法。
请给我一个比SAT更好的算法暗示,或者一些解决方法。
谢谢!
一张图片值得多言。
图像有两个箱测试红与黑..
注意黑盒子的中心是如何总是在暗红色的盒子,当它仅仅是感人。
您可以简化任何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的任何四边相交。
非常感谢您的回答!聪明的解决办法,我唯一关心的是轮换。 RED盒子可以旋转,这就是我使用SAT的原因。我可以在碰撞前检查角色是否被留下 - 右 - 红框上方或下方(旋转或不旋转),但这对我没有多大帮助! –
你能展示一些代码吗?你在每种情况下获得的正常接触是什么,你期望什么? (对于我来说,第一个应该是'(0,1)'和第二个'(-1,0)',这就是你应该看到的最小平移向量) – Zouch
不,比简单的运动。 dx,dy,重力对此起作用。恩。 MTV:(-2,-0.35) - >角色需要在X轴和-0上移动-2。35在Y轴上脱离碰撞 –
您需要提供一些代码并更准确地说明您的问题。如果您在处理碰撞时遇到问题,则可能与您用于检测它们的算法无关,但与计算响应的方式有关。 – Zouch