Ecco un post che contiene collegamenti a documenti su tipi simili di simulazioni (in contesti ingegneristici / accademici piuttosto che per i giochi): https://gamedev.stackexchange.com/a/10350/6398
Ho provato almeno due approcci diversi al rilevamento delle collisioni + risposta per questo tipo di simulazione "wire" (come visto nel gioco Umihara Kawase); almeno, penso che questo sia ciò che stai cercando: non sembra esserci un termine specifico per questo tipo di simulazione, tendo solo a chiamarlo "filo" piuttosto che "corda" perché sembra che la maggior parte delle persone considera "corda" sinonimo di "una catena di particelle". E, se vuoi il comportamento stick-ish della corda ninja (cioè può spingere E tirare), questo è più simile a un filo rigido che a una corda. Comunque..
La risposta di Pekuja è buona, è possibile implementare il rilevamento continuo delle collisioni risolvendo per il momento in cui l'area firmata dei tre punti è 0.
(Non riesco a ricordare completamente OTOH ma puoi avvicinarti come segue: trova il tempo t quando il punto a è contenuto nella linea che passa attraverso b, c, (penso di averlo fatto risolvendo per quando punto (ab, cb) = 0 per trovare i valori di t), e quindi dato un tempo valido 0 <= t <1, trova la posizione parametrica s di a sul segmento bc, ovvero a = (1-s) b + s c e se a è compreso tra bec (cioè se 0 <= s <= 1) è una collisione valida.
AFAICR puoi affrontarlo anche al contrario (cioè risolvi per s e poi collegalo per trovare t) ma è molto meno intuitivo. (Mi dispiace se questo non ha alcun senso, non ho tempo di scavare i miei appunti ed è passato qualche anno!))
Quindi, ora è possibile calcolare tutte le volte in cui si verificano eventi (ad esempio, i nodi della corda devono essere inseriti o rimossi); elaborare il primo evento (inserire o rimuovere un nodo) e quindi ripetere / ricorrere fino a quando non ci sono più eventi tra t = 0 e t = 1.
Un avvertimento su questo approccio: se gli oggetti che la corda può avvolgere sono dinamici (specialmente se li stai simulando E i loro effetti sulla corda, e viceversa), ci possono essere problemi se quegli oggetti si agganciano / passano attraverso ciascuno altro: il filo può impigliarsi. E sarà sicuramente difficile impedire questo tipo di interazione / movimento (gli angoli degli oggetti che scivolano l'uno nell'altro) in una simulazione fisica in stile box2d. Piccole quantità di penetrazione tra oggetti sono comportamenti normali in quel contesto.
(Almeno .. questo è stato un problema con una delle mie implementazioni di "wire".)
Una soluzione diversa, che è molto più stabile ma che manca alcune collisioni in determinate condizioni è quella di utilizzare solo i test statici (cioè non preoccuparti di ordinare in base al tempo, basta suddividere ricorsivamente ogni segmento in collisione quando li trovi), che può essere molto più robusto - il filo non si impiglia negli angoli e piccole quantità di penetrazione andranno bene.
Penso che l'approccio di Pekuja funzioni anche per questo, tuttavia ci sono approcci alternativi. Un approccio che ho usato è quello di aggiungere dati di collisione ausiliari: ad ogni vertice convesso v nel mondo (cioè gli angoli delle forme che la corda può avvolgere), aggiungi un punto u che forma il segmento di linea diretta uv, dove sei punto "dentro l'angolo" (cioè dentro il mondo, "dietro" v; per calcolare u puoi lanciare un raggio verso l'interno da v lungo la sua normale interpolata e fermarti a una certa distanza dopo v o prima che il raggio si intersechi con un bordo del mondo e esce dalla regione solida oppure puoi semplicemente dipingere manualmente i segmenti nel mondo usando uno strumento visivo / editor di livelli).
Ad ogni modo, ora hai una serie di "corner linesegs" uv; per ogni uv e ogni segmento ab nel filo, verificare se ab e uv si intersecano (ovvero query di intersezione statica, booleana lineeg-lineseg); in tal caso, ricorrere (dividere la lineeg ab in av e vb, ovvero inserire v), registrando in quale direzione la fune piegata a v. Quindi per ciascuna coppia di lineeg vicine ab, bc nel filo, verificare se l'attuale direzione di piega a b è lo stesso di quando è stato generato b (tutti questi test di "direzione di piega" sono solo test di area con segno); in caso contrario, unire i due segmenti in ac (cioè rimuovere b).
O forse mi sono unito e poi diviso, dimentico - ma funziona sicuramente in almeno uno dei due possibili ordini! :)
Dati tutti i segmenti di filo calcolati per il fotogramma corrente, puoi quindi simulare un vincolo di distanza tra i due punti terminali del filo (e puoi anche coinvolgere i punti interni, cioè i punti di contatto tra il filo e il mondo, ma è un po 'più coinvolto ).
Comunque, si spera che questo possa essere di qualche utilità ... anche i documenti nel post che ho collegato dovrebbero darvi alcune idee.