Javascript “制作一个多部分的”;流体体“;合二为一

Javascript “制作一个多部分的”;流体体“;合二为一,javascript,physics,phaser-framework,fluid-dynamics,Javascript,Physics,Phaser Framework,Fluid Dynamics,我使用Phaser.js及其p2物理来模拟什么是“流体”。您可以在示例中看到创建了一种流体体(归功于John Watson)。唯一可能的交互是鼠标移动 我注意到了一些有趣的性质,它们可能帮助我得到我假装的东西,即恢复力、重力和阻尼。所有这些都包含在所示示例中 // Add a force that slows down the droplet over time droplet.body.damping = 0.3; // Add bounciness and gravity th

我使用Phaser.js及其p2物理来模拟什么是“流体”。您可以在示例中看到创建了一种流体体(归功于John Watson)。唯一可能的交互是鼠标移动

我注意到了一些有趣的性质,它们可能帮助我得到我假装的东西,即恢复力、重力和阻尼。所有这些都包含在所示示例中

// Add a force that slows down the droplet over time
   droplet.body.damping = 0.3;

// Add bounciness and gravity
   this.game.physics.p2.restitution = 0.8;
   this.game.physics.p2.gravity.y = 250;
经过一些研究和反思后,我得出结论,我所寻求的身体必须比示例身体更团结,这意味着,在一定范围内,应向身体中心(身体中心+-身体顶部)的方向施加一个力,以形成身体的所有“小身体”。我想在达到这个目标后,即使我用光标移动整个身体,它也会一起移动。我想要的整体效果是桩型车身(上部质量较小,底部质量较大):

身体失去质量的唯一途径应该是施加在身体上的外力超过保持身体团结的阻力

即使在研究了很长一段时间后,我似乎对这件事很茫然

  • 我真的应该选择p2力吗(我相信这是存在的)
  • 我应该用弹簧连接所有的小物体吗?()
  • 我怎样才能始终得到“身体的中心”

谢谢。

免责声明:我没有使用Phaser.js,因此我无法帮助您使用该框架。不过,我会尝试分享我对这个问题的一些想法,希望它能帮助你

我最近写了关于可塑性的答案(你们可能会感兴趣),但你们想要的略有不同


模拟

首先,让我们谈谈您展示的模拟。你写的是“流体体”,但从代码示例中我看到的不是流体——它是一个纯粒子模拟,具有“欺骗”的物理特性,来自(1)粒子的自动阻尼和(2)在正常情况下意味着与对象的碰撞有多大的弹性(例如,本例中的
0.8
值意味着每次碰撞都会损失20%的动能)。因此,基本上,我们有一个具有大量阻尼的粒子模拟

这会产生一些看起来像“流体”的东西,这真的很酷,但我的猜测是这也是由于渲染(例如,将粒子显示为小圆盘而不是模糊的东西,它看起来会更像你所期望的)

您的问题

我真的应该选择p2力吗(我相信这是存在的)

我实际上不确定这意味着什么,但我猜这与相位器有关

我应该用弹簧连接所有的小物体吗?(弹簧)

不。如果你使用弹性势来计算力,你会得到一个弹性体,不同于你所寻找的塑性。你使用的其他函数将完全决定你模拟的行为,因此按照这个想法,会有很多实验

如果
x_cm
是质心的位置(矢量),而
x[i]
是粒子
i
的位置,则一个示例可以是:

F(i) = F_constant*(x_cm - x[i])
一个纯线性函数。
F_常数
是一些(常数)系数。远处的粒子将受到比附近粒子更大的力。然后,您将计算所有粒子的力,并相应地应用它

我怎样才能始终得到“身体的中心”

物体的质心是直接向前计算的。在伪代码中,它如下所示:

var x_cm
var total_mass = 0
for each particle p:
    total_mass += p.mass()
    x_cm += p.mass()*p.position()
x_cm /= total_mass
这里很难很好地显示公式,但它与上所述的相同


另一种可能性

这个答案已经很长了,但只是一个结束性的想法。从我的角度来看,听起来你想要类似于沙子的东西(也就是说,这是一个类似于你展示的粒子模拟,但它也堆积起来)。一种常见的模拟沙子的方法是通过如上所述的精确模拟,但在粒子中添加了摩擦力。如果这可以通过Phaser实现,我不知道,但我认为这很容易实现



编辑:在最后一句中有一个输入错误。通过在示例模拟中添加摩擦力,用Phaser模拟沙子应该很容易。

嘿。你已经有一段时间没有回答了。顺便说一句,这是一个很好的回答。我直到现在才有机会问我想要什么。我理解你的逻辑(我不擅长物理,但我想我明白了).我面临的困难之一是将其转换为代码…这与问题本身没有多大关系,但既然你回答得很好,我想你可能会带我到某个地方。例如,你如何在编程中操纵物理力…我猜有人已经做了这项工作,我会与之互动?我是不知道我是否清楚enough@Tojó查看链接中的
GameState.prototype.update
函数。在这里,您可以看到它们更改了
droplet.body.velocity
。要从强制转换为速度,请记住
F=m*a
a=v*∆t
-->
v=F/(m)*∆t) 
。也就是说,如果计算某个力F,通过将该力除以粒子质量和上次更新以来的时间,可以找到相应的速度变化。