Ich bin auf der Suche nach Ideen, wie man das Folgen im 2D-Raum umsetzt. Leider weiß ich noch nicht viel über AI / Path Finding / Autonomous Control.
Nehmen wir an, dieses Schiff kann sich frei bewegen, hat aber Masse und Dynamik. Es kann auch durch äußere Kräfte beeinflusst werden (Explosionen usw.). Der Spieler kann jederzeit ein Ziel für das Schiff festlegen und es sollte diesen Punkt erreichen und anhalten.
Ohne Physik wäre dies einfach, zeigen Sie einfach auf die Richtung und gehen Sie. Aber wie geht man mit dem vorhandenen Schwung um und bleibt dann vor Ort stehen? Ich möchte die Position des Schiffes nicht direkt ändern.
edit: Nur um klar zu stellen, die physikalische Mathematik des Schiffes selbst ist nicht das Problem.
physics
ai
path-finding
movement
Petteri Hietavirta
quelle
quelle
Antworten:
Schauen Sie sich das Lenkverhalten an . Insbesondere Suche und Ankunft könnten für Ihre Bedürfnisse interessant sein. Dieses Verhalten funktioniert auch, wenn andere Einflüsse wie eine Explosion die Schiffsposition vorübergehend ändern.
quelle
Es ist kein leichtes Problem, genau das Richtige zu finden. Sie haben zwei Möglichkeiten, obwohl die Besonderheiten jeder Lösung variieren:
Eine mathematische Lösung. Wenn Ihr physikalisches System einfach genug ist, können Sie die geschlossene Form für Ihre Bewegung erstellen und berechnen, wann Sie eine Bremskraft aufbringen müssen, um an einem Punkt anzuhalten. Wenn Ihre Bremskraft konstant ist und Sie keinen Luftwiderstand haben, sollte sich dieser in ein Quadrat auflösen.
Eine kaiserliche Lösung. Sie können einen handabgestimmten PID-Regler verwenden oder die Bremswege für Ihr Schiff in Ihrem Physiksystem aufzeichnen: Bremsen Sie das Schiff in einem Prüfstand von der Höchstgeschwindigkeit bis zum Stillstand, zeichnen Sie die zurückgelegte Strecke auf und beschleunigen Sie jeden kleinen Zeitschritt. Speichern Sie das resultierende Distanz- / Geschwindigkeitsdiagramm in einem Datenverzeichnis.
Rekonstruieren Sie zur Laufzeit das Diagramm, und geben Sie Ihre aktuelle Geschwindigkeit und die Zielgeschwindigkeit ein, um eine Entfernung zu überwinden. In dieser Entfernung von Ihrem Zielpunkt müssen Sie Vollbremsung haben.
Der Vorteil dieses Ansatzes ist, dass Sie damit auf jede Geschwindigkeit genau bremsen können. Der Nachteil ist, dass Sie nie genau in der Kurve sind, wenn Ihre Bremsen an oder aus rampen müssen.
quelle
Wie gesagt, diese Situation ist perfekt für Lenkverhalten, aber ich möchte sie nur etwas erweitern. Das Verhalten "Ankommen" wäre für dieses Szenario perfekt. Vielleicht möchten Sie auch Hindernisse berücksichtigen. Auch hier können Sie das Verhalten zur Hindernisvermeidung nutzen.
Leider bietet http://www.red3d.com/cwr/steer/ keinen Quellcode für das Verhalten. Das Programmieren von Spiel-KI anhand eines Beispiels erklärt jedoch das Verhalten in leicht verständlichen Abschnitten. Wenn Sie das Buch nicht bekommen können, können Sie den Quellcode immer hier bekommen: http://www.wordware.com/files/ai/
Wenn Sie Ihre Bewegung auch auf die Pfadfindung ausweiten möchten, können Sie eine Pathfinder-Klasse verwenden, die den Pfad berechnet (möglicherweise als Sammlung von 2D-Vektoren) und das Steuerverhalten "Pfad folgen" verwendet, um diesen auch in den Mix einzufügen.
Der Quellcode, mit dem ich verlinkt habe, bietet auch drei verschiedene Methoden zum Kombinieren dieser Lenkverhalten.
Hoffentlich hilft das.
quelle
Das Lenken in Richtung einer Position ist nicht allzu schwierig, aber ich persönlich hatte eine Weile Probleme damit, in Richtung einer Position zu lenken und diese mit einer bestimmten Geschwindigkeit zu erreichen oder einem Pfad mit Geschwindigkeitsbeschränkungen zu folgen.
Ich habe das Problem mit einer Hermite-Kurve gelöst . Stellen Sie p0 und m0 auf die Position und Geschwindigkeit Ihres Schiffes ein, p1 und m1 auf Ihre Zielposition und Geschwindigkeit. Dies setzt voraus, dass Sie möchten, dass das Schiff eine Sekunde nach dem Ziel folgt. Berechnen Sie die zweite Ableitung von p (0), die Ihnen die Beschleunigung für Ihr Schiff gibt.
Hier ist der Code für die zweite Ableitung (in F # können Sie ihn hoffentlich an Ihre Sprache anpassen; sq () berechnet das Quadrat, einfache Anführungszeichen, die nicht als Anführungszeichen, sondern als Zeichen interpretiert werden und Teil des Bezeichners sind):
Beachten Sie, dass Sie bei der Berechnung des Schubes aus der Beschleunigung berücksichtigen müssen, wenn Ihr Schiff äußeren Kräften ausgesetzt ist (z. B. Schwerkraft von Planeten).
quelle
Vor kurzem gefunden - Steuerungsverhalten in JavaScript und Verarbeitung:
http://shawnldoria.com/works/steering-behaviors.html
quelle
Ich denke, Ihr Schiff sollte Parameter wie Position und Geschwindigkeit haben.
Die Geschwindigkeit ist in jedem Frame die Summe aller Kräfte (wie Schwerkraft, Explosionen, Benutzereingaben usw.) und kann auch eine Art Feuchtigkeit aufweisen.
Die Position wird aus der letzten Position plus der Geschwindigkeit * time_step berechnet.
Hiermit kann es jedoch schwierig sein, das Anhalten am Ziel zu implementieren.
quelle