Come posso creare un'esplosione di una bomba in Farseer che allontana gli oggetti vicini?


14

Sto cercando di creare un'esplosione di una bomba in Farseer. Ho creato un cerchio per la bomba. Tuttavia, se la bomba esplode, gli oggetti (corpi) che la circondano dovrebbero volare via perché respinti dall'enorme forza dell'esplosione. Non sono sicuro di come creare quella forza, però - come posso farlo?


Vale la pena sottolineare che Farseer viene fornito con un campione che implementa esplosioni. È "AdvancedDemo5" (nella fonte corrente). È simile al metodo di prossimità nella risposta eccellente di Classic Thunder, solo meno sofisticato (un impulso di magnitudine fissa all'interno di un AABB).
Andrew Russell,

Risposte:


28

Consiglio di dare un'occhiata alla pagina iforce2d di esplosione . Fa un ottimo lavoro esaminando i vari modi di gestire le esplosioni con compromessi tra prestazioni e precisione. Esamina 3 metodi che riassumerò qui. Quindi sono semplicemente io a riassumere le informazioni che ho trovato durante la ricerca e nessuna di queste è opera mia.

Inoltre qui vuoi applicare gli impulsi e non le forze. Per capire perché leggi questo .

Il metodo di prossimità

Il metodo di prossimità

Questo è lo stesso metodo utilizzato da Byte56 nella sua risposta. Il concetto è semplice Avere un punto di esplosione e applicare un impulso nella direzione opposta rispetto al punto che influenzerà tutti gli oggetti con una forza basata sulla loro distanza.

Professionisti:

  • Molto veloce
  • Facile da codificare.

Contro:

  • Le esplosioni attraversano oggetti immobili e corpi statici.
  • Gli oggetti che si trovano nell'area di influenza dell'esplosione possono essere saltati se si controlla solo la distanza dal centro di massa.
  • La superficie non viene presa in considerazione.
  • Tutto è interessato in una volta.

Il metodo Raycast

Il metodo Raycast

Questo è abbastanza semplice, scaglia i raggi dall'origine della tua esplosione e applica gli impulsi quando si scontrano in un oggetto con un impulso dettato dalla distanza.

Professionisti:

  • Meno dispendioso in termini di prestazioni rispetto al metodo dei proiettili.
  • Esplosione bloccata da oggetti.
  • Superficie considerata.

Contro:

  • Tutto è interessato in una volta.
  • Maggiore è l'esplosione, più raggi è necessario per assicurarsi che l'esplosione influisca su tutto.
  • Maggiore intensità di prestazioni rispetto al metodo di prossimità.

Il metodo particellare

Il metodo particellare

Il mio preferito personale. Simile al metodo RaySasting ma al posto dei raggi sfrutta il motore fisico e sputa piccole palline che interagiscono con la tua scena.

Professionisti:

  • Estremamente semplice in termini di codice. Genera le palle e applica un impulso a ognuna. Non hai codice da scrivere per tick. Basta avere un timer che va e disabilita / ripristina i corpi dopo che l'esplosione è stata completata.
  • L'esplosione è bloccata da oggetti.
  • La superficie viene presa in considerazione.
  • L'esplosione si riflette sulle superfici.
  • Gli oggetti più lontani dall'esplosione rispondono più lentamente ad esso.
  • Puoi usare le palline come base per generare parziali che consentano ai tuoi effetti di riflettere accuratamente l'impatto delle esplosioni.

Contro:

  • Aggiunge complessità per tick.

5
Risposta molto bella. Mi piace soprattutto il metodo delle particelle. Sembra però che renderebbe più difficile ottenere una potente esplosione. È banale aumentare la massa delle particelle?
MichaelHouse

1
È banale influenzare tutti gli aspetti fisici delle particelle, la più rilevante è la densità, la velocità e lo smorzamento. Aumentare la densità e impostare un'alta velocità ti farebbe un'esplosione comicamente violenta.
ClassicThunder

Hai fatto rallentare di proposito le particelle di esplosione o è solo l'interruzione dell'animazione. Avrebbe senso aggiungere un attrito costante alle particelle.
questo

@self Box2D consente di aggiungere lo smorzamento del liner a un oggetto che lo rallenta in modo lineare a una certa velocità, questa è la tecnica utilizzata nella gif.
ClassicThunder

1
Ottima risposta :) Aggiungerei un altro professionista all'ultimo metodo, in quanto potresti usare le posizioni del pellet per aspirare fumo o polvere.
iforce2d,

2
  • Seleziona tutti gli oggetti nel raggio di influenza della bomba.
  • Per ogni oggetto
    • Usa la posizione dell'oggetto e il centro dell'esplosione per calcolare il vettore dell'impulso. Qualcosa del genere normalize(object - center).
    • Usa la distanza dal centro della bomba all'oggetto per calcolare la grandezza dell'impulso. Qualcosa di simile a(object - center).length
    • Applicare un impulso all'oggetto usando il vettore e la grandezza trovati nei passaggi precedenti.

Per quanto riguarda il calcolo della grandezza, puoi iniziare con un semplice decadimento lineare, quindi passare ad altre formule se non ti piacciono i risultati.


Le forze sono per quando vuoi influenzare un oggetto nel tempo che non è la situazione qui. Sarebbe più corretto applicare un impulso.
ClassicThunder

Scusa, ho detto forza, ma legato all'impulso.
MichaelHouse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.