2D-Seilkollisionserkennung


13

Ich möchte ein Seil erstellen, das mit Objekten wie im folgenden YouTube-Video kollidieren kann:

2D-Spielphysik-Seil

Ich denke, dass Sie die verlet-Integration implementieren, die Punkte verwendet und diese Punkte mit Linien verbindet. Ich versuche herauszufinden, welche Art von Kollisionserkennung Sie auf das Seil anwenden würden, um den Effekt im Video zu erzielen.

Ich denke, Sie müssten für jeden Punkt eine CD machen. Ich würde gerne box2D verwenden, also frage ich mich, ob ich aus jedem Punkt einen starren Körper machen könnte. Jeder Rat wäre dankbar.


1
Wenn Sie sich das Video in Ihrem Link genau ansehen, ist es klar, dass das "Seil", das simuliert wird, eine Kette ist, dh eine große Anzahl von unflexiblen Segmenten, die in einer Linie verbunden sind, und kein durchgehend flexibles Grundelement. Dies ist am offensichtlichsten, wenn sich das Seil um das kleine runde Hindernis wickelt; Sie können die Ecken sehen, sich um sie zu drehen. Eine Kette ist viel einfacher zu simulieren als ein durchgehendes Seil. Jeder Link ist nur ein Kollisionsprimitiv und sie sind permanent miteinander verbunden. Um ein überzeugenderes Verhalten zu erzielen, sollten Sie jedes Glied zu einer sehr steifen Feder machen, anstatt es völlig unflexibel zu machen.
Paul Z

Antworten:


6

Da Sie Box2D verwenden, können Sie eine Reihe von Rechtecken erstellen und die Verbindungen von Box2D verwenden , um diese zu verbinden. Da hast du dein Seil.

Um zu vermeiden, dass Ecken aus einem gebogenen Seil herausragen, kann ich mir zwei Möglichkeiten vorstellen:

  1. Gib deinen Seilsegmenten abgerundete Enden (damit sie keine Rechtecke mehr sind)
  2. Machen Sie dieses Seil selbst unsichtbar und verwenden Sie es nur für die Physik. Nehmen Sie die Positionen der Gelenke in jedem Rahmen und verwenden , die ein Seil on the fly zu ziehen , dass die Spieler werden sehen.

Warnung: Ich habe es noch nie selbst versucht, aber ich kann nicht erkennen, wie eine Reihe verbundener Rechtecke fehlschlagen kann, wenn das von Ihnen gepostete Video praktisch dieselbe Verkleidung aufweist.

Edit: Ich habe gerade PaulZ gesehen und mir ist dasselbe klar geworden. Lesen Sie auch seinen Kommentar zur Frage.


2

Ein schnelles Google warf dies hier auf . Eine Demo, eine Beschreibung und ein Code (in Flash) mit Box2D zur Implementierung eines einfachen Seils. Das Seil kollidiert mit sich selbst und dem Block oben in der Szene.


0

Hier ist, was ich tun würde, machen Sie jeden Punkt auf der Linie zu einem Kreis, machen Sie genug Punkte, dass sich die Kreise überlappen. Binden Sie jeden Punkt an den Nachbarn und nicht an die Standardkollision. Durch dieses Binden sollten die Punkte einen festen Abstand voneinander haben.

Ich kenne Box2D nicht, aber ich vermute, dass die erforderliche Funktionalität vorhanden ist.


0

Ursprünglich hatte Box2D eine Seilbrückendemo aus dünnen Boxen, die mit Punkt-zu-Punkt-Bedingungen verbunden waren. Das wäre ein guter Anfang (ich weiß nicht, ob es noch mit dieser Demo geliefert wird, aber es wäre einfach nachzubauen).

Es ist einfach genug, ein Seil als Partikel mit Abstandsbeschränkungen unabhängig von einem Starrkörpersimulator zu implementieren (wie Sie bereits erwähnt haben, unter Verwendung eines Verlet-Integrations- und Beschränkungslösungsschemas wie dem in diesem Artikel beschriebenen: http://www.gamasutra.com/resource_guide/ 20030121 / jacobson_pfv.htm ), aber wenn Sie wollen, dass starre Körper auf Ihr Seil reagieren (wie im Video mit der Dangling Box), wird es viel komplizierter. Ich würde mit einer umfassenden Suite von Tools wie Box2D beginnen und rückwärts arbeiten, anstatt zu versuchen, aus Partikeln aufzubauen.


0

Ich erinnere mich an dieses Allegro-Spiel: Cupid von SpeedHack 2002. Es enthält eine Implementierung für Seile, die mit der Szenerie kollidieren. Siehe PhysParticles- und HeartTrails-Klassen in der Datei heart_tails.cpp im Quellcode .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.