我正在使用Phaser.js及其p2物理来模拟"流体"。您可以在this示例中看到创建了一种流体(称为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;
经过一些研究和反思,我得出的结论是,我寻求的身体必须比示例身体更加团结,这意味着,在一定范围内,一个力与身体中心的方向(中心+ - 身体的顶部)应适用于所有"小型机构"那使身体。我想,即使我用光标移动整个身体,它也会实现这一目标。我想要的整体效果是桩型体形(上部质量较小,底部质量较大):
身体减肥的唯一方法应该是施加在身体上的外力,超过阻止身体团结的阻力。
即使经过一段时间的研究,我似乎也很遗憾......
感谢。
答案 0 :(得分:1)
免责声明:我没有使用Phaser.js,所以我无法帮助您使用该框架。然而,我会尝试分享我对这个问题的一些看法,希望它可以帮到你。
我最近写了this关于可塑性的答案(这可能是你感兴趣的),但你想要的却略有不同。
模拟
首先,让我们谈谈您展示的模拟。你写的是“流体”,但是从我在代码示例中看到的并不是什么流动的 - 这是一个纯粹的粒子模拟,具有“被欺骗的”物理特征,它来自(1)粒子的自动阻尼和(2){ {3}}正常说话意味着与物体碰撞的弹性(例如,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
这里很难很好地显示公式,但它与restitution中描述的相同。
另一种可能性
这个答案已经很久了,但只是一个完整的想法。从我的角度来看,听起来你想要类似于沙子的东西(即它是一个类似于你展示的粒子模拟,但它也会堆积)。模拟沙子的常用方法是通过上面的精确模拟,但是在粒子上添加了摩擦力。如果这可能与Phaser有关,我不知道,但我希望它很容易做到。
编辑:在最后一句中有一个拼写错误。使用Phaser模拟沙子,通过在示例模拟中添加摩擦力,应该很容易。