Java Box2d为什么不是';物理碰撞不是完美的吗?

Java Box2d为什么不是';物理碰撞不是完美的吗?,java,libgdx,box2d,collision-detection,physics,Java,Libgdx,Box2d,Collision Detection,Physics,我用java和box2d进行了一些测试,通过调试发现碰撞有0.015米的误差,这个小误差破坏了一切。我想问一下这是否正常,因为我在任何地方都没有发现关于这个问题的任何东西。更精确地说,我定义了由两个块组成的地形,它们之间有一个固定的间隙,并且一个角色正好和这个间隙一样宽。在这两个块之间移动角色是不可能的。我做了一些非常糟糕的动作,比如角色进入第一个街区,被卡在角落里。在这之后,我将位置打印到控制台上,我看到当我试图碰撞两个块时,会出现以下问题:位置0处的静态体(对于x英寸米)和位置4处的静态体(

我用java和box2d进行了一些测试,通过调试发现碰撞有0.015米的误差,这个小误差破坏了一切。我想问一下这是否正常,因为我在任何地方都没有发现关于这个问题的任何东西。更精确地说,我定义了由两个块组成的地形,它们之间有一个固定的间隙,并且一个角色正好和这个间隙一样宽。在这两个块之间移动角色是不可能的。我做了一些非常糟糕的动作,比如角色进入第一个街区,被卡在角落里。在这之后,我将位置打印到控制台上,我看到当我试图碰撞两个块时,会出现以下问题:位置0处的静态体(对于x英寸米)和位置4处的静态体(对于y英寸米)以及位置-1处的动态体(对于x英寸米)和位置4处的动态体(对于y英寸米)在-0.01和4处与静态实体碰撞,实际应为0和4。当你试图通过一个固定的间隙时,这会把一切都搞砸。。。有什么办法解决这个问题吗?我只使用了box2d坐标,因此不需要进行像素转换(这是调试模式)。

这种不精确可能是因为box2d以离散的步骤进行所有计算,因此在每一步中,物体将一次性移动一定的距离,而不是连续移动。因为你的角色正好是这个间隙的宽度,所以它不太可能恰好位于这个间隙之间。可以在iforce2d.net上找到一个很好的资源来研究box2d如何准确地处理冲突。正如该教程中所示,碰撞对于正常身体来说从来都不是精确的,在碰撞过程中,两个身体会稍微重叠,这可能是导致小车移动的原因,因为间隙正好是试图进入的角色的宽度

现在,为了解决这个问题,你可以试着让你的角色成为子弹。碰撞对于子弹体来说更加精确,这可能有助于解决您的问题。或者,您可以在解算器的每个世界步骤中增加迭代次数,这将使所有内容更加精确

//Increase velocityIterations and positionIterations for increased precision
//Decreasing the timeStep could also help, but that would slow down everything as well
b2World.step(timeStep, velocityIterations, positionIterations);

然而,你很可能不得不采取非常轻微地扩大差距,或者非常轻微地减小角色的宽度,因为用一个以离散步骤工作的物理引擎来获得精确的东西似乎永远不会100%的成功。

不需要任何额外的信息。我得到的答案是正确的。物理效果并不完美,如果你自己移动角色并阻止旋转,你仍然可以通过间隙,这样你的角色就不会左右移动。这是导致间隙问题的一个问题,另一个问题是碰撞,通过我从8修改到900的迭代次数,可以获得更高的质量。这解决了我的问题。谢谢你的帮助。是的,这是预期的行为。如果您阅读了Box2D手册,其中提到形状的大小应为1个单位左右,以获得最佳效果。我建议放大物理世界,使你的播放器达到这个尺寸。我将物理世界放大到1:32(米:像素)。它没有解决任何问题。我认为box2d只是一辆四轮马车。我说我将坐标打印到控制台,当物体碰撞时,它们边缘的坐标没有相同的坐标。请阅读手册末尾标题为“限制”的部分:另请参阅本页的第二个问题: