Ich mache ein einfaches Weltraumspiel in JavaScript, aber jetzt bin ich in Bezug auf Vektoren an eine Wand gestoßen.
Die Spielansicht befindet sich in einem 2D-Raster von oben nach unten. Wenn der Benutzer auf das Raster klickt, fliegt das Raumschiff zu diesem Punkt.
Also, wenn ich zwei Sätze von Punkten habe:
{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5, y : 55.95 }; // the clicked coordinates
Wenn die Spielschleife mit 60 Iterationen pro Sekunde tickt und die gewünschte Schiffsgeschwindigkeit 0,05 Punkte pro Tick (3 Punkte pro Sekunde) beträgt, wie berechne ich den neuen Koordinatensatz für das Schiff für jeden Tick der Spielschleife?
ps Ich möchte keine Trägheit oder mehrere Vektoren berücksichtigen, die sich auf das Schiff auswirken. Ich möchte nur, dass das Schiff anhält, was es tut (dh in eine Richtung fliegt) und sich mit statischer Geschwindigkeit zu den angeklickten Koordinaten bewegt.
quelle
goal_dist
in deinemif
Zustand?LERP - Lineare Interpolation
Ich habe diese Antwort vor einigen Tagen für ein ähnliches Problem gegeben, aber jetzt geht es los:
Die lineare Interpolation ist eine Funktion, mit der Sie basierend auf dem Fortschritt eine Zahl zwischen zwei Zahlen erhalten. Sie könnten tatsächlich einen Punkt zwischen zwei Punkten bekommen.
Die große Formel - wie man sie berechnet
Die allgemeine LERP-Formel ist gegeben durch
pu = p0 + (p1 - p0) * u
. Wo:Wie bekomme ich Prozentsatz
Sie fragen sich vielleicht: "Wie kann ich diesen Prozentsatz erhalten?". Mach dir keine Sorgen. Es ist wie folgt: Wie lange dauert es, bis der Startvektor fertig ist? Ok, dividiere es durch die Zeit, die bereits vergangen ist. Dies gibt Ihnen den Prozentsatz.
Schauen Sie, so etwas:
percentage = currentTime / finalTime;
Vektoren berechnen
Um einen resultierenden Vektor zu erhalten, müssen Sie die Formel nur zweimal anwenden, einmal für die X-Komponente und einmal für die Y-Komponente. Etwas wie das:
Variationszeit berechnen
Vielleicht möchten Sie Ihre Punkte mit einer Geschwindigkeit von 0,5 Punkten fahren lassen, ja? Nehmen wir also an, eine längere Strecke wird in einer längeren Zeit zurückgelegt.
Sie können dies wie folgt tun:
Holen Sie sich die Distanzlänge Dafür benötigen Sie zwei Dinge. Holen Sie sich den Distanzvektor und transformieren Sie ihn in einen Längenwert.
distancevec = final - start;
distance = distancevec.length();
Ich hoffe du kennst Vektoren Mathe. Wenn Sie dies nicht tun, können Sie mit dieser Formel eine Vektorlänge berechnen
d = sqrt(pow(v.x, 2) + pow(v.y, 2));
.Holen Sie sich die Zeit, die es dauern wird, und aktualisieren Sie die Endzeit. Dieser ist einfach. Da Sie für jede Zecke eine Länge von 0,5 erhalten möchten, müssen wir nur teilen und ermitteln, wie viele Zecken wir haben.
finalTime = distance / 0.5f;
Getan.
HINWEIS: Vielleicht ist dies nicht die beabsichtigte Geschwindigkeit für Sie, aber dies ist die richtige. Sie haben also eine lineare Bewegung, auch bei diagonalen Bewegungen. Wenn Sie x + = 0,5f, y + = 0,5f ausführen möchten, lesen Sie ein Vektor-Mathematikbuch und überprüfen Sie Ihre Pläne erneut.
quelle
progress
wie in dieser Antwort angegeben berechnet haben, sollte es im0..1
Bereich liegen. Tun Sie einfach:progressLeft = 1.0 - progress;
Dies kann erreicht werden, indem die Normalen der Richtung berechnet werden und dann die aktuelle Position über die parametrische Gleichung berechnet wird
Wobei t die Zeit ist, die vergangen ist, seit das Schiff in die gewünschte Richtung gefahren ist. Sie können dies auch per Update über durchführen
Und Sie berechnen dies einfach bei jedem Frame / Physik / etc. aktualisieren, bis das Schiff sein Ziel erreicht.
quelle