【问题标题】:physics engine with multiple object groups具有多个对象组的物理引擎
【发布时间】:2018-10-16 13:59:27
【问题描述】:

我的 java 应用程序需要一个用于水平世界的 2d 物理引擎,但是,看看 jbox2d 和 dyn4j,它们似乎没有提供我需要的开箱即用的东西。具体来说,它们不支持定义哪些对象组可以与其他对象组发生冲突。考虑这个简化的模型:子弹可以与盒子碰撞。飞机穿过盒子,但它们可以与子弹相撞。

如何在物理引擎中排除某些对象组碰撞?

【问题讨论】:

  • 如果你正在尝试制作游戏,我推荐 Unity,这种东西已经为你实现了。如果你想使用 java 和这个特定的引擎,你可以定义你自己的碰撞函数,只检查你想要的对象的碰撞
  • 谢谢!这是一个无头服务器,我需要坚持使用 JVM 堆栈。至于你的建议,能否详细说明?即使我在事件处理程序中检查它们的类型,我如何防止飞机从盒子弹起?
  • 友情提醒:投反对票的人应该考虑添加评论来解释应该改进的地方。
  • 这个问题过于宽泛且基于观点。

标签: java physics-engine


【解决方案1】:

box2d(和 jbox2d 分别)有一个解决方案。 “PreSolve”方法允许在碰撞前禁用接触。请参阅this question on gamedev,它与此处描述的问题几乎相同。

来自文档:

预解决事件

这在碰撞检测之后、碰撞解决之前调用。这使您有机会根据当前配置禁用联系人。例如,您可以使用此回调并调用 b2Contact::SetEnabled(false) 来实现单向平台。每次通过碰撞处理都会重新启用接触,因此您需要在每个时间步禁用接触。由于连续的碰撞检测,每次接触的每个时间步长可能会触发多次预求解事件。

【讨论】:

  • 有关链接请参阅How to Answer。提供解决方案的小s​​n-p。
【解决方案2】:

Dyn4j 有CategoryFilter。您创建具有两个 long 的 CategoryFilters 并将它们设置在您的 Fixtures 中。过滤器的工作方式有点有趣,因为类别和掩码以其二进制形式用于确定谁可以与谁发生冲突。要在实践中看到这一点,请查看来自 Dyn4j 存储库的 @Test。 Dyn4j 在docs 中也提到了这一点:

提供了三种过滤器实现,Filter.DEFAULT_FILTER、CategoryFilter(就像Box2D的碰撞过滤器,int category + mask)和TypeFilter。

所以我假设 Box2D 也有这个(以及扩展的 jBox2d)。我想说的是,任何 Box2D 或 Dyn4j 级别的物理引擎都会以某种形式拥有这种能力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2011-01-22
    • 2018-08-16
    相关资源
    最近更新 更多