Sto cercando di implementare un sistema di collisione in un gioco 2D che sto realizzando. Il teorema dell'asse di separazione (come descritto dal tutorial sulla collisione della metanet ) sembra un modo efficiente e robusto di gestire il rilevamento delle collisioni, ma non mi piace molto il metodo di risposta alle collisioni che usano. Spostandosi ciecamente lungo l'asse di minima sovrapposizione, l'algoritmo ignora semplicemente la posizione precedente dell'oggetto in movimento, il che significa che non si scontra con l'oggetto fermo tanto quanto entra in esso e poi rimbalza.
Ecco un esempio di una situazione in cui questo avrebbe importanza:

Secondo il metodo SAT sopra descritto, il rettangolo sarebbe semplicemente fuoriuscito dal triangolo perpendicolare alla sua ipotenusa:

Tuttavia, realisticamente, il rettangolo dovrebbe fermarsi nell'angolo in basso a destra del triangolo, poiché quello sarebbe il punto di prima collisione se si muovesse continuamente lungo il suo vettore di spostamento:

Ora, questo potrebbe non avere importanza durante il gioco, ma mi piacerebbe sapere se esiste un modo per ottenere in modo efficiente e generalmente spostamenti accurati in questo modo. Ci ho messo il cervello da qualche giorno, e non voglio ancora arrendermi!
(Trasmissione incrociata da StackOverflow, spero che non sia contro le regole!)
Passaggio 1: per ciascun poligono, trovare i due punti più lontani lungo la proiezione di quel poligono sulla linea perpendicolare al vettore di movimento.
Passaggio 2: dividere ciascun poligono lungo la linea che collega questi punti. La metà del poligono che si trova di fronte all'altro poligono lungo il vettore di movimento è lo "scafo anteriore". Questa è l'unica parte del poligono che può eventualmente scontrarsi.
Passaggio 3:Proiettare un vettore da ciascun punto sullo "scafo anteriore" di ciascun poligono lungo il vettore di movimento verso il poligono opposto e verificarlo per l'intersezione con ciascun bordo dello "scafo anteriore" del poligono opposto. (Forse lento, ma i computer sono piuttosto veloci al giorno d'oggi - giusto?) (Mi dispiace per la freccia inclinata. Tutte le frecce dovrebbero essere parallele.)
Passaggio 4: Prendi il vettore più corto. Questa è l'esatta distanza di collisione.
Step 5: Voila!
