3 Stimmen

Simulation eines Autos, das sich auf einer Strecke bewegt

Für die Klasse Betriebssysteme werde ich einen Planungssimulator mit dem Titel "Jurrasic Park" schreiben.

Das ultimative Ziel ist es, eine Reihe von Autos zu haben, die einem bestimmten Weg folgen, und Fahrgäste, die an einem bestimmten Ort auf die Rückkehr dieser Autos warten, damit sie abgeholt und auf die Tour mitgenommen werden können. Dies wird eine einfache 2D-Draufsicht auf die Strecke und die Wagen, die sich auf ihr bewegen.

Ich kann dies zwar leicht programmieren, ohne etwas visuell darstellen zu müssen, bin mir aber nicht ganz sicher, wie ich ein Auto, das sich auf einer festen Strecke bewegt, am besten implementieren kann.

Für den Anfang werde ich einfach OpenGL verwenden, um meine Autos als Rechtecke zu zeichnen, aber ich bin immer noch ein wenig verwirrt darüber, wie ich die Position des Autos aktualisieren und sicherstellen kann, dass es sich entlang des festgelegten Pfades für den simulierten Themenpark bewegt.

Sollte ich die Eckpunkte des Tracks in einer Liste speichern und jeden Aufruf von update() die Autos einen Schritt näher an den nächsten Scheitelpunkt bringen?

2voto

Furious Coder Punkte 1150

Wenn Sie eine gekrümmte Strecke wünschen, können Sie Splines verwenden, d. h. mathematisch definierte Kurven, die durch zwei Vektorendpunkte festgelegt werden. Sie legen die Endpunkte fest und lösen dann eine schöne Kurve zwischen ihnen. Eine Suche sollte Quellcode oder mathematische Formeln zutage fördern, die Sie in Quellcode umwandeln können. Das Schöne daran ist, dass Sie die Richtung Ihres Fahrzeugs genau bestimmen und die nächste Position auf Ihrem Weg durch eine Prozentrechnung ermitteln können. Die Schwierigkeit besteht darin, dass Sie eine Kurvenlängenberechnung durchführen müssen, wenn Sie nicht die gleiche Anzahl von Schritten zwischen den einzelnen Endpunkten haben wollen.

Eine andere Möglichkeit besteht darin, eine versteckte Bitmap zu verwenden, auf der der Pfad als ein Pixel breite Kurve gezeichnet wird. Sie können die nächste Position auf dem Pfad finden, indem Sie die Pixel, die Ihre aktuelle Position umgeben, mit einem Fahrtrichtungsvektor abgleichen und den Vektor dann bei jedem Schritt mit einer Deltafunktion aktualisieren. Wir haben diesen Ansatz für einen Prototyp verwendet, bei dem ein "Fahrzeug" mit einem Joystick über verschiedene Pfade "gefahren" wurde, und es funktioniert gut, bis man einige Kreuzungen hat, die die Vektorberechnungen durcheinander bringen. Aber wenn es sich um eine unidirektionale geschlossene Schleife handelt, würde dies sehr gut funktionieren, und es ist ganz einfach zu implementieren. Sie können den Kurswinkel Ihres Fahrzeugs glätten, indem Sie die letzten Deltas mitteln. Außerdem wird jedes Pixel zu einem "Schritt", so dass die Geschwindigkeitskontrolle einfach ist.

Im ersten Fall können Sie speziell gekennzeichnete Endpunkte für Start-/Stopporte oder Points of Interest haben. Im letzteren Fall verwenden Sie einfach einen andersfarbigen Pixel auf dem Pfad für besondere Knotenpunkte. In beiden Fällen werden wahrscheinlich nicht die zugrundeliegenden Pfaddaten angezeigt, sondern eine aufgehübschte Darstellung des "Parks".

Wählen Sie einfach die einfachste Lösung und schreiben Sie eine tick()-Funktion, die den nächsten Pfad ansteuert und die Richtung des Fahrzeugs aktualisiert, sobald es in Bewegung ist. Wenn Sie wirklich clever sind, können Sie einige Radius-basierte Kollisionsbehandlung tun, so dass Autos automatisch anhalten, wenn ein Auto vor ihnen auf der Strecke angehalten hat.

0voto

elcuco Punkte 8626

Ich würde es einfach halten:

Lasse einen Timer laufen (alle 100msec) und zeichne bei jedem Timer eines der Autos an der neuen Position. Die Position wird aus einer Datei gelesen, die die 2D-Koordinaten des Autos enthält (jedes Auto?).

Wenn die Straße sehr lang ist (sagen wir 30 Sekunden), wäre das Schreiben von 30*10 Punkten... schwierig. Wie wäre es also, wenn man in der Datei die Position zu jeder vollen Sekunde speichert? Dann hat man zwischen diesen 2 Intervallen 9 tote Winkel, indem man das Auto mit konstanter Geschwindigkeit bewegt (x += dx/9, y+= dy/9).

Ich würde gerne einen besseren Ansatz hören :)

0voto

Simeon Pilgrim Punkte 16385

Nun, Sie könnten einen Pfad verwenden, wie Sie ihn beschreiben, entweder einen Festpunktpfad oder einen Spline. Dann bewegen Sie sich mit einer festen "Geschwindigkeit" auf diesem Pfad. Dies kann steif aussehen, wenn sich das Auto auf der Geraden und in der Kurve mit der gleichen Geschwindigkeit bewegt.

Man könnte also Geschwindigkeiten für jeden Streckenabschnitt haben, aber man bräuchte viele Geschwindigkeitssollwerte, oder man müsste die Geschwindigkeiten überlagern, weil man sonst ruckartige Geschwindigkeitsänderungen bekommt.

Oder Sie könnten sich für eine vollständige Fahrzeugsimulation entscheiden und einen A* verwenden, um den optimalen Weg zu finden. Das ist zu viel des Guten aber sehr cool .

0voto

James Black Punkte 41034

Wenn es nur vorwärts und rückwärts geht und Sie wissen, dass Sie vorwärts gehen wollen, können Sie einfach die Zellen um Sie herum betrachten, die Zellen mit der Farbe der Straße finden und sich so bewegen, dass Sie in der Mitte der Straße bleiben.

Wenn Sie davon ausgehen, dass Sie keine abrupten Kurven haben werden, können Sie davon ausgehen, dass die Straße direkt vor Ihnen liegt, und einfach nach links und rechts schauen, ob die Straße ein wenig kurvig ist, um in der Mitte zu bleiben, um die Verarbeitung zu reduzieren.

Es gibt noch andere Ansätze, die funktionieren könnten, aber dieser ist IMO einfach und ermöglicht Ihnen sanfte Kurven auf Ihrer Straße.

Ein anderer Ansatz ist, dass es nur auf Kacheln basiert, so dass man nur auf die Kachel vor sich schaut und verschiedene Kacheln für Änderungen der Straßenrichtung hat, so dass man weiß, wie man das Auto drehen muss, um auf der Kachel zu bleiben.

Das wäre zwar nicht ganz so reibungslos, ist aber auch leicht zu bewerkstelligen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X