Wie erstelle ich ein dehnbares Seil in Box2D?

7

Angenommen, ich versuche, einen Ninja zu erschaffen, der sich an einem Seil herunterlässt oder sich wieder hochzieht, während er möglicherweise von einer Seite zur anderen schwingt oder von Gegenständen getroffen wird. Grundsätzlich wie http://ninja.frozenfractal.com/, aber mit Box2D anstelle von hackigem JavaScript.

Idealerweise möchte ich in Box2D eine Seilverbindung verwenden, mit der ich die Länge nach dem Bau ändern kann. Die Standard-Box2D RopeJointbietet diese Funktionalität nicht.

Ich habe überlegt PulleyJoint, das andere Ende der "Riemenscheibe" mit einem unsichtbaren kinematischen Körper zu verbinden, den ich steuern kann, um die Länge zu ändern, der jedoch PulleyJointeher einer Stange als einem Seil ähnelt: Er beschränkt die maximale Länge, im Gegensatz dazu begrenzt RopeJointer die minimale auch.

Das Neuerstellen eines RopeJointjeden Frames mit einer neuen Länge ist ziemlich ineffizient, und ich bin mir nicht einmal sicher, ob es in der Simulation richtig funktionieren würde.

Ich könnte eine "Kette" von Körpern schaffen, die durch RotationJoints verbunden sind, aber das ist auch weniger effizient und weniger robust. Ich wäre auch nicht in der Lage, die Länge willkürlich zu ändern, sondern nur durch Hinzufügen und Entfernen einer ganzen Anzahl von Links, und es ist nicht offensichtlich, wie ich den Rest verbinden würde, ohne vorhandene Verbindungen zu verletzen.

Das klingt nach etwas, das einfach zu tun sein sollte. Übersehe ich etwas?

Update : Es ist mir egal, ob das Seil "verformbar" ist, dh ob es sich tatsächlich wie ein Seil verhält oder ob es mit einer anderen Geometrie kollidiert. Nur ein gerades Seil reicht aus. Ich kann beim Rendern grafische Gimmicks machen. Sie müssen nicht in der Physik-Engine vorhanden sein. Ich möchte nur etwas, RopeJointdessen Länge ich nach Belieben ändern kann.

Thomas
quelle
mögliches Duplikat von Wie mache ich ein Seil von Punkt A nach B in Box2D?
MichaelHouse
Ich bin mir nicht sicher, ob das Seil in der von Ihnen gezeigten Demo ein Physikobjekt ist. Es sah so aus, als würde es nicht mit dem Charakter oder den Höhlenwänden kollidieren. Könnte nur einen Spline verwenden.
MichaelHouse
Ich benutze Box2D ziemlich oft und habe keine Ahnung, wie ich das erreichen soll und bezweifle, dass es möglich ist.
ClassicThunder
@ Byte56: Kein Betrüger. Das "erweiterbare" Bit ist das, was anders ist. Es ist mir auch egal, ob mein Seil gerade ist; Ich kann noch ein paar ausgefallene Animationen hinzufügen.
Thomas
1
Wenn Sie wirklich ein "verformbares" Seil wollen, werde ich meinen vorherigen Kommentar auf eine Antwort setzen.
Fableal

Antworten:

2

Wenn Sie ein "verformbares" Seil wollen, ist dies in box2d nicht möglich, da box2d eine Starrkörperphysik-Engine ist . Überprüfen Sie die Dynamik des weichen Körpers . Ich würde die Bullet-Bibliothek empfehlen .

Eine "einfachere" Lösung mit box2d wäre, die Variation der Länge zu "emulieren", indem ein Teil des Seils (mit fester Länge) außerhalb der sichtbaren Welt versteckt wird / ein Teil des Seils nicht gezeichnet wird.

Schema

Dies würde so funktionieren, als würde man das obere Ende (b) des Seils (c) nach oben / unten ziehen. Ich würde einige statische Objekte hinzufügen (a), damit der Ninja nicht zu lange der sichtbaren Welt entkommt ...

fableal
quelle
Entschuldigung, meine Beschreibung scheint immer noch nicht klar zu sein. Es ist mir egal, ob das Seil verformbar ist; Softbodies sind übertrieben, vor allem, weil ich auf eine mobile Plattform ziele.
Thomas
Ihre andere Idee ist interessant, aber ich sehe nicht ganz ein, wie ich dies mit starren Körpern und Gelenken einrichten würde. Ich könnte einen Stock verwenden, um das Seil zu simulieren, aber es würde den Abstand zwischen dem Ninja und dem Befestigungspunkt auf einen konstanten Wert beschränken, während ich ihn nur auf ein Maximum beschränken möchte.
Thomas
Ich habe das "deformable" nur der Vollständigkeit
halber
2

Ok, ich habe naiv angenommen, dass LibGDX die gesamte Box2D umhüllt, also wäre dies ein reines Box2D-Problem.

Es stellt sich heraus, dass Vanilla Box2D, zumindest im Kofferraum, eine Funktion namens hat b2RopeJoint::SetMaxLength. Ich habe es hinzugefügt und eine Pull-Anfrage innerhalb von Minuten zusammengeführt. Es ist jetzt in LibGDX-Nightlies verfügbar (und funktioniert).

Thomas
quelle