Box2d为什么物理碰撞不完美?

时间:2014-05-17 16:34:59

标签: java libgdx box2d collision-detection physics

我用java和box2d运行了一些测试,我通过调试发现碰撞的误差为0.015米,这个小错误会破坏一切。我想问这是否正常,因为我在任何地方都找不到任何关于这个问题的信息。更确切地说,我定义了由两个块组成的地形,它们之间有一个固定的间隙,而一个字符与那个间隙一样宽。在这两个块之间移动角色是不可能的。我得到了一些非常错误的动作,比如角色从第一个区块进入并被卡在角落里。在此之后,我打印到控制台的位置,我已经看到,当我试图碰撞两个块时,存在以下问题:位置0处的静态体(对于x以米为单位)和4(对于y以米为单位)和动态体在位置-1处抛出的块(对于x以米为单位)和4(对于以米为单位的y)与静态体在-0.01和4碰撞,实际上应该是0和4.当你试图去时,这会混淆一切通过固定的差距......有什么办法可以解决这个问题吗?我只使用box2d坐标,因此不需要像素转换(这是调试模式)。

1 个答案:

答案 0 :(得分:2)

这种不精确可能是因为box2d以离散步骤进行所有计算,因此在每个步骤中,身体将同时移动一定距离,而不是连续。由于你的角色恰好是差距的宽度,所以它很可能永远不会恰好适合这个差距。在iforce2d.net上可以找到一个很好的资源来查看box2d如何处理冲突。here。正如该教程中所示,碰撞对于正常的身体来说永远不会完全碰撞,在碰撞过程中,两个物体会略微重叠,这可能是因为间隙完全而引起你的错误运动的原因。尝试输入的角色的宽度。

现在,为了解决这个问题,你可以尝试让你的角色成为一颗子弹。对于子弹体而言,碰撞更准确,这可能有助于解决您的问题。或者,您可以在求解器的每个世界步骤中增加迭代次数,这将使一切更加精确。

//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%的时间内完成。