javascript - 二维软体 : Gelly and moldable?

标签 javascript physics game-physics phaser-framework matter.js

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

matter.js soft body

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

wanted-gelly-body

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

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

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

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

谢谢

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

最佳答案

正如我在评论中提到的,我不熟悉 Phaser 或您如何在 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.

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

此刻,您用“的确,这个 body 并不是完全僵硬的,并且在碰撞和被拖拽时有弹性的感觉。”。目前你的模型是这样工作的:

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

上述步骤中最有趣的部分是nr 2,因为它会极大地影响整个 body 的运动。一种非常常见的实现方式是作为弹性势,对于两点之间的特定距离,会产生一些。像这样:

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)

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

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


长话短说: 通过在变形过程中重新网格化您的 body 来创建“可塑”形状。获得确切的所需物理行为可能很棘手,但应该可以创造出看起来“凝胶状”的东西。

关于javascript - 二维软体 : Gelly and moldable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074482/

相关文章:

javascript - 如何使用 JavaScript 更改网址

javascript - 如何在没有类实例的情况下获取类的属性名称?

python - 旋转二维物体的功能?

c++ - 子弹物理学 : Body moves after fall (shakes and moves to the side)

swift - 动态 View 取决于自由形式移动的 View 数量

javascript - 如何用 Promises 写这个?

javascript - 使用 Javascript 的高级 Array.prototype.filter

ruby - 用于在 Ruby 中转换物理单位(千克、磅)的库?

c++ - 数组馈送函数消耗的内存

c# - Unity 3D 碰撞检测