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

问题描述 投票:0回答:4

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

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

现在我尝试想出仅使用刚体在 Box2D 中执行此操作的方法,但似乎总是存在缺陷:

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

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

c++ physics box2d point physics-engine
4个回答
3
投票

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

wikipedia 上有详细列表。其中大多数都是基于 3D 的,但您可以通过将场景设置为平面来使它们适应 2D 模型。

编码快乐!


1
投票

我认为 Dax Phyz 既有 2D 又有软体。


1
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.