【问题标题】:2D soft bodies: Gelly and moldable?2D 软体:凝胶和可塑?
【发布时间】:2016-10-16 19:25:16
【问题描述】:

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

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

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

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

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

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

谢谢

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

【问题讨论】:

  • 您应该添加您用来尝试此操作的 matter.js 代码,这样如果有人确实知道如何调整它以使其按照您想要的方式运行,他们将能够提供该信息。目前这个问题非常广泛,并且可能会因为不提供代码而被否决。可能知道的人会查看您的代码和您正在尝试执行的操作,并确认 matter.js 无法正常工作,但如果不提出来,人们甚至不太可能尝试提供帮助。
  • @PhasedEvolution 我听到了。实际上可能不是。但是有很多人看到一个问题,没有看到任何代码,投票否决并继续前进。指导方针说要包括代码,许多人认为,如果他们帮助人们的时间有限,他们会去找遵循说明的人。只是一个建议,以帮助您将甲板堆放在对您有利的位置,以使眼睛看到需要查看的问题。 :-) 不确定softwarerecs.stackexchange.com 是否适合寻找 js 引擎。看看如何在那里发帖以及他们有什么帮助。
  • @Rodger 我会看看我能在那里做什么。从更有经验的用户那里获得好的建议也很高兴。谢谢你:)
  • 我不熟悉移相器框架,但您的模型原则上没有问题(例如,它应该能够产生类似于您想要的结果)。但是,您似乎正在寻找可塑性,这意味着保留了身体的变形。
  • @PhasedEvolution:也许接近你想要的是一个名为metaballs 的数学结构。在“javascript metaballs”中搜索各种不同的内容。我发现this one 特别有见地。

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


【解决方案1】:

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


我会试着回答这个问题:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多