将 multi-part "fluid body" 作为单曲 body
Make a multi-part "fluid body" act as one single body
我正在使用 Phaser.js 及其 p2 物理来模拟 "fluid bodies"。您可以在 this 示例中看到创建了一种流体 body(归功于 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;
经过一些研究和反思,我得出结论,我所寻求的body一定比body的例子更统一,这意味着在一定范围内,一个力的中心方向body(body 的中心 +- 顶部)应该应用于构成 body 的所有 "small bodies"。我想在实现这一点之后,即使我用光标移动整个 body,它也会一起移动。我想要的整体效果是 pile-type body 形式(上部质量较小,底部质量较大):
body 失去质量的唯一方法应该是施加到 body 的外力超过保持 body 统一的阻力。
即使在研究了一段时间之后,我似乎也对这件事很迷茫......
- 我真的应该选择 p2 部队(我相信它存在)吗?
- 我应该用弹簧连接所有的小物体吗? (springs)
- 我怎么总能得到 "center of the body"?
谢谢。
免责声明:我没用过Phaser.js,所以没法帮你做框架。不过,我会尝试分享我对这个问题的一些想法,希望它能对你有所帮助。
我最近写了 this 关于可塑性的回答(您可能会感兴趣),但您想要的略有不同。
仿真
首先,让我们谈谈您展示的模拟。您编写了 "fluid bodies",但从我在代码示例中看到的内容来看,它没有任何流动性——它是具有 "cheated" 物理特性的纯粒子模拟,这些物理特性来自 (1) 粒子的自动阻尼和 (2 ) restitution 在正常情况下表示与 object 的碰撞有多大弹性(例如,在这种情况下 0.8
值表示每次碰撞都会损失 20% 的动能) .所以基本上,我们有一个带有很多阻尼的粒子模拟。
这会产生看起来 'fluid like' 的东西真的很酷,但我猜这也是由于渲染(例如,将粒子显示为小圆盘而不是模糊的东西,它看起来会更像你所期望的)。
您的问题
Should I literally opt for p2 forces ( I believe that exists ) ?
我其实不确定这是什么意思,但我猜它与 Phaser 相关。
Should I use springs to connect all the small bodies? (springs)
没有。如果您使用弹性势来计算力,您将获得 弹性 body,这与您正在寻找的可塑性不同。您使用的其他功能将完全决定您的模拟行为,因此按照这个想法进行大量实验。
如果x_cm
是到质心的位置(矢量),x[i]
是粒子的位置i
,那么一个例子可以是:
F(i) = F_constant*(x_cm - x[i])
纯线性函数。 F_constant
是一些(常数)系数。距离较远的粒子将比附近的粒子受到更大的力。然后,您将为所有粒子计算此力,并相应地应用它。
How would I always get the "center of the body"?
body 的质心可以直接计算。在伪代码中它看起来像这样:
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 模拟沙子应该很容易。
我正在使用 Phaser.js 及其 p2 物理来模拟 "fluid bodies"。您可以在 this 示例中看到创建了一种流体 body(归功于 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;
经过一些研究和反思,我得出结论,我所寻求的body一定比body的例子更统一,这意味着在一定范围内,一个力的中心方向body(body 的中心 +- 顶部)应该应用于构成 body 的所有 "small bodies"。我想在实现这一点之后,即使我用光标移动整个 body,它也会一起移动。我想要的整体效果是 pile-type body 形式(上部质量较小,底部质量较大):
body 失去质量的唯一方法应该是施加到 body 的外力超过保持 body 统一的阻力。
即使在研究了一段时间之后,我似乎也对这件事很迷茫......
- 我真的应该选择 p2 部队(我相信它存在)吗?
- 我应该用弹簧连接所有的小物体吗? (springs)
- 我怎么总能得到 "center of the body"?
谢谢。
免责声明:我没用过Phaser.js,所以没法帮你做框架。不过,我会尝试分享我对这个问题的一些想法,希望它能对你有所帮助。
我最近写了 this 关于可塑性的回答(您可能会感兴趣),但您想要的略有不同。
仿真
首先,让我们谈谈您展示的模拟。您编写了 "fluid bodies",但从我在代码示例中看到的内容来看,它没有任何流动性——它是具有 "cheated" 物理特性的纯粒子模拟,这些物理特性来自 (1) 粒子的自动阻尼和 (2 ) restitution 在正常情况下表示与 object 的碰撞有多大弹性(例如,在这种情况下 0.8
值表示每次碰撞都会损失 20% 的动能) .所以基本上,我们有一个带有很多阻尼的粒子模拟。
这会产生看起来 'fluid like' 的东西真的很酷,但我猜这也是由于渲染(例如,将粒子显示为小圆盘而不是模糊的东西,它看起来会更像你所期望的)。
您的问题
Should I literally opt for p2 forces ( I believe that exists ) ?
我其实不确定这是什么意思,但我猜它与 Phaser 相关。
Should I use springs to connect all the small bodies? (springs)
没有。如果您使用弹性势来计算力,您将获得 弹性 body,这与您正在寻找的可塑性不同。您使用的其他功能将完全决定您的模拟行为,因此按照这个想法进行大量实验。
如果x_cm
是到质心的位置(矢量),x[i]
是粒子的位置i
,那么一个例子可以是:
F(i) = F_constant*(x_cm - x[i])
纯线性函数。 F_constant
是一些(常数)系数。距离较远的粒子将比附近的粒子受到更大的力。然后,您将为所有粒子计算此力,并相应地应用它。
How would I always get the "center of the body"?
body 的质心可以直接计算。在伪代码中它看起来像这样:
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 模拟沙子应该很容易。