Come separare gli oggetti in collisione senza creare più collisioni


11

Supponiamo che io usi un semplice sistema di rilevamento delle collisioni discreto in cui sposto tutti gli oggetti e poi controllo le collisioni. Voglio che tutti gli oggetti in collisione vengano separati (ovviamente) e assegnati velocità di risposta appropriate (rimbalzo, scorrimento, arresto, ecc.).

Quando ho una coppia di oggetti in collisione, come posso separarli senza finire con uno o entrambi in collisione con altri oggetti?

Risposte:


8

Questo non è un problema facile da risolvere in generale. In un motore fisico sarebbe gestito dal risolutore di controindicazioni. Esistono molti tipi diversi di risolutori di vincoli, ma uno dei più facili da comprendere è un risolutore di impulsi sequenziale.

Erin Catto ha fornito una bella spiegazione di un risolutore di impulsi sequenziale in diversi GDC precedenti, che possono essere scaricati dalla pagina di download di Box2D , vedi ad esempio GDC 2009.


Sono curioso di questo. Dato quanto sia comune la necessità di rilevare e risolvere le collisioni, ho ipotizzato che esista almeno un algoritmo di risoluzione semplicistico adatto a giochi arcade e di azione.
AJM,

2
Non proprio. Ai vecchi tempi (SNES ecc.), Avevano problemi di questo tipo con cambiamenti o compromessi nella progettazione del gioco. Per esempio. In Super Mario, quando il giocatore veniva colpito, Mario sarebbe stato invincibile per un paio di secondi per evitare le seconde collisioni. In Double Dragon, le collisioni vengono ignorate per il giocatore fino al termine dell'animazione per la caduta all'indietro.
yaustar,

@yaustar In realtà Mario non ha alcuna collisione con i nemici. Subisce solo danni quando la sua hitbox si sovrappone.
Inverno

3

L'unico modo per evitare che ciò accada è innanzitutto impedire la penetrazione. Prima di spostare un oggetto, assicurati che sia una mossa legale. Nota che questo significa che devi spostare i tuoi oggetti uno alla volta per evitare che due oggetti si spostino l'uno nell'altro.

Se non si verifica alcuna penetrazione, non è necessario ripristinare alcuna posizione e quindi non si innescherà alcuna penetrazione secondaria.


2

Quello che faccio di solito è il seguente:

Quando si separano gli oggetti e si verificano più collisioni, si esegue nuovamente l'iterazione fino a quando non viene raggiunto un numero massimo di passaggi o gli oggetti penetrano meno di una soglia predefinita.


È estremamente instabile. Gli FPS nel tuo gioco potrebbero aumentare in qualsiasi momento il giocatore fa un casino spingendo un oggetto leggero. Sarebbe meglio risolverlo nel prossimo frame.
Inverno
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.