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 RopeJoint
bietet 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 PulleyJoint
eher einer Stange als einem Seil ähnelt: Er beschränkt die maximale Länge, im Gegensatz dazu begrenzt RopeJoint
er die minimale auch.
Das Neuerstellen eines RopeJoint
jeden 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 RotationJoint
s 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, RopeJoint
dessen Länge ich nach Belieben ändern kann.
Antworten:
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.
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 ...
quelle
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).quelle