2D软体:Gelly和可塑?

Dio*_*nha 14 javascript physics game-physics phaser-framework matterjs

我正在使用Matter.js物理来创建柔体.我能够创建这样的身体:

thing.js柔软的身体

但是我不确定这是否是我想要的"软体".确实,这个身体并不是完全僵硬的,并且当它碰撞并被拖拽时具有那种有弹性的感觉.我正在寻找一个与凝胶有相似之处的身体.此图像可能在视觉上有助于解释概念:

想-胶状体

我想知道如何制作这些类型的尸体.它与as matter.js软体相同,但具有非常特殊的属性类型吗?我只能让身体变得僵硬,而不是像我希望的那样可塑造和圆形.

我也很有兴趣通过游戏中的相互作用操纵物理体,这会增加或减少物理体的大小,这使我再次得出结论,我想要的身体类型必须是相当可塑的.

may.js可以处理这个还是我必须更改物理引擎?任何接近这个的解决方案?

注意:我使用Phaser.js作为一些游戏中的组件,但是物理操作的物理问题是物理操作,因为我相信Phaser集成的物理学不能模拟这种类型的复杂体.

谢谢

编辑:它非常类似于这个Box2d:滚动软体球.我想我只需要使用js引擎.有没有?

pin*_*gul 5

正如我在评论中提到的那样,我对相位器不熟悉,也不熟悉如何在Javascript框架中实际实现它。我在这里的目标可能是为您提供一些不同的前进方式的想法,因此希望您会发现此答案有用。


我将尝试回答这个问题:

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

这句话不一定很清楚你想要什么。正如我在评论中指出的那样,我认为您正在寻找的是可塑性,我将描述一种可以通过一些简单工具“欺骗”外观的方法。

此刻,您通过“您的身体的运动并不完全是刚性的,当它碰撞并被拖动时具有那种弹力的感觉。 ”。当前,您的模型按以下方式工作:

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

上面步骤中最有趣的部分是nr 2,因为它将极大地影响整个身体的运动。实现它的一种非常普遍的方法是在两点之间的某个位置产生一定的弹性势能。像这样:distanceforce

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,您已经在框架中内置了上述功能,因此您无需实现它。我之所以这样描述,是因为它对于理解我们如何创造可塑性至关重要。上面的问题是什么都不会保留变形 -弹性势的本质是它具有一些静止构型(很可能是您的第一个构型),并且它将始终尝试恢复该形状。我们希望形状记住形状是错误的。这就是可塑性。

简单可塑性

在此首先要注意的是,可塑性问题是一个重要的研究课题,在许多情况下远非轻而易举。我的想法如下:如果两个连接点之间的距离大于某个阈值,请在当前配置中刷新这些点。那是,

for each pair(p1, p2):
    if distance(p1, p2) > threshold:
        recalculate_connection(p1, p2)
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个非常简单的可塑性模型,很可能物理上不正确。但是,我可能会在进行重击时获得有趣的行为,以及选择的弹性潜力。

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


TL; DR: 在变形过程中通过重塑身体来创建“可成型”形状。获得准确的所需的物理行为可能很棘手,但是应该可以创建看起来像“凝胶状”的东西。