【问题标题】:Box2d - dynamic body sometimes falls through static bodyBox2d - 动态体有时会穿过静态体
【发布时间】:2021-06-29 21:15:24
【问题描述】:

我有一个带有程序生成地形的横向滚动平台类型游戏,见下文。粉红色的圆圈是玩家的动态身体,绿色区域是单个静态身体,每个瓷砖都是一个固定装置。

玩家可以通过线性脉冲左右移动和跳跃。现在,大多数情况下这都可以正常工作,但每隔一段时间,当我在玩家周围跳跃时,玩家的身体会突然部分穿过地面并卡住:

我看不出这有什么规律,它似乎只是随机发生的。玩家跌倒的程度也有很大差异,有时您只是在地形中稍微夹入一点,而其他时候您会跌倒 15 或 20 个瓷砖。

我在这里发现了类似忽略碰撞的物体问题的线程,一个建议是增加 World.step() 方法的 velocityIterations 和 positionIterations 参数。我一直在尝试,这似乎并不重要。另一个建议是将玩家身体设置为子弹。再次,尝试了它,它没有做任何事情。那么,还有其他想法吗?

【问题讨论】:

  • 我也遇到过类似的问题。你的绿色静态身体看起来像一个凹多边形。显然,Box2D 存在凹多边形碰撞问题或顶点按顺时针顺序排列的问题。这有帮助吗? stackoverflow.com/a/16733052/11278807
  • 我明白了,我想我得尝试实现链形
  • 如果您遇到重影碰撞,链条形状应该会有所帮助。但是,您还没有描述拥有这些。链形将替代在链形可以绑定的区域内拥有许多矩形。它可能有助于避免跌倒,并且可能是值得尝试的事情。粉色圆圈的m_radius是什么?如果它小于 Box2D 的优化对象,我发现您更有可能看到这些事件发生。如果它比0.1f 小,请尝试将其设置为至少0.25f。我建议先检查尺寸。

标签: java box2d jbox2d


【解决方案1】:

你应该做一些事情来合并你的盒子,这样你就可以用更少的对象覆盖填充的区域。事实上,它的效率非常低,每一个差距都是出现问题的机会,并在您报告时让您陷入困境。

您绝对应该考虑计算边界并在该边界上形成链形。这种方法还意味着您不需要合并这些框。您仍然希望找到一种方法来处理错误的链形状,但这仍然是一种更简洁的方法,此外,链上的 TOI 计算将比大量单独的小盒子更好地工作。

考虑到这一点,当您有一个快速移动的物体猛烈撞击一组静态盒子时,即使该物体被标记为子弹,系统也会尝试确保该物体将要穿透的每个盒子不会穿透它们是单独的,并按顺序计算,但这可能仍然会使动态对象最终穿透它们,因为它们都是独立的盒子!链形是一个单一的形状,不会有这个问题,但是如果动态对象确实以某种方式到达错误的位置,您仍然应该有一些备用计划。

由于这些细微差别,将静态几何体包裹在链中并在空间中填充固定装置可能很有用,并且您可以通过在事件中寻找非常明显的模式来检测“卡住”状态(如果您在每个 dt从多个静态对象获取巨大的脉冲到一个动态对象上)并相应地处理它。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2012-04-24
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多