【问题标题】:Non-Rigid Body 2D Physics Engines in C++C++ 中的非刚体 2D 物理引擎
【发布时间】:2011-03-17 04:49:49
【问题描述】:

我正在尝试在 C++ 中使用 2D 物理引擎。到目前为止,似乎最受欢迎的是 Box2D。不幸的是,Box2D 是一个刚体实体物理引擎,它并不能真正帮助我实现我想要尝试的东西。

我希望能够定义一个形状,该形状有许多由弹簧连接的顶点,这样当这个形状与刚性或其他非刚性形状碰撞时,它的形状将是灵活的。

现在我试着想办法在 Box2D 中只使用刚体来做到这一点,但似乎总是有缺陷:

  1. 为灵活形状的外边缘使用矩形或线段。这些将与其他形状发生碰撞。不幸的是,它们没有弹性,因此看不到预期的效果。
  2. 形状的每个顶点都可以是具有自己的小圆形形状的主体。然后这些物体可以通过弹簧连接在一起。这在形状变形方面效果很好,但想象一下,如果形状落在刚性尖峰上并且尖峰刚刚在顶点之间通过。然后形状会卡在钉子上。

那么在 C++ 中做这种物理的最好方法是什么?最好不必编写整个物理引擎。也许我只是缺少 Box2D 的一个功能。也许这不是正确的选择。那么什么才是正确的选择呢?

【问题讨论】:

    标签: c++ box2d physics point


    【解决方案1】:

    有几个支持可变形/软体的包/引擎。如果您想要免费的东西,例如可以查看PhyzSOFABullet

    wikipedia 上有详细列表。其中大部分是基于 3D 的,但您可以通过将场景设置为平面来将它们调整为 2D 模型。

    编码愉快!

    【讨论】:

      【解决方案2】:

      我认为Dax Phyz 具有二维和软体。

      【讨论】:

        【解决方案3】:

        如果您只是在寻找变形,我建议使用多边形模型(trimesh),在该模型中我会捕捉到代表该形状的刚体的碰撞回调。在碰撞点上,我将确定对一个或多个顶点造成的变形量。

        对于不变形,我建议您在每个时间步中迭代变形点并尝试将它们向外推。我想查询可以通过碰撞世界中非常小的球体查询来完成。这还需要您保持“最大”不变形位置。

        此方法实施起来相当简单,尽管它不是您正在寻找的“软体”。 http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/ 似乎是一个提供您可能想要查看的源代码的实现。

        【讨论】:

          【解决方案4】:

          我真的不知道什么是最好的方法,但是here,页面末尾附近是“弹簧”的代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-10
            • 2015-09-20
            • 1970-01-01
            • 2011-03-02
            • 1970-01-01
            • 2012-06-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多