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

标签 java libgdx box2d collision-detection physics

我用java和box2d进行了一些测试,通过调试我发现碰撞有0.015米的误差,这个小误差毁了一切。我想问这是否正常,因为我在任何地方都没有找到有关此问题的任何信息。更准确地说,我定义的地形由两个 block 组成,它们之间有固定的间隙,并且角色与该间隙完全相同。在这两个 block 之间移动角色是不可能的。我得到了一些非常错误的 Action ,比如角色进入第一个方 block 并卡在它的角落里。之后,我将位置打印到控制台,我发现当我尝试碰撞两个 block 时,出现以下问题:位置 0(x 以米为单位)和 4(y 以米为单位)的静态物体和动态物体被扔到位置 -1(x 以米为单位)和 4(y 以米为单位)的方 block 与 -0.01 和 4 处的静态物体碰撞,实际上应该是 0 和 4。当你尝试去时,这会弄乱一切通过固定间隙...有什么办法解决这个问题吗?我只使用了 box2d 坐标,因此不需要像素转换(这是 Debug模式)。

最佳答案

这种不精确性可能是因为 box2d 以离散步骤进行所有计算,因此在每个步骤中,物体会同时移动一定距离,而不是连续移动。由于您的角色恰好是间隙的宽度,因此它不太可能恰好处于间隙之间的位置。可以找到一个很好的资源来研究 box2d 到底如何处理碰撞 here在 iforce2d.net。如该教程所示,对于正常物体来说,碰撞永远不会精确,在碰撞期间,两个物体会稍微重叠,这可能是导致 buggy 移动的原因,因为间隙恰好是物体的宽度尝试输入的字符。

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

//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% 成功。

关于java - Box2d 为什么物理碰撞不完美?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713701/

相关文章:

java.xml XMLConstants.FEATURE_SECURE_PROCESSING 无法解析或不是字段

java - Box2d 传感器不检测接触

objective-c - 记住 performSelector : for later in Objective-C

java - Box2d 直升机物理

java - 当我将 Controller 附加到我的 fxml 文件时,我得到一个 constructLoadException

java StreamTokenizer

java - 使用 Android 6.0(API LEVEL 23)消耗休息的最佳方式是什么

android - LibGdx 冲突

java - 无法使用 libgdx 创建正确的表

java - 用 vector 生成二维世界