二维软体:凝胶状和可塑性?

2D soft bodies: Gelly and moldable?

我正在使用 Matter.js 物理学来尝试创建软体。我能够像这样创建 body:

不过我不确定这是否是我想要的"soft body"。的确,这个 body 并不是完全刚性的,并且在碰撞和被拖动时具有弹性的感觉。我一直在寻找与凝胶有相似之处的 body。这张图片可能在视觉上有助于解释这个概念:

我想知道如何制作这些类型的身体。它与 as matter.js soft body 相同但具有非常特定类型的属性吗?我只能让 body 变得有点 rigid-squared 而不是像我希望的那样可塑和圆形。

我也对通过 in-game 相互作用来操纵物理 body 感兴趣,这会增加或减小物理 body 的大小,这让我再次得出结论body我想要的一定是可塑的。

matter.js 可以解决这个问题还是我必须更改物理引擎?有解决这个问题的方法吗?

注意:我对某些 in-game 组件使用 Phaser.js,但对物理操作使用 matter.js 物理,因为我相信 Phaser 集成物理无法模拟这种类型的复杂 body.

谢谢

编辑:它与此非常相似Box2d :roll soft body ball。我猜我只需要用一个 js 引擎来做到这一点。有没有?

正如我在评论中提到的,我不熟悉移相器,也不熟悉如何在 Javascript 框架内实际实现它。我的目标可能是为您提供一些关于不同方法的想法,希望您会发现这个答案有用。


我会尽量回答这个问题:

I was wondering how these type of bodies can be made. ... I can only get the body to be kind of rigid-squared and not as moldable and circular as I would like it to be.

这句话不一定清楚你想要什么。正如我在评论中指出的那样,我认为 你正在寻找的是 可塑性 ,我将描述一种你可能 "cheat" ] 用一些简单的工具看起来。

目前你用“描述你的 body 的运动是真的,这个 body 并不是完全刚性的,并且在碰撞和获得时有弹性的感觉拖了。”。目前您的模型是这样工作的:

  1. 一个点连接到网格中给定的所有其他点。
  2. 每个时间步,计算每对之间的力。关节(或点)上的总力是所有这些成对力的总和。
  3. 每个关节都与 body 的一部分相关联(即它有一定的质量 m),你可以用 acceleration = force/m 计算它的加速度。从那里我们计算 velocity 最后 position.

上述步骤中最有趣的部分是nr 2,因为它会极大地影响整体的运动body。一个非常常见的实现方式是作为一个 弹性势能 ,对于两点之间的某个 distance 给出一些 force。像这样:

function elasticPotential(p1, p2) {
    // Given two positions p1 and p2 we calculate a force between them
    distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2) + pow(p1.z - p2.z, 2));
    force = force_given_distance(distance); // A popular choice here is for example a spring force
    return force;
}

现在,您的框架中已经内置了上述功能,因此您不必再实现它。我之所以这样描述,是因为它对于理解我们如何创造可塑性至关重要。上面的问题是没有什么会保持变形---弹性势的本质是它有一些静止配置(很可能你的第一个配置),它总是会尝试回到那个形状。我们希望形状 记住 它是如何 mis-shaped 的。这就是可塑性。

简单可塑性

首先请注意,可塑性问题是一个很大的研究课题,在许多情况下远非微不足道。我的想法是:如果两个连接点之间的距离大于某个阈值,重新网格化当前配置中的点。也就是说,

for each pair(p1, p2):
    if distance(p1, p2) > threshold:
        recalculate_connection(p1, p2)

如您所见,这是一个非常简单的可塑性模型,很可能在物理上不正确。但是,我应该可以通过重新网格化以及您选择的弹性势能获得有趣的行为。

如果您提供更多详细信息,我也许可以进一步讨论这个问题,但现在我觉得这个答案已经比应该的要长了。


长话短说: 通过在变形期间重新划分 body 的网格来创建 "moldable" 形状。获得确切的所需物理行为可能很棘手,但应该可以创建看起来 "gelly-like".

的东西