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、1 つの例は次のようになります。

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 に答える