Box2d body 进入另一个 body

Box2d body enters inside another body

我试图理解 Box2D,我创建了两个主体(一个地面和一个动态 body 浮动)。当受到重力影响的动态body,与地面碰撞时body,好像是在地面里面body。

这是正确的行为吗?还是我的图形渲染器有问题?

inside

这可能是 "correct" 行为,也可能不是。

它是否正确取决于似乎未提供的详细信息以及我们定义为 "correct" 的内容。诸如正在使用多少次迭代或所显示形状的 Box2D 术语中的大小和密度等详细信息。而我们的定义是否正确,是基于 Box2D 记录的行为或实体的预期物理行为。为了这个答案,我将使用以前的定义。

b2World::Step 方法可以解决重叠问题。它的位置分辨率将对身体施加脉冲,将它们驱使到身体皮肤 内的目标穿透深度。这个皮肤是一个半径远离顶点。对于多边形形状,此径向值为 b2_polygonRadius.

如果绘制了形状的蒙皮周长,那么当放大到足够大时,我们会看到形状相互重叠的部分是其蒙皮半径的一部分。这就是 Box2D 的实现方式,所以至少按照该标准,一些重叠是正确的。另一方面,如果绘制了形状的顶点和边,那么当放大到足够大时,这些形状将看起来像漂浮在彼此之上。

然而,当上圆的大小或密度明显大于下圆的大小时,我们可以看到这些行为会崩溃。

修改 Testbed "Heavy On Light" 测试代码,使大圆的半径为 50.0(而不是 5.0),而小圆的半径为 0.5 显示下面的圆圈完全重叠,如下图所示: 同时将较大圆的密度从 10.0 增加到 1000.0(而不是将其半径增加到 5.0 以上)同样也显示重叠:

Box2D 文档是这样说的:

In particular, Box2D has been tuned to work well with moving shapes between 0.1 and 10 meters. So this means objects between soup cans and buses in size should work well. Static shapes may be up to 50 meters long without trouble.

并喜欢:

The suggested iteration count for Box2D is 8 for velocity and 3 for position. You can tune this number to your liking, just keep in mind that this has a trade-off between performance and accuracy. Using fewer iterations increases performance but accuracy suffers. Likewise, using more iterations decreases performance but improves the quality of your simulation.

因此,根据 Box2D 文档,在某些设置组合中似乎可以预料到这种行为,因此您的示例图片可以被认为是正确的。正如 Netero 所建议的那样,您可以尝试增加位置迭代计数以查看是否会有所改善。在 b2World::Step 被更多调用时等待更长时间也可能减少重叠。或者改变他们的 sizes/densities.

至于你的渲染器是不是有bug,也是有可能的。同样,答案取决于未提供的详细信息。详细信息,例如执行渲染的代码的源代码。例如,如果我们看到的是渲染矩形轮廓的结果,那么您需要将其更改为渲染顶点之间的像素宽线或仅渲染由顶点定义的实体内部。