Como posso criar uma explosão de bomba no Farseer que afasta objetos próximos?

14

Estou tentando criar uma explosão de bomba em Farseer. Eu criei um círculo para a bomba. No entanto, se a bomba explodir, os objetos (corpos) ao seu redor devem voar para longe porque são empurrados para trás pela enorme força da explosão. Não sei ao certo como criar essa força - como posso fazer isso?

Homer_Simpson
fonte
Vale ressaltar que o Farseer vem com uma amostra que implementa explosões. É "AdvancedDemo5" (na fonte atual). É semelhante ao método de proximidade na excelente resposta do Classic Thunder, apenas menos sofisticada (um impulso de magnitude fixa dentro de um AABB).
Andrew Russell

Respostas:

28

Eu recomendaria verificar a página iforce2d de explosão . Ele faz um ótimo trabalho abordando as várias maneiras de lidar com explosões com as compensações de desempenho versus precisão. Ele aborda três métodos que vou resumir aqui. Portanto, sou simplesmente eu resumindo as informações que encontrei durante a pesquisa e nenhuma delas é meu próprio trabalho.

Também você deseja aplicar impulsos aqui, não forças. Para entender por que ler isso .

O método de proximidade

O método de proximidade

Este é o mesmo método que Byte56 repassa em sua resposta. O conceito é simples. Tenha um ponto de explosão e aplique um impulso na direção oposta, longe do ponto que afetará todos os objetos com uma força baseada na distância deles.

Prós:

  • Muito rápido
  • Fácil de codificar.

Contras:

  • Explosões passam por objetos imóveis e corpos estáticos.
  • Os objetos que estão na área de influência da explosão podem ser pulados se você apenas verificar a distância do centro de massa.
  • A área da superfície não é levada em consideração.
  • Tudo é afetado de uma só vez.

O método Raycast

O método Raycast

Este é bastante simples, lança raios da origem da sua explosão e aplica impulsos quando colidem em um objeto com um impulso ditado pela distância.

Prós:

  • Menos desempenho que o método dos projéteis.
  • Explosão bloqueada por objetos.
  • Superfície levada em consideração.

Contras:

  • Tudo é afetado de uma só vez.
  • Quanto maior a explosão, mais raios você precisa para garantir que a explosão afeta tudo.
  • Mais desempenho intensivo que o método de proximidade.

O método de partículas

O método de partículas

Meu favorito pessoal. Semelhante ao método RaySasting, mas em vez de raios, você utiliza o mecanismo de física e cospe pequenos pellets que interagem com sua cena.

Prós:

  • Extremamente fácil em termos de código. Gere as bolas e aplique um impulso a cada uma. Você não tem código para escrever por tick. Basta ter um cronômetro que apague e desative / redefina os corpos após a explosão ser concluída.
  • A explosão é bloqueada por objetos.
  • A área da superfície é levada em consideração.
  • A explosão reflete fora das superfícies.
  • Objetos mais afastados da explosão respondem a ela mais lentamente.
  • Você pode usar as bolas como base para gerar parciais, permitindo que seus efeitos reflitam com precisão o impacto das explosões.

Contras:

  • Adiciona complexidade por tick.
ClassicThunder
fonte
5
Resposta muito boa. Eu gosto especialmente do método de partículas. Parece que tornaria mais difícil obter uma explosão poderosa . É trivial aumentar a massa das partículas?
Michaelhouse
1
É trivial efetuar todos os aspectos físicos das partículas, sendo os mais relevantes a densidade, a velocidade e o amortecimento. Aumentar a densidade e definir uma velocidade alta permitiria uma explosão comicamente violenta.
precisa
Você fez as partículas de explosão desacelerarem de propósito ou é apenas a animação inteira parando. Faria sentido adicionar um atrito constante às partículas.
neste
O @self Box2D permite adicionar amortecimento de liner a um objeto que diminui sua velocidade linearmente a uma determinada taxa; esta é a técnica usada no gif.
precisa
1
Excelente resposta :) Gostaria de acrescentar mais um profissional ao último método, pois você poderia usar as posições do pellet para desenhar um pouco de fumaça ou poeira.
iforce2d
2
  • Selecione todos os objetos dentro do raio de influência da bomba.
  • Para cada objeto
    • Use a posição do objeto e o centro da explosão para calcular o vetor do impulso. Algo como normalize(object - center).
    • Use a distância do centro da bomba ao objeto para calcular a magnitude do impulso. Algo como(object - center).length
    • Aplique um impulso ao objeto usando o vetor e a magnitude encontrados nas etapas anteriores.

Quanto ao cálculo da magnitude com a qual você pode começar com uma queda linear simples, vá para outras fórmulas se não gostar dos resultados.

MichaelHouse
fonte
As forças são para quando você deseja influenciar um objeto ao longo do tempo que não é a situação aqui. Seria mais correto aplicar um impulso.
ClassicThunder
Desculpe, eu disse força, mas ligada ao impulso.
Michaelhouse