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

9
我正在尝试在C++中使用2D物理引擎进行实验。目前,最流行的似乎是Box2D。不幸的是,Box2D是一个刚体物理引擎,这并不能真正帮助我实现想要尝试的内容。
我希望能够定义一个形状,该形状由多个由弹簧连接的顶点组成,以便当这个形状与刚性或其他非刚性形状碰撞时,其形状将是灵活的。
现在,我已经尝试了使用仅刚体在Box2D中完成此操作的方法,但总是存在缺陷:
1. 对于灵活形状的外部边缘使用矩形或线段。这些会与其他形状发生碰撞。不幸的是,它们并不具有弹簧性,因此无法看到所需的效果。
2. 形状的每个顶点可以是一个带有自己小圆形状的物体。然后,这些物体可以通过弹簧连接在一起。在形状变形方面,这个方法非常有效,但是请想象一下,如果形状落在一个刚性尖刺上,并且尖刺刚好穿过顶点之间的空隙,那么形状将被卡在尖刺上。
那么,在C++中执行这种物理操作的最佳方法是什么?最好不要编写整个物理引擎。也许我只是忽略了Box2D的某些功能。也许它并不是正确的选择。那么,什么才是正确的选择?
4个回答

3

有几个软件包/引擎支持可变形/柔软物体。如果你想要免费的,可以查看Phyz, SOFA或者Bullet

维基百科上有详细的列表。这些大多数是基于3D的,但是你可以通过将场景设置为平面来将其适应于2D模型。

祝编程愉快!


1

我认为Dax Phyz同时具有二维和软体功能。


1

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

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

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


0

我不确定什么是最好的方法,但这里在页面末尾附近有“弹簧”的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接