Farseerで爆弾を爆発させて、近くのオブジェクトを押しのける方法はありますか?


14

Farseerで爆弾の爆発を作成しようとしています。爆弾用の円を作成しました。ただし、爆弾が爆発した場合、爆発の巨大な力によって押し戻されるため、周囲のオブジェクト(物体)は飛び去ります。しかし、私はその力をどのように作成するかわからない-どうすればそれを行うことができますか?


Farseerには爆発を実装するサンプルが付属していることに注意してください。(現在のソース内の)「AdvancedDemo5」です。これは、Classic Thunderの優れた答えの近接方法に似ていますが、それほど洗練されていません(AABB内の固定振幅インパルス)。
アンドリューラッセル14年

回答:


28

爆発iforce2dページをチェックアウトすることをお勧めします。パフォーマンスと精度のトレードオフで爆発を処理するさまざまな方法を検討する素晴らしい仕事をします。ここで要約する3つの方法があります。ですから、これは単に私が研究中に見つけた情報を要約したものであり、それは私自身の仕事ではありません。

また、ここでは力ではなくインパルスを適用します。なぜこれを読んで理解するために。

近接法

近接法

これは、Byte56が答えで説明したのと同じ方法です。コンセプトはシンプルです。爆発ポイントを持ち、そのポイントから離れた反対方向にインパルスを適用し、距離に基づいた強さですべてのオブジェクトに影響を与えます。

長所:

  • とても早い
  • コーディングが簡単。

短所:

  • 爆発は不動の物体と静的な物体を通過します。
  • 爆風の影響エリアにあるオブジェクトは、重心までの距離のみをチェックするとスキップされる場合があります。
  • 表面積は考慮されません。
  • すべてが一度に影響を受けます。

レイキャスト法

レイキャスト法

これは非常に単純で、爆発の起点から光線を投げ出し、距離によって指示される衝撃でオブジェクトに衝突するときに衝撃を適用します。

長所:

  • 発射物の方法よりもパフォーマンスが低くなります。
  • オブジェクトによって爆発がブロックされました。
  • 考慮される表面積。

短所:

  • すべてが一度に影響を受けます。
  • 爆発が大きいほど、爆発がすべてに影響することを確認するために必要な光線が多くなります。
  • 近接法よりもパフォーマンスが集中します。

パーティクル法

パーティクル法

私の個人的なお気に入り。RaySastingの方法に似ていますが、レイの代わりに物理エンジンを活用して、シーンと相互作用する小さなペレットを吐き出します。

長所:

  • コードごとに非常に簡単。ボールを生成し、それぞれにインパルスを適用します。ティックごとに記述するコードはありません。ただし、爆発が完了した後、ボディを無効化/リセットするタイマーがあります。
  • 爆発はオブジェクトによってブロックされます。
  • 表面積が考慮されます。
  • 爆発は表面から反射します。
  • 爆発から離れたオブジェクトは、よりゆっくりと反応します。
  • パーシャルを生成する基礎としてボールを使用して、エフェクトが爆発の影響を正確に反映できるようにすることができます。

短所:

  • ティックごとの複雑さを追加します。

5
とてもいい答えです。私は特に粒子法が好きです。しかし、強力な爆発を得るのがより難しくなるようです。粒子の質量を大きくするのは簡単ですか?
マイケルハウス

1
粒子のすべての物理的側面に影響を与えることは簡単で、最も関連するのは密度、速度、および減衰です。密度を上げて高速に設定すると、コミカルに暴力的な爆発を起こすことができます。
ClassicThunder 14年

意図的に爆発粒子を減速させましたか、それともアニメーション全体が停止していますか。粒子に一定の摩擦を加えることは理にかなっています。
この14年

@self Box2Dを使用すると、オブジェクトにライナーダンピングを追加して、特定の速度で直線的に減速させることができます。これはgifで使用される手法です。
ClassicThunder 14年

1
優れた答え:)最後の方法にもう1つプロを追加します。ペレットの位置を使用して、見栄えの良い煙やほこりを描くことができます。
iforce2d 14

2
  • 爆弾の影響範囲内のすべてのオブジェクトを選択します。
  • 各オブジェクトについて
    • オブジェクトの位置と爆発の中心を使用して、衝撃のベクトルを計算します。のようなものnormalize(object - center)
    • 爆弾の中心からオブジェクトまでの距離を使用して、衝撃の大きさを計算します。何かのようなもの(object - center).length
    • 前の手順で見つかったベクトルと大きさを使用して、オブジェクトにインパルスを適用します。

マグニチュードの計算に関しては、単純な線形フォールオフから始めて、結果が気に入らない場合は他の式に移動できます。


フォースは、ここでは状況ではない、時間の経過とともにオブジェクトに影響を与えたいときに使用します。インパルスを適用する方が正しいでしょう。
ClassicThunder 14年

申し訳ありませんが、私は力を言いましたが、衝動にリンクされています。
マイケルハウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.