问题描述
我正在制作游戏,可以检测到碰撞。我现在需要解决它们。我想要的是x和y重叠,以便可以对其进行否定。获得重叠的形状。圈和圈。圆和矩形。 注意,不需要旋转。
关于堆栈溢出有一些答案,但是我都没有想要的答案。我只需要重叠x和y就可以了。
解决方法
AABB vs AABB
我记得几年前在制作我的第一本涉及一点物理性的游戏时遇到了挣扎。我在互联网上找不到任何有关它的信息,所以我制定了自己的算法。
您可以在功能AABB::detectCollision()
中here找到它。此功能检测2个AABB之间的重叠和碰撞侧。我知道,它是C ++而不是JS,但我相信您可以将其“翻译”为JS。
请记住,在不考虑两个物体的速度的情况下检测碰撞永远不会非常精确,并且无法高速运行。
圆vs圆
对于圈子来说,它要简单得多。
假设您有2个相交的圆:一个“固定”一个A
和一个移动的B
。
通过计算两个圆之间的距离并减去其半径之和来计算两个圆之间的重叠:
overlap = magnitude(A.pos - B.pos) - (A.radius + B.radius)
然后通过归一化两个圆之间的增量来计算碰撞法线(需要解决碰撞的方向):
direction = normalize(B.pos - A.pos) // An arrow pointing from A to B
然后将B
从A
中移出,方法是将重叠部分缩放的方向添加到B
的位置。
B.position += direction * overlap