在 Three.js 中移动一个盒子与另一个碰撞时的下一个相邻网格

Move a Box with another on colission respecting the next neighboring mesh in Three.js

发现了很多物理引擎,但没有一个能直接满足我的需要。 我试图找到一种简单的方法来推拉箱子,包括碰撞检测,它在移动时尊重下一个相邻的网格碰撞。

需要了解的一些用例:

除了盒子 1 之外的所有盒子都是可移动的。

向西推或拉箱子 4:

将 2、3 或 4 推向北:

应该不可能用一个盒子推拉2个碰撞的盒子。

也许不是最好的问题...我可以从头开始编写这样的逻辑,但这将以相当复杂的代码结束:)而且我想知道以前是否没有人解决过类似的问题。 是否存在使用现有物理引擎或 three.js 插件实现此类逻辑的简单方法?

希望问题表述得足够好,以便任何人都能理解。 如果您知道著名的抱石冲刺游戏,也许会更容易。

可以向两个方向移动两个岩石。

搬不动石头。

在我的情况下,应该可以移动 2 个碰撞 rocks/cubes 但不能移动 3 个。

我刚刚回答了

为此,您应该使用 THREE.Box3 类型的边界框。

你一定要检查 this example out。我想这对你很有用。

所以基本上你想让某些物体在不同的点不可移动。您可以使用 physi.js 执行此操作。只需增加物体的质量,使其相对于其他物体变得如此重,以至于无法移动。

很简单,它更多的是关于几何和逻辑而不是物理......如果我理解你简化的世界。

在 boulderdash(或推箱子)的情况下,移动是基于平铺的,当您要移动角色时,您首先检查 adjacent 平铺,在运动的方向。它可以步行或被可移动物体(或墙壁)占据。如果有可移动的物体,则检查 下一个相邻的 方块。如果它是可步行的,那么就意味着它确实是可移动的。否则,该可移动对象当前不可移动。

在像你这样的非平铺场景中,你检查是否与第一个盒子发生碰撞,当发生这种情况时,你检查是否存在下一个碰撞盒子,添加一个与第一个盒子大小相同的新碰撞点, 运动的方向。