【发布时间】:2016-01-24 20:08:37
【问题描述】:
我正在尝试理解 Box2D,并创建了两个实体(一个地面和一个动态实体浮动)。当受重力影响的动力体与地体发生碰撞时,似乎是在地体内部。
这是正确的行为吗?还是我的图形渲染器有错误?
【问题讨论】:
-
嗨,尝试增加 world.step() 函数中的 ITERATION_POSITION 参数的值
标签: box2d
我正在尝试理解 Box2D,并创建了两个实体(一个地面和一个动态实体浮动)。当受重力影响的动力体与地体发生碰撞时,似乎是在地体内部。
这是正确的行为吗?还是我的图形渲染器有错误?
【问题讨论】:
标签: box2d
这可能是“正确”的行为,也可能不是。
它是否正确取决于似乎没有提供的细节以及我们定义为“正确”的内容。详细信息,例如正在使用多少次迭代或 Box2D 中显示的形状的大小和密度。以及我们的定义是否正确,是基于 Box2D 的记录行为还是实体的预期物理行为。为了这个答案,我将使用前一个定义。
b2World::Step 方法可以解决重叠问题。它的位置分辨率将向物体施加脉冲,以驱动它们向物体皮肤内的目标穿透深度。此蒙皮距离顶点有一个半径。对于多边形形状,此径向值为b2_polygonRadius。
如果绘制了形状的蒙皮周长,那么当放大到足够大时,我们会看到这些形状彼此重叠了一小部分蒙皮半径。这就是 Box2D 的实现方式,因此至少按照该标准,一些重叠是正确的。另一方面,如果绘制了形状的顶点和边缘,那么当放大到足够大时,这些形状将看起来相互浮动。
但是,当上圆的大小或密度明显大于下圆的大小时,我们可以看到这些行为被破坏。
修改Testbed“Heavy On Light”测试代码,使大圆的半径为 50.0(而不是 5.0),而小圆的半径为 0.5,表示小圆完全重叠如下图所示: 同时,将较大圆的密度从 10.0 增加到 1000.0(而不是将其半径增加到 5.0 以上)同样也显示重叠:
Box2D 文档说:
特别是,Box2D 已经过调整,可以很好地处理 0.1 到 10 米之间的移动形状。所以这意味着汤罐和公共汽车之间的物体大小应该可以正常工作。静态形状最长可达 50 米,没有任何问题。
比如:
Box2D 的建议迭代次数是速度为 8 次,位置为 3 次。您可以根据自己的喜好调整此数字,请记住,这需要在性能和准确性之间进行权衡。使用更少的迭代可以提高性能,但准确性会受到影响。同样,使用更多迭代会降低性能,但会提高模拟质量。
因此,根据 Box2D 文档,在某些设置组合中似乎可以预期这种行为,因此您的示例图片可能被认为是正确的。正如 Netero 建议的那样,您可以尝试增加位置迭代次数,看看是否可以改善问题。在调用b2World::Step 时等待更长时间也可以减少重叠。或者改变它们的大小/密度。
至于你的渲染器是否有错误,这也是可能的。同样,答案取决于未提供的详细信息。详细信息,例如进行渲染的代码的源代码。例如,如果我们看到的是渲染矩形轮廓的结果,那么您需要将其更改为渲染顶点之间的像素宽线或仅渲染由顶点定义的实心内部。
【讨论】: