Comment puis-je créer une explosion de bombe dans Farseer qui repousse les objets à proximité?

14

J'essaie de créer une explosion de bombe à Farseer. J'ai créé un cercle pour la bombe. Cependant, si la bombe explose, les objets (corps) qui l'entourent devraient s'envoler car ils sont repoussés par la force énorme de l'explosion. Je ne sais pas comment créer cette force, cependant - comment puis-je le faire?

Homer Simpson
la source
Il convient de souligner que Farseer est livré avec un échantillon qui met en œuvre des explosions. C'est "AdvancedDemo5" (dans la source actuelle). Elle est similaire à la méthode de proximité dans l'excellente réponse de Classic Thunder, mais moins sophistiquée (une impulsion d'amplitude fixe dans un AABB).
Andrew Russell

Réponses:

28

Je recommanderais de consulter la page d'explosion iforce2d . Il fait un excellent travail en passant en revue les différentes façons de gérer les explosions avec les compromis performances / précision. Il passe en revue 3 méthodes que je résumerai ici. Donc, c'est simplement moi qui résume les informations que j'ai trouvées pendant mes recherches et rien de tout cela n'est mon propre travail.

Ici aussi, vous voulez appliquer des impulsions et non des forces. Pour comprendre pourquoi lire ceci .

La méthode de proximité

La méthode de proximité

C'est la même méthode que Byte56 reprend dans sa réponse. Le concept est simple. Avoir un point d'explosion et appliquer une impulsion dans la direction opposée du point qui affectera tous les objets avec une force basée sur leur distance.

Avantages:

  • Très vite
  • Facile à coder.

Les inconvénients:

  • Les explosions traversent des objets immobiles et des corps statiques.
  • Les objets qui se trouvent dans la zone d'influence de l'explosion peuvent être ignorés si vous ne vérifiez que la distance au centre de gravité.
  • La superficie n'est pas prise en compte.
  • Tout est affecté à la fois.

La méthode Raycast

La méthode Raycast

Celui-ci est assez simple, chasse les rayons de l'origine de votre explosion et applique des impulsions lorsqu'ils entrent en collision avec un objet avec une impulsion dictée par la distance.

Avantages:

  • Moins performant que la méthode des projectiles.
  • Explosion bloquée par des objets.
  • Surface prise en compte.

Les inconvénients:

  • Tout est affecté à la fois.
  • Plus l'explosion est importante, plus vous avez besoin de rayons pour vous assurer que l'explosion affecte tout.
  • Plus performant que la méthode de proximité.

La méthode des particules

La méthode des particules

Mon préféré. Semblable à la méthode RaySasting, mais au lieu de rayons, vous tirez parti du moteur physique et crachez de petites pastilles qui interagissent avec votre scène.

Avantages:

  • Extrêmement facile au niveau du code. Générez les boules et appliquez une impulsion à chacune. Vous n'avez pas de code à écrire par tick. Il suffit d'avoir une minuterie qui passe et désactive / réinitialise les corps une fois l'explosion terminée.
  • L'explosion est bloquée par des objets.
  • La superficie est prise en compte.
  • L'explosion se reflète sur les surfaces.
  • Les objets plus éloignés de l'explosion y répondent plus lentement.
  • Vous pouvez utiliser les balles comme base pour générer des partiels permettant à vos effets de refléter avec précision l'impact des explosions.

Les inconvénients:

  • Ajoute de la complexité par tick.
ClassicThunder
la source
5
Très belle réponse. J'aime particulièrement la méthode des particules. Il semble que cela rendrait plus difficile d'obtenir une puissante explosion. Est-il trivial de rendre la masse des particules plus élevée?
MichaelHouse
1
Il est trivial d'effectuer tous les aspects physiques des particules, les plus pertinents étant la densité, la vitesse et l'amortissement. Augmenter la densité et définir une vitesse élevée vous permettrait de faire une explosion comique violente.
ClassicThunder
Avez-vous fait délibérément décélérer les particules d'explosion, ou est-ce que toute l'animation s'arrête. Il serait logique d'ajouter un frottement constant aux particules.
ce
@self Box2D vous permet d'ajouter un amortisseur de liner à un objet qui le ralentit linéairement à un certain rythme, c'est la technique utilisée dans le gif.
ClassicThunder
1
Excellente réponse :) J'ajouterais un autre pro à la dernière méthode, en ce sens que vous pouvez utiliser les positions des pastilles pour dessiner de la fumée ou de la poussière.
iforce2d
2
  • Sélectionnez tous les objets dans le rayon d'influence de la bombe.
  • Pour chaque objet
    • Utilisez la position de l'objet et le centre de l'explosion pour calculer le vecteur de l'impulsion. Quelque chose comme normalize(object - center).
    • Utilisez la distance entre le centre de la bombe et l'objet pour calculer l'amplitude de l'impulsion. Quelque chose comme(object - center).length
    • Appliquez une impulsion à l'objet en utilisant le vecteur et la magnitude trouvés dans les étapes précédentes.

En ce qui concerne le calcul de l'amplitude, vous pouvez commencer par une simple diminution linéaire, puis passer à d'autres formules si vous n'aimez pas les résultats.

MichaelHouse
la source
Les forces sont quand vous voulez influencer un objet dans le temps, ce qui n'est pas le cas ici. Il serait plus correct d'appliquer une impulsion.
ClassicThunder
Désolé, j'ai dit la force, mais lié à l'impulsion.
MichaelHouse