8

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

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

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

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

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

4

4 回答 4

3

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

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

快乐编码!

于 2010-07-26T14:57:00.947 回答
1

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

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

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

于 2010-07-22T00:07:05.710 回答
1

我认为Dax Phyz有 2D 和软体。

于 2011-02-24T22:52:47.830 回答
0

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

于 2010-07-20T05:28:47.290 回答