2016-11-02 106 views
2

我为了模拟一下“流体机构”使用Phaser.js和P2物理学。您可以在this示例中看到创建了一种流体(约翰沃森的学分)。唯一可能的交互是鼠标移动。做多部分“流体体”作为一个单一的机构

我已经注意到一些有趣的特性,可能会帮助我得到什么我假装这是恢复原状,重力阻尼。所有这些都包含在示例中。

// 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; 

一些研究和反射我的结论是,所述主体我寻求必须比实例体这意味着更多的联合在此之后,在一定限度内,与所述主体(中心的中心的方向上的力+ - 应该适用于所有造成身体的“小身体”。我想即使我用光标移动整个身体,它也会一起移动。总体效应我想是一个桩型体形式(对上部和更多的质量上的底部部分的质量小): basic illustration

为身体失去质量应该施加到的外力的唯一方式超越抵抗力量保持身体团结的身体。

即使researcing相当长一段时间,我似乎在这个问题上非常失落后...

  • 我应该从字面上选择P2力(我相信存在)?
  • 我应该使用弹簧来连接所有的小天体? (springs
  • 我怎么会总是得到“身体的中心”?

谢谢。

回答

1

声明:我没有使用Phaser.js,所以我不能帮你的框架。然而,我会尽力分享我对这个问题的一些看法,并希望它能帮助你。

我最近写了关于可塑性(这可能是你的兴趣)this的答案,但你想要的是略有不同。


仿真

首先,让我们来讨论一些关于你的表现进行仿真。你写的“流体机构”,但是从我的代码示例中看到的是什么液体 - 这是一个纯粹的粒子模拟与“骗”的物理特性,来自于(1)颗粒的自动阻尼和(2)的restitution在正常说话装置与所述物体的碰撞如何弹性是(例如,在这种情况下,0.8值意味着动能的20%损失与每一次碰撞)。所以基本上,我们有一个有很多阻尼的粒子模拟。

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

您的问题

如果我真的选择P2力(我相信存在)?

我其实不确定这是什么意思,但我猜它是Phaser相关的。

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

号如果使用弹性势能来计算,你会得到一个弹性体从可塑性这是你在找什么不同的力量。你使用的其他功能将完全决定你的模拟行为,所以这个想法会有很多的实验。

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

F(i) = F_constant*(x_cm - x[i]) 

纯线性函数。 F_constant是一些(恒定)系数。远处的粒子将比附近的粒子受到更大的力。然后,您将计算所有粒子的这个力,并相应地应用它。

我将如何获得“身体中心”?

身体的质量中心是直接计算。在伪代码,它看起来是这样的:

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 

公式是难以很好地显示在这里,但它只是作为wikipedia相同。


另一种可能性

这个答案已经很长,而只是一个整理思路。从我的角度来看,这听起来像是你想要类似于沙子的东西(即它是一个类似于你所展示的粒子模拟,但它也堆积如山)。模拟沙子的常见方法是通过上面的精确模拟,但是摩擦力会添加到颗粒上。如果这可能与Phaser有关,我不知道,但我希望这很容易做到。


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

+0

嘿。自从你回答以来已经有一段时间了。这是一个很好的答案顺便说一句。到现在为止,我没有机会问我想要什么。那么我理解你的逻辑(我不赞成物理,但我想我知道了)。我遇到的困难之一是将其转化为代码......这与问题本身并无太大关系,但既然您的回答非常好,我认为您可能会将我带到某个地方。你如何操作编程中的物理力量......我猜想有人已经完成了这项工作,我会与之互动?我不确定我是否足够清晰 – DigitalEvolution

+1

@Tojó查看链接中的'GameState.prototype.update'功能。你看到他们改变了'droplet.body.velocity'。从力量到速度,记住'F = m * a'和'a = v *Δt' - >'v = F /(m *Δt)'。也就是说,如果计算出某个力F,则可以通过将力与粒子质量相除以及自上次更新以来的时间来找到相应的速度变化。 – pingul

相关问题