gpt4 book ai didi

javascript - 使多部分 "fluid body"充当一个单一的 body

转载 作者:行者123 更新时间:2023-11-30 00:01:20 28 4
gpt4 key购买 nike

我正在使用 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;

经过一些研究和反射(reflection),我得出结论,我寻求的 body 必须比示例 body 更统一,这意味着,在一定范围内,一个力的方向与 body 的中心(中心 + - body 顶部)应该适用于构成 body 的所有“小 body ”。我想在实现这一点之后,即使我用光标移动整个 body ,它也会一起移动。我想要的整体效果是一个桩型的体型(上部质量少,底部质量多): basic illustration

body 失去质量的唯一方法应该是施加到 body 上的外力超过保持 body 统一的阻力。

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

  • 我真的应该选择 p2 力(我相信它存在)吗?
  • 我应该使用 Spring 来连接所有的小物体吗? ( springs )
  • 我如何始终获得“ body 的中心”?

谢谢。

最佳答案

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

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


模拟

首先,让我们谈谈您展示的模拟。您编写了“流体体”,但从我在代码示例中看到的情况来看,它没有任何流体——它是具有“欺骗”物理特性的纯粒子模拟,这些特性来自 (1) 粒子的自动阻尼和 (2) restitution通常来说,这意味着与物体碰撞的弹性程度(例如,本例中的 0.8 值意味着每次碰撞都会损失 20% 的动能)。所以基本上,我们有一个带有很多阻尼的粒子模拟。

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

您的问题

Should I literally opt for p2 forces ( I believe that exists ) ?

我实际上不确定这是什么意思,但我猜它与 Phaser 相关。

Should I use springs to connect all the small bodies? (springs)

没有。如果您使用弹性势能来计算力,您将得到一个弹性体,这与您正在寻找的可塑性不同。您使用的其他功能将完全决定您的模拟行为,因此按照这个想法将进行大量实验。

如果 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 中描述的一样。


另一种可能性

这个答案已经很长了,但只是一个总结。从我的 Angular 来看,这听起来像是你想要类似于沙子的东西(即它是一种类似于你展示的粒子模拟,但它也会堆积)。模拟沙子的一种常见方法是通过上面的精确模拟,但在粒子上增加了摩擦力。我不知道 Phaser 是否可以做到这一点,但我希望它很容易做到。


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

关于javascript - 使多部分 "fluid body"充当一个单一的 body ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com