KI-Steuerung für ein Schiff mit Physikmodell


19

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.


Ich gehe davon aus, dass ich bald auf ein ähnliches Problem stoßen werde. Ich freue mich auf Antworten darauf.
Bill

Antworten:


15

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.


+1. Für ein 2D-Weltraumspiel würde ich empfehlen, Lenkverhalten als Rahmen zu verwenden und eine meiner Antworten als Komponente innerhalb dieses Rahmens zu verwenden.
Am

Wollte dasselbe vorschlagen, als ich die Frage las. Ich habe viel Lenkverhalten verwendet, es ist einfach und erlaubt eine ziemlich schöne KI / Bewegung.
Dotminic

5

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.


1

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.


Der red3d.com-Link bietet keine direkten Quellen , aber auf dieser Seite befindet sich ein Link zu OpenSteer ( opensteer.sourceforge.net ), einer Open-Source-Implementierung von Steuerungsverhalten.
Bummzack

Ahh wusste das nicht, danke. Ich habe mir jedoch die Quelle für OpenSteer angesehen und festgestellt, dass es einfacher ist, den in Bucklands Buch enthaltenen Gesichtscode besser zu verstehen. Besonders wenn man anfängt.
Ray Dey

1

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):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

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).



-3

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.


3
-1 Es hört sich so an, als ob Petteri Hietavirta weiß, wie man ein grundlegendes physikalisches System benutzt. Ihre Antwort auf diese Frage lautet also, dass es zu schwierig ist, auf einem Ziel anzuhalten?
AttackingHobo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.