2D软体:Gelly和可塑性?

18
我正在使用Matter.js物理引擎尝试创建软体。我能够创建如下图所示的身体:

matter.js soft body

然而,我不确定这是否就是我想要的“软体”。虽然这个物体并非完全刚性,并且碰撞和被拖动时具有弹性感,但我正在寻找一种类似于凝胶的物体。这张图片可能有助于直观地解释概念:

wanted-gelly-body

我想知道如何制作这些类型的物体。是与matter.js软体相同,但具有非常特定的属性吗?我只能让身体变得有点刚性-方形,而不像我想要的那样可塑和圆形。
我还对通过游戏内交互来操纵物理身体感兴趣,这将增加或减小物理身体大小,这再次导致我得出结论,我想要的类型的身体必须相当可塑。
Matter.js能否处理这个问题,还是我必须更改物理引擎?有什么解决方法来解决这个问题吗?
注意:我正在使用Phaser.js进行一些游戏内组件,但是使用Matter.js物理引擎进行物理操作,因为我相信Phaser集成的物理引擎无法模拟这种复杂的身体。
谢谢
编辑:这非常类似于Box2d:roll soft body ball。 我猜只需使用js引擎就可以做到这一点。有吗?

3
你应该添加你尝试使用的 matter.js 代码,这样如果有人知道如何调整它以使其按照你想要的方式运行,他们就能提供相关信息。目前这个问题比较宽泛,可能会因为没有提供代码而得到负评。也许有人看了你的代码和你想做什么后会确认 matter.js 行不通,但如果没有放上代码,人们可能甚至都不会尝试帮助。 - Rodger
1
@PhasedEvolution 我明白你的意思。实际上可能并不是这样。但是有很多人看到一个问题,没有看到任何代码,就会将其投票否决并离开。指南建议包含代码,许多人认为如果他们有限的时间来帮助别人,他们会去找那些遵循指示的人。这只是一个建议,可以帮助你在吸引需要关注问题的人方面占据优势。:-) 不确定 http://softwarerecs.stackexchange.com 是否适合寻找 js 引擎。请查看如何在那里发布以及他们提供的帮助。 - Rodger
1
@Rodger 我会看看我能做什么。从更有经验的用户那里得到好的建议也是很好的。谢谢 :) - Kunis
1
我不熟悉phaser框架,但你的模型原则上没有问题(例如,应该能够产生类似于你想要的结果)。 然而,你似乎在寻找“可塑性”,这意味着身体的变形会被保留。 - pingul
1
@PhasedEvolution:也许你想要的是一种数学结构,叫做metaballs。搜索“javascript metaballs”可以找到各种不同的实现方式。我认为这个特别有见地。 - Geert-Jan
显示剩余2条评论
1个回答

8

正如我在评论中提到的,我不熟悉phaser或者你如何在JavaScript框架内实现这个。我的目标是给你一些不同方案的想法,希望你能发现这个答案有用。


我会尝试回答:

我想知道如何制作这种类型的物体。...我只能得到一个有点僵硬的正方形身体,而不是像我想要的那样可塑和圆形。

根据这个句子,你想要什么并不明确。如我在评论中所述,我认为你正在寻找的是可塑性,并且我将描述一种使用相对简单的工具可能“欺骗”这种外观的方法。

目前,你通过"事实上,当它碰撞和被拖动时,这个物体并不完全僵硬,并具有弹性感。"来描述你的物体运动。目前你的模型是这样的:

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

上述步骤中最有趣的部分是第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:通过在变形过程中重新网格化身体来创建可塑形状。获取精确的期望物理行为可能有些棘手,但应该可以创建类似“果冻”的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接