15

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

matter.js 软体

但是我不确定这是否是我想要的“柔软的身体”。确实,这个身体并不完全是刚性的,当它碰撞和被拖拽时会有那种有弹性的感觉。我一直在寻找与凝胶有相似之处的身体。这张图片可能在视觉上有助于解释这个概念:

想要的凝胶体

我想知道如何制作这些类型的身体。它是否与 as matter.js 软体相同,但具有非常特定类型的属性?我只能让身体成为一种刚性方形,而不是像我希望的那样可塑和圆形。

我还对通过游戏中的交互操作物理体很感兴趣,这会增加或减小物理体的大小,这让我再次得出结论,我想要的身体类型必须是完全可塑的。

matter.js 可以处理这个问题还是我必须更改物理引擎?任何解决方案来解决这个问题?

注意:我将 Phaser.js 用于一些游戏内组件,但使用 matte.js 物理进行物理操作,因为我相信 Phaser 集成物理无法模拟这种类型的复杂体。

谢谢

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

4

1 回答 1

6

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


我将尝试回答这个问题:

我想知道如何制作这些类型的身体。...我只能让身体成为一种刚性方形,而不是像我希望的那样可塑和圆形。

鉴于这句话,不一定清楚你想要什么。正如我在评论中指出的那样,我认为你正在寻找的是可塑性,我将描述一种你可以用一些简单的工具“作弊”的方法。

此刻你用“这个身体并不完全是刚性的,当它碰撞和被拖动时有那种弹性的感觉”来描述你身体的运动。目前您的模型是这样工作的:

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

上述步骤中最有趣的部分是 nr 2,因为这将极大地影响整个身体的运动。实现它的一种非常常见的方法是作为弹性势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;
}

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

简单的可塑性

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

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

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

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


TL;DR: 通过在变形过程中重新划分你的身体来创建一个“可塑”的形状。获得确切的期望物理行为可能很棘手,但应该可以创建看起来“凝胶状”的东西。

于 2016-10-24T20:58:04.473 回答