Ich habe ein Sprite welches Velocity
und Position
entweder als gespeichert hat Vector2
. Bei jedem Update
Zyklus wird die Geschwindigkeit zur Position addiert.
Ich möchte dem Sprite einen dritten Vektor geben Target
. Neue Ziele können bei jeder Iteration angegeben werden. Ich möchte, dass sich das Sprite im Wesentlichen in einem zufälligen Laufmuster bewegt, es müssen jedoch zwei Parameter verfügbar gemacht werden:
- Ein typischer zufälliger Gang vergrößert oder verkleinert gleichermaßen die Entfernung zu einem bestimmten Punkt
Target
(zuzüglich der geringen Wahrscheinlichkeit einer tangentialen Bewegung). Ich muss in der Lage sein, mein zufälliges Gehen so zu beeinflussen, dass die Richtung, in die das Sprite "entscheidet", eher dazu führt, dass es näher kommt, obwohl es noch zufällig istTarget
. - Der zufällige Gang sollte "glatt" sein - das Sprite sollte nicht schnell die Richtung ändern, da dies für den Spieler wie "Flackern" oder "Zittern" aussieht. Es sollte sich allmählich hin und her bewegen, sich zufällig bewegen und sich im Durchschnitt langsam nähern.
Was ist ein guter, einfacher Weg, dies zu tun? Wenn möglich, geben Sie die Antwort als Vector2 RandomWalk(Vector2 target)
Methode an.
Ich habe bereits eine NextGaussian(mean, stdev)
Methode zur Verfügung, wenn das hilfreich ist.
xna
c#
random
linear-algebra
Super
quelle
quelle
Antworten:
Ich würde das "Wander" -Lenkverhalten (Quellcode finden Sie hier ) so anpassen, dass die Zufallszahlen auf Ihr Ziel ausgerichtet sind.
quelle
Um einen reibungslosen, zufälligen Gang zu erzielen, können Sie Catmull-Rom-Splines verwenden . Diese Art von Spline nimmt eine Folge von Punkten auf und erzeugt glatte Kurven, die durch jeden Punkt verlaufen. So können Sie zufällige Wegpunkte erstellen, durch die sich das Sprite bewegen kann, und diese entlang eines Catmull-Rom-Splines durch die Wegpunkte animieren. Damit der Spline funktioniert, benötigen Sie insgesamt vier Wegpunkte: die vorherigen zwei und die nächsten zwei. Wenn das Sprite einen Wegpunkt erreicht, werfen Sie den ältesten aus Ihrer Vierergruppe weg und generieren Sie einen neuen. Fahren Sie dann mit der Animation entlang des Splines fort.
Eine Idee für die eventuelle Annäherung an das Ziel wäre es, die Verteilung des zufälligen Wegs zum Ziel zu verschieben. Wenn Sie beispielsweise in der Regel einen zufälligen Wegpunkt mit einer Gaußschen Verteilung auswählen, die auf der aktuellen Position Ihres Sprites zentriert ist, können Sie stattdessen die Mitte des Gaußschen um einen voreingestellten Abstand zum Ziel verschieben. Die relativen Größen des Versatzes und die Gaußsche Standardabweichung würden bestimmen, wie voreingenommen die Bewegung ist.
quelle
Hier ist etwas, das ich in etwa 20 Minuten aufgeschlagen habe. Wir nehmen die Richtung vom Geher zum Ziel und wählen eine Richtung innerhalb eines bestimmten Grads von dieser Richtung aus (ein Betrag, der abnimmt, wenn der Geher sich seinem Ziel nähert). Dieser Algorithmus berücksichtigt auch die Entfernung zum Ziel, damit er nicht am Ziel vorbeigeht. Lange Rede kurzer Sinn, es wackelt im Grunde genommen eine kleine zufällige Menge nach links und rechts und landet auf dem Ziel, wenn es näher kommt.
Um diesen Algorithmus zu testen, platzierte ich den Walker auf (10, 0, 10) und das Ziel auf (0, 0, 0). Als der Algorithmus das erste Mal ausgeführt wurde, wählte er zufällig eine Position für den Fußgänger aus (3,73f, 0, 6,71f). Nachdem der Läufer diese Position erreicht hatte, wählte er (2.11f, 0, 3.23), dann (0.96f, 0, 1.68f), dann (0.50f, 0, 0.79f) und ging direkt zum Ziel, weil es sich innerhalb befand ein minimaler Toleranzabstand.
Aus der Vogelperspektive betrachtet würde der Pfad wie die Punkte im Bild unten aussehen, beginnend bei "W" (Gehhilfe) und endend bei "T" (Ziel). Wenn Sie eine natürlichere Bewegung wünschen, kalkulieren Sie einige Punkte im Voraus und erstellen einen Spline, der Ihnen viel mehr Punkte gibt, denen der Walker folgen kann. Ich habe geschätzt, wie dieser Pfad aussehen würde, nachdem er zu einem Spline verarbeitet wurde. Dies wird durch die Linie im Bild dargestellt.
Und hier ist der Beispielcode:
Abhängig von Ihrem spezifischen Spiel können Sie die Abstände, das Sichtfeld, die Zufälligkeit und die Häufigkeit der Ausführung anpassen, bis sie Ihren Anforderungen entsprechen. Ich bin sicher, der Algorithmus könnte ein bisschen aufgeräumt und optimiert werden, ich habe nicht viel Zeit damit verbracht, ich wollte nur, dass er einfach zu lesen ist.
quelle