代码之家  ›  专栏  ›  技术社区  ›  Joseph Mansfield

C++中的非刚体2D物理引擎

  •  8
  • Joseph Mansfield  · 技术社区  · 14 年前

    我正在尝试用C++中的2D物理引擎进行实验。到目前为止,似乎最流行的是box2d。不幸的是,box2d是 固执的 身体物理引擎,这并不能帮助我做我想尝试的事情。

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

    现在我已经尝试在box2d中只使用刚体来实现这一点,但似乎总是存在缺陷:

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

    那么C++中最好的物理方法是什么呢?最好不用编写整个物理引擎。也许我错过了box2d的一个功能,也许这不是正确的选择。那么,正确的选择是什么呢?

    4 回复  |  直到 11 年前
        1
  •  3
  •   Staffan E    14 年前

    有几个软件包/引擎支持变形/软体。如果你想要免费的东西,你可以去看看。 Phyz , SOFA Bullet .

    有一个详细的清单 wikipedia . 其中大多数都是基于三维的,但可以通过将场景设置为平面来将其适应二维模型。

    快乐编码!

        2
  •  1
  •   Escargot    14 年前

    我想 Dax Phyz 具有二维和柔体。

        3
  •  1
  •   Tim Cooper    13 年前

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

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

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

        4
  •  0
  •   Dr. belisarius    14 年前

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