在Box 2D中模拟一袋液体

问题描述:

我将如何对Box 2D中的流体袋进行建模,即什么物理方程式可用于建模?触摸时,水袋可以移动,但这是唯一的互动。任何地方方程式或模型将非常感激!在Box 2D中模拟一袋液体

+0

你需要做什么? – bigcodeszzer

+0

你或许可以建立一些像这​​样的行为,但它取决于你需要它的东西。如果它只是图形,或者如果你需要碰撞。它需要多准确,等等 – bigcodeszzer

+0

@bigcodeszzer它是为了碰撞和与用户的互动,所以碰撞是必要的 –

您可以为此使用一个库。谷歌的LiquidFun相当不错http://google.github.io/liquidfun/

User99345的答案是我会去的液体袋模型的方式,但如果你想使用未修改的Box2D库,您可以使用b2EdgeShape情况下,b2RevoluteJoint模拟它, b2CircleShape。无论这是一个足够好的方法来模拟它,你必须做出决定。

其他基础/洞察这个...

看到你的问题后,我把一个模型的液体袋为my dev branch of my fork of Box2D一个试验平台演示。该演示被称为“磁盘袋”,因为这基本上是演示模型的内容,它在文件BagOfDisks.hpp中。该代码使用一系列由旋转关节连接的边缘形状来模拟可变形容器,并用圆形填充(在我的叉子中称为DiskShape)以模拟液体。如果您构建叉子的库和测试平台,您可以亲自看看模型的外观。

由于液体袋的模式,我认为我鞭打在一起的代码有类似的缺点意见如下:

  • 它必须计算比使用像谷歌的LiquidFun粒子模拟效率较低确实。
  • 我不相信在Box2D(或我的叉子)中实现的关节总能确保遏制。这是因为我不认为关节能够100%防止连接形状的替代移动。
  • 在演示中的“包”并不像它的顶部那样均匀地平放,就像我期望一个普通的液体袋一样。
  • 这个“包”不能塑造我期望袋子顶部所要做的浮力。

我认为可以从用户级别完成事情以改善模型的行为,但我怀疑从用户级别可以做的更少以提高模型的速度。按照用户级别,我的意思是作为Box2D库的用户。

虽然我的fork已经对Box2D库进行了很多更改(特别是在命名上),但我不相信我在演示本身中所做的操作不能使用原始Box2D库和语法进行非常接近的复制我在第一段中使用了b2EdgeShape,b2RevoluteJointb2CircleShape的实例。

至于在Box2D已经使用的方程之外对什么物理方程式进行建模会有用,我很遗憾地说现在我不知道。然而,我对此感兴趣,并且正在研究它。物理方程当然是可用的,但是我从Box2D用户级别知道的最接近的相关工作是iforce2d放在他的Buoyancy网页中。

希望这个答案有助于对已经说过的内容有帮助。