Risoluzione delle collisioni


23

So abbastanza bene come controllare le collisioni, ma non so come gestire la collisione in modo positivo.

Semplificato, se due oggetti si scontrano, utilizzo alcuni calcoli per cambiare la direzione della velocità. Se non sposto i due oggetti, si sovrapporranno comunque e se la velocità non è abbastanza grande si scontreranno comunque dopo il prossimo aggiornamento. Ciò può far sì che gli oggetti si incastrino l'uno nell'altro.

Ma cosa succede se provo a spostare i due oggetti in modo che non si sovrappongano. Sembra una buona idea ma mi sono reso conto che se ci sono più di due oggetti questo diventa molto complicato. Che cosa succede se muovo i due oggetti e uno di loro si scontra con altri oggetti, quindi devo spostarli anch'essi e potrebbero scontrarsi con muri ecc.

Ho in mente un gioco 2D dall'alto verso il basso, ma non credo che abbia molto a che fare con esso. Come vengono gestite le collisioni?

Questa domanda viene posta per conto di Wooh


1
Puoi chiarire il tipo di gioco? "Top down 2D" potrebbe significare molte cose: un gioco di avventura e avventura in stile Zelda, uno sparatutto a scorrimento verticale o un gioco di biliardo tascabile. Tutti questi avrebbero stili standard molto diversi di gestione delle collisioni!
Ian Schreiber,

2
Non posso chiarirlo. La domanda non riguarda cosa accadrà a seguito di una collisione, si tratta di gestire il problema della sovrapposizione multipla. Penso che sia sufficiente sapere che sto rimbalzando gli oggetti l'uno dall'altro e voglio che si comportino realisticamente per rispondere a questa domanda.
CiscoIPPhone

Risposte:


16

Daniel Kodicek tratta questo argomento in dettaglio nel suo libro Matematica e fisica per programmatori .

Kodicek fa due cose per ottenere una risoluzione delle collisioni dall'aspetto naturale:

  • La sua funzione di rilevamento delle collisioni calcola l'ora esatta in cui due oggetti si scontreranno.
  • Ricalcola nuove velocità al momento della collisione, quindi gli oggetti non si sovrappongono mai.

Ho caricato una demo basata sul rilevamento e sulla risoluzione delle collisioni di Kodicek .

aggiornamento: ecco un algoritmo di rilevamento e risoluzione delle collisioni molto simile al metodo di Kodicek. Con il codice sorgente . Consiglio ancora il libro di Kodicek, poiché il suo algoritmo è implementato in modo leggermente diverso e molto più accuratamente spiegato.


1
Il tuo link demo sembra essere rotto.
ashes999,

@ ashes999: link corretto ora!
Leftium,

È un algoritmo per i circoli. Che ne dici di scatole?
Anton Chikin,

@AntonChikin: l'algoritmo di risoluzione delle collisioni di Kodicek accetta solo tre input: massa, velocità e normale nel punto di collisione. Kodicek calcola sempre il normale nel punto di collisione quando rileva collisioni. Spiega molti diversi tipi di rilevamento delle collisioni, tra cui una scatola che colpisce un'altra scatola. Basta collegare l'algoritmo di rilevamento delle collisioni all'algoritmo di risoluzione delle collisioni. Vedi i capitoli 8-10 del libro di Kodicek per una spiegazione completa. (Nota: la fisica rotazionale richiede più matematica, che sarà anche trattata più avanti nel libro ...)
Leftium

1
@ThomasHilbert: codice sorgente demo ed eseguibili Windows ora disponibili su leftium.com/asteroid
Leftium

6

Cosa succede se si controlla la collisione prima che gli oggetti si spostino, invece che dopo? O, in altre parole, rifiuti la nuova posizione se gli oggetti si scontrano, riutilizzando la vecchia in quel caso?

pseudocodice:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

In questo modo gli oggetti si scontreranno tra loro quando stanno per scontrarsi , se il tuo passo di aggiornamento è abbastanza piccolo il giocatore non dovrebbe notare nulla di strano nella rappresentazione.


1
Questo è abbastanza fastidioso, perché non puoi muoverti facilmente parallelamente agli oggetti perché non puoi muoverti su se tocchi altri oggetti.
Ikke,

A meno che tu non risolva xey separatamente
instantaphex

6

Ogni volta che due oggetti si sovrappongono, controlla se si stanno muovendo l'uno verso l'altro o lontano l'uno dall'altro. Fai la collisione solo se si muovono l'uno verso l'altro.

È abbastanza facile con la matematica vettoriale, semplicemente calcola:

dot_product (B.position - A.position, A.velocity - B.velocity)

Se il risultato è positivo, gli oggetti si muovono l'uno verso l'altro.


4

Potrei essere frainteso, ma sembra che tu stia ponendo due domande: 1. quali sono alcuni modi generali di gestire la risoluzione delle collisioni il termine che stai cercando è "simulazione basata sugli impulsi", e ci sono un sacco di documenti che posso renderlo più giustizia di me.

In breve, vuoi fare un passo avanti nella simulazione fisica nello spazio del momento, che è la velocità dei tempi di massa (non fare cose basate sulla forza, il tuo integratore non lo sta facendo comunque).

Per la risposta angolare, fortunatamente i momenti di inerzia più grandi e minimi possono sempre essere ridotti a due assi ortogonali (in 2D), il che significa che una moltiplicazione della matrice funzionerà in generale, e se li allineate con gli assi X e Y, si trasforma in un vettore 2D.

Quando hai una collisione, capisci la risposta in base ai momenti lineari e angolari nel punto di collisione, e un buon fattore di scostamento è, se hai una compenetrazione, applicare una forza di penalità (come menzionato sopra) per separare i due corpi.

Dal punto in cui finirai per aggiungere sempre più regole per controllare il comportamento aberrante, come limitare il momento angolare massimo in modo che le cose non girino come cime, ecc., Ma questo è un buon inizio.

Mantienilo semplice se puoi.

  1. Come risolvere i problemi di collisione multi-corpo

L'unico vero modo per farlo è con un sistema di equazioni lineari e molta risoluzione. Il modo pratico per farlo è avere un sistema come quello sopra e far sì che la fisica si risolva naturalmente nel tempo.

La maggior parte dei giochi che fanno cose come rotolare o in piedi su superfici in movimento, hanno un modello ibrido in cui i tuoi piedi sono attaccati a una superficie (o ruote alla strada) per adattarsi al passo del tempo fisico (che comporterebbe cicli di compenetrazione-risposta e non funzionerebbe).

Spero che sia di aiuto. Se hai bisogno di esempi di matematica, fammi sapere.


3

Il modo in cui questo di solito viene risolto nei motori fisici è l'applicazione di una forza di penalità. Spostare il corpo rigido dopo l'inter-penetrazione non sembrerà buono se i tuoi corpi rigidi si muovono a velocità più elevate (vedrai movimenti a scatti momentanei), anche se come primo passo, dovresti provarlo e vedere se soddisfa le tue esigenze.

A penalty forceviene applicato come uno smorzatore a molla, in cui la forza di penalità viene aumentata quanto più si è penetrati nel corpo rigido e si riduce nei telai successivi. Pensalo come una molla. Quando due corpi rigidi si intersecano, si incontrano ciascuno una molla invisibile che smorza la loro progressione (cioè impedisce una maggiore inter-penetrazione) e applica i metodi precedentemente menzionati penalty forcefino a quando i corpi non penetrano più.

È un argomento ampio, ma si spera che le informazioni di cui sopra possano iniziare.


Quindi, invece di prevenire l'inter-penetrazione, questo metodo consente ma fornisce resistenza, quasi come se gli oggetti fossero compressi?
CiscoIPPhone il

Fornisce resistenza, sì, la resistenza aumenta quanto più il corpo cerca di penetrare. In pratica, se si dispone di un tempo delta abbastanza basso (ad esempio 10 ms), non produrrà alcuna inter-penetrazione. Il vero vantaggio di questo metodo è tuttavia quando si hanno corpi che sono inter-penetrati per vari motivi (la posizione è stata modificata, sono corpi rigidi collegati in rete e le loro posizioni sono state corrette) e ora devono essere separati, perché senza questa tecnica i corpi esploderà piuttosto che separarsi gradualmente.
Samaursa,
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.