2

我正在使用 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 部队(我相信存在)吗?
  • 我应该用弹簧连接所有的小物体吗?(弹簧
  • 我怎么总能得到“身体的中心”?

谢谢。

4

1 回答 1

1

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

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


模拟

首先,让我们谈谈您展示的模拟。您编写“流体体”,但从我在代码示例中看到的内容来看,它没有任何流体——它是一个纯粒子模拟,具有来自 (1) 粒子的自动阻尼和 (2)恢复的“欺骗”物理特性通常来说,这意味着与物体碰撞的弹性有多大(例如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 模拟沙子应该很容易。

于 2016-11-03T12:18:37.157 回答