¿Cómo puedo crear una explosión de bomba en Farseer que empuje los objetos cercanos?

14

Estoy tratando de crear una explosión de bomba en Farseer. Creé un círculo para la bomba. Sin embargo, si la bomba explota, los objetos (cuerpos) que la rodean deberían volar porque la enorme fuerza de la explosión los empuja hacia atrás. Sin embargo, no estoy seguro de cómo crear esa fuerza: ¿cómo puedo hacerlo?

Homero Simpson
fuente
Vale la pena señalar que Farseer viene con una muestra que implementa explosiones. Es "AdvancedDemo5" (en la fuente actual). Es similar al método de proximidad en la excelente respuesta de Classic Thunder, solo que menos sofisticado (un impulso de magnitud fija dentro de un AABB).
Andrew Russell

Respuestas:

28

Recomendaría revisar la página de explosión iforce2d . Hace un gran trabajo al repasar las diversas formas de manejar explosiones con las compensaciones de rendimiento versus precisión. Se trata de 3 métodos que resumiré aquí. Así que este es simplemente un resumen de la información que encontré mientras investigaba y nada de eso es mi propio trabajo.

También desea aplicar impulsos aquí, no fuerzas. Para entender por qué leer esto .

El método de proximidad.

El método de proximidad.

Este es el mismo método que Byte56 repasa en su respuesta. El concepto es simple. Tenga un punto de explosión y aplique un impulso en la dirección opuesta lejos del punto que afectará a todos los objetos con una fuerza basada en su distancia.

Pros:

  • Muy rapido
  • Fácil de codificar.

Contras:

  • Las explosiones pasan a través de objetos inamovibles y cuerpos estáticos.
  • Los objetos que se encuentran en el área de influencia de la explosión pueden saltarse si solo verifica la distancia al centro de masa.
  • El área de superficie no se tiene en cuenta.
  • Todo se ve afectado a la vez.

El método de Raycast.

El método de Raycast.

Este es bastante simple, expulsa rayos desde el origen de tu explosión y aplica impulsos cuando chocan contra un objeto con un impulso dictado por la distancia.

Pros:

  • Menos rendimiento intensivo que el método de proyectiles.
  • Explosión bloqueada por objetos.
  • Área de superficie tomada en cuenta.

Contras:

  • Todo se ve afectado a la vez.
  • Cuanto mayor sea la explosión, más rayos necesitará para asegurarse de que la explosión afecte todo.
  • Más rendimiento intensivo que el método de proximidad.

El método de partículas.

El método de partículas.

Mi favorito personal Similar al método RaySasting, pero en lugar de rayos, aprovecha el motor de física y escupe pequeños gránulos que interactúan con su escena.

Pros:

  • Extremadamente fácil en cuanto a código. Genera las bolas y aplica un impulso a cada una. No tiene código para escribir por marca. Solo tenga un temporizador que funcione y desactive / reinicie los cuerpos después de que se complete la explosión.
  • La explosión está bloqueada por objetos.
  • Se tiene en cuenta la superficie.
  • La explosión se refleja en las superficies.
  • Los objetos más alejados de la explosión responden más lentamente.
  • Puedes usar las bolas como base para generar parciales permitiendo que tus efectos reflejen con precisión el impacto de las explosiones.

Contras:

  • Agrega complejidad por marca.
Trueno clásico
fuente
55
Muy buena respuesta. Me gusta especialmente el método de partículas. Sin embargo, parece que haría más difícil obtener una poderosa explosión. ¿Es trivial aumentar la masa de las partículas?
MichaelHouse
1
Es trivial efectuar todos los aspectos físicos de las partículas, siendo la densidad, la velocidad y la amortiguación más relevantes. Incrementar la densidad y establecer una velocidad alta te permitiría hacer una explosión cómica y violenta.
ClassicThunder
¿Hiciste que las partículas de explosión se desaceleren a propósito, o simplemente se detiene la animación completa? Tendría sentido agregar fricción constante a las partículas.
este
@self Box2D le permite agregar amortiguación de revestimiento a un objeto que lo ralentiza linealmente a un cierto ritmo, esta es la técnica utilizada en el gif.
ClassicThunder
1
Excelente respuesta :) Añadiría un profesional más al último método, ya que podría usar las posiciones de pellet para extraer un humo o polvo de aspecto agradable.
iforce2d
2
  • Seleccione todos los objetos dentro del radio de influencia de la bomba.
  • Para cada objeto
    • Use la posición del objeto y el centro de la explosión para calcular el vector del impulso. Algo así como normalize(object - center).
    • Usa la distancia desde el centro de la bomba hasta el objeto para calcular la magnitud del impulso. Algo como(object - center).length
    • Aplique un impulso al objeto usando el vector y la magnitud encontrados en los pasos anteriores.

En cuanto al cálculo de la magnitud, puede comenzar con una caída lineal simple, luego pasar a otras fórmulas si no le gustan los resultados.

MichaelHouse
fuente
Las fuerzas son para cuando quieres influir en un objeto a lo largo del tiempo, que no es la situación aquí. Sería más correcto aplicar un impulso.
ClassicThunder
Lo siento, dije fuerza, pero vinculado al impulso.
MichaelHouse