我正在构建游戏,而我目前正在研究物理。
我使用 SAT算法来检测冲突。角色(AxisAlignedBoundingBox)与某些矩形(带旋转)之间的碰撞。
在特定情况下,一切正常,除了角落附近的碰撞。 (这是一个众所周知的问题,但我没有找到任何好的解决方案。)
在示例1 上,在第二个场景中角色应该向上移动(留在障碍物上)。
碰巧向左移动。
在示例2 上,在第二个场景中,角色不应该起来。有时会得到。
我知道为什么会这样,因为 dx 和 dy ,最小翻译矢量并不总是想要的
这个问题有几个解决方案,但不是一个非常好的解决方案(在解决问题而不是创建其他问题方面!)。 我甚至愿意从一开始就使用完全不同的算法。
请给我一个关于比SAT更好的算法的提示,或者一些解决方法 谢谢!
答案 0 :(得分:0)
一张图片值得多说。
图像有两个框来测试红色和黑色..
请注意黑盒子的中心在刚触碰时总是位于较暗的红色框上。
您可以通过将一个框的大小增加另一个框的大小来简化任何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的4个边相交。