Wie erstelle ich ein Seil?

8

Ich würde dieses Spiel gerne neu erstellen , aber ich habe keine Ahnung, wie ich das Seil oder seine Einflüsse auf den Ball erstellen soll.

Geben Sie hier die Bildbeschreibung ein

Grundsätzlich gibt es ein Seil, das an einem Ende am Mauszeiger und am anderen Ende an einer massiven Kugel befestigt ist. Während der Benutzer seine Maus bewegt, folgen Seil und Ball, als würden sie im wirklichen Leben einen Dreschflegel oder dergleichen schwingen.

Wie würde ich vorgehen, um ein Seil wie im obigen Spiel zu erstellen?

Ich muss die grundlegenden Konzepte und die Physik kennen, die hinter der Erstellung eines solchen Seils stehen, und nicht, wie man eine bereits vorhandene Bibliothek verwendet, um eines zu erstellen. Ich möchte in der Lage sein, ein Seil von Grund auf neu zu implementieren, also muss ich wissen, wie es gemacht werden kann.

Vielen Dank!

theonlygusti
quelle

Antworten:

3

Das Seil in Ihrem Beispiel ist wahrscheinlich nur ein einfaches Physikgelenk, das den Abstand des Balls zum Mauszeiger begrenzt. Diese Verbindungen werden typischerweise als "Seilverbindung" oder "Federverbindung" bezeichnet.

Es scheint, dass die Wellen in der Saite nicht auf einer tatsächlichen Physik-Simulation basieren. Höchstwahrscheinlich handelt es sich um eine Bezierkurve, bei der die Kontrollpunkte weiter von der Mittelachse weggedrückt werden, wenn sich der Ball näher an der Mausposition befindet.

Während die akzeptierte Antwort erklärt, wie ein realistisches Seil innerhalb der Physik-Engine erstellt wird, ist es manchmal vorzuziehen, eine viel einfachere Lösung zu haben (wie oben beschrieben). Die einfachere Lösung (mit nur einer Verbindung) verbessert die Stabilität der Simulation erheblich. Mehrere verbundene Gelenke mit großen Kräften neigen zum Zittern und können zu gebrochenen und sich unregelmäßig bewegenden Gelenkketten führen.

Natürlich können Sie auch beide Methoden kombinieren, indem Sie Ihr Seil als solches erstellen:

  1. Eine Kette von Knoten, die durch Gelenke verbunden sind
  2. Ein Seil- / Federgelenk vom ersten bis zum letzten Knoten der Kette, das sicherstellt, dass Sie die Kette nicht weiter als bis zu einem bestimmten maximalen Abstand auseinander ziehen können (einer der Hauptgründe, warum diese Ketten instabil werden).

Dies führt zu einer realistischeren Kette (die sogar auf andere Objekte in der Physik-Engine reagieren kann), erfordert jedoch mehr Rechenleistung als nur ein Federgelenk mit "falschem" Kettenverhalten.

bummzack
quelle
Vielen Dank für den Hinweis! Wie würden die Kontrollpunkte des Bezier manipuliert, da das Beispiel sehr realistisch erscheint, nicht einfach wie ein Bezier, bei dem es begradigt und "gequetscht" wird?
Theonlygusti
Ich denke nicht, dass es überhaupt sehr realistisch aussieht. Es fügt dem Seil nur ein paar Wellen hinzu, es biegt sich nicht oder so ... für mich sieht es so aus, als würde es nur begradigt und gequetscht.
Bummzack
Ich habe jedoch festgestellt, dass die Kurven in unterschiedlichen Winkeln zueinander stehen können. Wie wird dies erreicht?
Theonlygusti
Fügen Sie einige zufällige Offsets hinzu, damit es jedes Mal anders aussieht?
Bummzack
Ok ja; Es scheint so, als ob es im Spiel gemacht wurde, aber tatsächlich (und das wird jedem bizarr erscheinen) macht es die von mir verwendete Programmiersprache einfacher, eine Physik-Engine zu erstellen, wie Kyranstars Antwort gezeigt hat, als Bezier-Kurven zu zeichnen.
Theonlygusti
10

Grundsätzlich müssen Sie eine Physik-Engine erstellen. Ein Seil ist konzeptionell ein Bündel von "Knoten", die mit Federn verbunden sind.

Grundsätzlich übt jeder Tick, jeder Knoten eine Kraft auf die darüber und darunter liegenden Knoten aus, proportional zu ihrem Abstand (oder wie weit sie von ihrer bequemen Dehnungslänge entfernt sind). Wenn Sie eine Kugel anbringen möchten, verbinden Sie sie einfach mit einem Federgelenk mit dem unteren Knoten des Seils.

Dies ist ein großartiges Tutorial zum Erstellen einer Physik-Engine, aber es geht nicht wirklich um Einschränkungen oder Verbindungen.

Hier ist ein Tutorial über grundlegende Federn, die alles sein sollten, was Sie für ein solches Seil benötigen.

Dies ist ein Seil, das in meiner (sehr einfachen) Physik-Engine erstellt wurde . Es hat offensichtlich einige Macken (die seltsame Vibration), aber es ist im Allgemeinen das, wonach Sie suchen. Wenn Sie das Seil ziehen, zeichnen Sie einfach nicht die Knoten.

Bearbeiten:

Um ein gut aussehendes Seil herzustellen, sieht ein "Fadengelenk" tatsächlich viel schöner aus und kommt Ihrem Beispiel näher. Ein Fadengelenk ist im Grunde eine Feder, korrigiert die Objekte jedoch nur, wenn sie zu weit voneinander entfernt sind (nicht, wenn sie zu nahe beieinander liegen).

Dies ist stattdessen mein Seil mit einer Schnurverbindung: Geben Sie hier die Bildbeschreibung ein

Kyranstar
quelle
"Wenn Sie das Seil ziehen, zeichnen Sie einfach nicht die Knoten." - hat mich zum Lachen gebracht :) Danke, dass du meine extreme Noob-ishness berücksichtigt hast. Wäre der Ball dann nur ein weiterer Knoten? Von größerer Masse? (Hat jeder Knoten eine Masse?)
theonlygusti
Ja, das tun sie! Im Allgemeinen besteht die beste Möglichkeit, Massen intuitiv zu berechnen, darin, jeder Kugel eine Dichte zu geben und diese einfach mit ihrer Fläche zu multiplizieren. Sie können dies jederzeit anpassen, um bessere Ergebnisse in Ihrem eigentlichen Spiel zu erzielen.
Kyranstar
Normalerweise würde ich dies in einer objektorientierten Sprache implementieren, mit einer Klasse für einen Knoten, mit Eigenschaftsdichte, Masse usw., aber ich bin gezwungen, eine Sprache zu verwenden, in der OOP nahezu unmöglich ist. Wie würden Sie unter diesen Bedingungen Knoten usw. einrichten?
Theonlygusti
Um ehrlich zu sein, habe ich sehr wenig Erfahrung mit Nicht-OOP-Sprachen. Sie könnten sich Chipmunk2D ansehen , eine in C geschriebene Physik-Engine. Natürlich benötigen Sie eine Möglichkeit, diese Daten in einer zusammenhängenden Einheit zu speichern.
Kyranstar
Okay, danke; Letzte Frage: Ist der graue Knoten ein Knoten im Sinne der anderen? Was ist das Besondere daran, dass es still bleibt?
Theonlygusti