Box2D 环形

Box2D Ring shape

在 Box2D 中创建环形的最佳方法是什么(环形我的意思是一个内部空 space 的动态圆圈,以便其他动态对象可以放入其中)。

感谢您的提示。

"Best"当然是见仁见智了,不过这里有一些我能想到的办法。请告诉我们(如在评论部分)您决定使用什么。我很想知道!

对于静环

如果环的形状只需要是静态的,那么用链形来构建环是可行的方法。但是,如果环需要是动态的,这听起来像你所说的,那么请继续阅读。

无内圈动环用Friction/Restitution

如果您不关心 objects 对内环的摩擦或恢复,您可以通过使用圆形作为环的外径并使用绳索接头来设置物理将你想要的任何东西限制在环内(只要关节的碰撞连接设置为假)。您只需要将关节的最大长度设置为小于圆半径的距离。这将使戒指自然滚动(因为它的外面是一个圆圈)但不会给你带来摩擦,也不会在戒指内产生相对于其概念内部的恢复效果。

对于具有完全模拟内环物理的动态环

如果环内的 objects 需要能够像任何其他具有摩擦和恢复力的表面一样与环相互作用,那么我建议的方法(除了更改 Box2D 代码本身)将是一堆多边形形状。这些都需要定位和调整大小以制作戒指并固定到单个 body.

你必须做出决定,比如用多少多边形来制作这个环,以及如何将它们拼接在一起。多边形越小,数量越多,当然结果将估计为圆环。假设您希望多边形重叠的锯齿尽可能少,您可能需要手动设置 body 质量以避免重叠 over-calculation。

您的戒指至少需要 2 * b2_polygonRadius 的最小厚度(包括其 "skin")。除此之外,您可以调整其中一个多边形尺寸的大小以匹配您想要的环的厚度。

您可能想要自己编写一个函数来确定多边形的点,您需要匹配位置大小和 angular 相对于作业 body 的方向.我可以看到用 3 边形或 4 边形制作环。使用 4 边多边形可能会产生更多的对接问题(比使用 3 边多边形),除非你减少内部点的间距(以匹配直径差异),但是连续的 4 边多边形不需要 flip-flopped喜欢三angular个。

通过修改Box2D实现动态环

如果您willing/interested正在更改 Box2D 代码,您可以:

  1. 扩展质量计算代码和碰撞代码以处理与边缘形状和链形状的碰撞。或者...
  2. 创建您自己的戒指形状类型。

鉴于我从 Box2D 中导出了一个物理 engine/library,它支持使用链形的动态环形(参见 PlayRho),我对解决这个问题有一些经验;尽管在 Box2D 之外。基于这个经验,如果你确实想修改 Box2D 代码来解决问题,我相信从第一个选择(选项 #1)开始至少是开始的方式。如果您要进行第二种选择,我认为无论如何您都需要这些经验,您最终会从中受益。

请注意,无论如何,宽相位都需要矩形(实际上是 AABB)的组合。因此,用多边形组合制作环虽然看起来内存效率低于我能想到的其他方式,但可能会在计算效率方面胜出。 YMMV。测试将是唯一确定的方法。

或者也许...

可能有人已经为 Box2D 制作了环形并为其提供了资源,但我知道的唯一形状扩展是胶囊形状。