Hier ist ein Beitrag mit Links zu Artikeln über ähnliche Arten von Simulationen (eher im technischen / akademischen Kontext als für Spiele): https://gamedev.stackexchange.com/a/10350/6398
Ich habe mindestens zwei verschiedene Ansätze zur Kollisionserkennung + Reaktion für diese Art von "Draht" -Simulation ausprobiert (wie im Spiel Umihara Kawase zu sehen); Zumindest denke ich, das ist es, wonach Sie suchen - es scheint keinen bestimmten Begriff für diese Art von Simulation zu geben, ich neige dazu, es eher als "Draht" als als "Seil" zu bezeichnen, weil es den meisten Menschen so vorkommt Betrachten Sie "Seil" als Synonym für "eine Kette von Partikeln". Und wenn Sie das klebrige Verhalten eines Ninja-Seils wollen (dh es kann drücken UND ziehen), ähnelt dies eher einem starren Draht als einem Seil. Sowieso..
Die Antwort von Pekuja ist gut. Sie können eine kontinuierliche Kollisionserkennung implementieren, indem Sie die Zeit berechnen, in der der vorzeichenbehaftete Bereich der drei Punkte 0 ist.
(Ich kann mich nicht vollständig an OTOH erinnern, aber Sie können es wie folgt angehen: Ermitteln Sie die Zeit t, wenn der Punkt a in der durch b, c verlaufenden Linie enthalten ist 0, um Werte von t) zu finden, und dann, wenn eine gültige Zeit 0 <= t <1 gegeben ist, finde die parametrische Position s von a auf dem Segment bc, dh a = (1-s) b + s c und wenn a zwischen liegt b und c (dh wenn 0 <= s <= 1) ist es eine gültige Kollision.
AFAICR Sie können auch umgekehrt vorgehen (dh nach s auflösen und dieses dann einstecken, um t zu finden), aber es ist viel weniger intuitiv. (Es tut mir leid, wenn dies keinen Sinn ergibt, ich habe keine Zeit, meine Notizen auszugraben, und es sind ein paar Jahre vergangen!)
So können Sie jetzt alle Zeiten berechnen, zu denen Ereignisse auftreten (dh Seilknoten sollten eingefügt oder entfernt werden). Verarbeiten Sie das früheste Ereignis (Einfügen oder Entfernen eines Knotens) und wiederholen / rekursieren Sie es, bis zwischen t = 0 und t = 1 keine Ereignisse mehr vorhanden sind.
Eine Warnung zu diesem Ansatz: Wenn die Objekte, um die sich das Seil wickeln kann, dynamisch sind (insbesondere, wenn Sie sie und ihre Auswirkungen auf das Seil simulieren und umgekehrt), kann es zu Problemen kommen, wenn diese Objekte jeweils durchtrennen Anderes - der Draht kann sich verwickeln. Und es wird definitiv eine Herausforderung sein, diese Art von Interaktion / Bewegung (die Ecken von Objekten rutschen durcheinander) in einer Box2D-ähnlichen Physiksimulation zu verhindern. Geringe Durchdringungswerte zwischen Objekten sind in diesem Kontext normal.
(Zumindest .. das war ein Problem mit einer meiner Implementierungen von "wire".)
Eine andere Lösung, die viel stabiler ist, aber unter bestimmten Bedingungen einige Kollisionen auslässt, besteht darin, nur statische Tests zu verwenden (dh sich keine Gedanken über die zeitliche Reihenfolge zu machen, sondern jedes Segment rekursiv in Kollisionen zu unterteilen, wie Sie es finden) viel robuster - der Draht verwickelt sich nicht in Ecken und kleine Mengen an Eindringen sind in Ordnung.
Ich denke, Pekujas Ansatz funktioniert auch hier, es gibt jedoch alternative Ansätze. Ein Ansatz, den ich verwendet habe, besteht darin, zusätzliche Kollisionsdaten hinzuzufügen: Fügen Sie an jedem konvexen Scheitelpunkt v der Welt (dh an den Ecken von Formen, um die sich das Seil wickeln kann) einen Punkt u hinzu, der das gerichtete Liniensegment uv bildet, wobei u einiges ist Punkt "innerhalb der Ecke" (dh innerhalb der Welt, "hinter" v; um u zu berechnen, können Sie einen Strahl von v aus entlang seiner interpolierten Normalen nach innen werfen und eine Strecke nach v anhalten oder bevor der Strahl einen Rand der Welt schneidet und Sie können die Segmente auch manuell mit einem visuellen Werkzeug / Ebenen-Editor in die Welt malen.
Wie auch immer, Sie haben jetzt eine Reihe von "Ecklinien" UV; Überprüfen Sie für jedes UV und jedes Segment ab in der Leitung, ob sich ab und uv überschneiden (dh statische, boolesche Lineseg-Lineseg-Schnittabfrage). Wenn ja, rekursieren Sie (teilen Sie das Lineseg ab in av und vb, dh fügen Sie v ein) und notieren Sie, in welche Richtung das Seil bei v gebogen ist. Prüfen Sie dann für jedes Paar benachbarter Linesegs ab, bc im Draht, ob die aktuelle Biegerichtung bei b vorliegt ist dasselbe wie bei der Erzeugung von b (alle diese "Biegerichtungstests" sind nur Tests mit vorzeichenbehafteten Bereichen); Wenn nicht, füge die beiden Segmente zu ac zusammen (dh entferne b).
Oder vielleicht habe ich fusioniert und dann geteilt, vergesse ich - aber es funktioniert definitiv in mindestens einer der beiden möglichen Bestellungen! :)
Wenn Sie alle für den aktuellen Frame berechneten Drahtsegmente vorausgesetzt haben, können Sie eine Abstandsbeschränkung zwischen den beiden Drahtendpunkten simulieren (und Sie können sogar die inneren Punkte einbeziehen, dh die Kontaktpunkte zwischen Draht und Welt, aber das ist etwas komplizierter ).
Wie auch immer, hoffentlich wird dies von Nutzen sein ... die Artikel in dem Beitrag, den ich auch verlinkt habe, sollten Ihnen auch einige Ideen geben.