解决 2D 碰撞
Resolve 2D Collisions
我正在制作游戏,可以检测碰撞。我现在需要解决它们。我想要的是重叠 x 和 y 以便我可以否定它。获得重叠的形状。圆与圆。圆形和矩形。 注意不需要旋转。
有一些关于堆栈溢出的答案,但其中 none 是我想要的。我只需要重叠 x 和 y,仅此而已。
AABB 对比 AABB
我记得几年前在制作我的第一款涉及一点物理的游戏时为此苦苦挣扎。我在互联网上找不到任何相关信息,所以我做了自己的算法。
您可以在函数 AABB::detectCollision()
中找到它 here。此函数检测 2 个 AABB 之间的重叠和碰撞边。我知道,它是 C++ 而不是 JS,但我相信您能够将它“翻译”成 JS。
请记住,在不考虑两个物体的速度的情况下检测碰撞永远不会非常精确,并且不会在高速下工作。
圆与圆
对于圈子,就简单多了。
假设您有 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
的位置,将 B
移出 A
。
B.position += direction * overlap
我正在制作游戏,可以检测碰撞。我现在需要解决它们。我想要的是重叠 x 和 y 以便我可以否定它。获得重叠的形状。圆与圆。圆形和矩形。 注意不需要旋转。
有一些关于堆栈溢出的答案,但其中 none 是我想要的。我只需要重叠 x 和 y,仅此而已。
AABB 对比 AABB
我记得几年前在制作我的第一款涉及一点物理的游戏时为此苦苦挣扎。我在互联网上找不到任何相关信息,所以我做了自己的算法。
您可以在函数 AABB::detectCollision()
中找到它 here。此函数检测 2 个 AABB 之间的重叠和碰撞边。我知道,它是 C++ 而不是 JS,但我相信您能够将它“翻译”成 JS。
请记住,在不考虑两个物体的速度的情况下检测碰撞永远不会非常精确,并且不会在高速下工作。
圆与圆
对于圈子,就简单多了。
假设您有 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
的位置,将 B
移出 A
。
B.position += direction * overlap