Wie interpoliere ich linear zwischen zwei Vektoren?

16

Ich habe einen Geschwindigkeitsvektor, wo sich mein Client befindet und wohin er geht, und ich habe denselben Vektor, der vom Server kommt und angibt, wo sich der Client befinden soll. Manchmal ist es ein bisschen anders, also möchte ich zwischen meiner aktuellen Position und der korrekten Position des Servers interpolieren.

Bildbeschreibung hier eingeben

Der schwarze Pfeil ist der Client-Geschwindigkeitsvektor, der rote Pfeil ist der Client-Geschwindigkeitsvektor auf dem Server und der blaue Pfeil ist derjenige, den ich berechnen und interpolieren möchte.

Wie berechne ich den blauen Vektor? Wie kann ich dann zwischen ihnen linear interpolieren?

gmemario
quelle

Antworten:

18

Der blaue Vektor kann einfach berechnet werden: rot - schwarz (das Vorzeichen zwischen den Vektoren ist minus). Wenn Sie jedoch nur zwischen schwarzen und roten Vektoren interpolieren möchten, müssen Sie diese nicht berechnen. Die lineare Interpolation ist nur eine lineare Kombination. Sie können also einfach Folgendes nehmen: alpha * schwarz + (1 - alpha) * rot, wobei alpha aus dem Intervall <0,1> stammen muss. Wenn Alpha 1 ist, erhalten Sie einen schwarzen Vektor. Wenn Alpha 0 ist, erhalten Sie einen roten Vektor.

Und wenn ich es richtig verstanden habe, werden Sie zwischen diesen Vektoren zeitlich interpolieren. Wählen Sie also einfach die richtige Alpha-Schrittweite.

Habe ich dich richtig verstanden? Oder meintest du etwas völlig anderes?

Zacharmarz
quelle
Ja, du hast mich richtig verstanden. Nur noch eine Frage: Wie multipliziere ich die Zahl für den Vektor? Wird mir diese Operation einen neuen Vektor zurückgeben? Zum Beispiel ist Rot ein Vektor (0, 10) mit einer Länge von 8 und Schwarz ist (-2, 5) mit einer Länge von 4. Wie mache ich Alpha * Schwarz oder (1 - Alpha) * Rot? Vielen Dank.
Gmemario
Sie multiplizieren einfach jede Vektorkoordinate separat. Wenn Alpha zum Beispiel 0,5 ist, dann ist Alpha * Schwarz + (1 - Alpha) * Rot = (0,5) + (-1, 2,5) = (-1, 7,5) - wenn Sie dies auf Papier zeichnen, dann Sie wird sehen, es ist wirklich genau zwischen diesen beiden Vektoren.
Zacharmarz
9

Aufnahme dieses Bildes:

Bildbeschreibung hier eingeben

AB ist der rote Vektor von A nach B.

Sagen wir, P ist 25% des Weges von A nach B. Der grundlegende Weg, um P vom Ursprung aus zu erreichen, ist

A + ( B - A ) / 4
= 3/4 A   +   B / 4

Also 3/4 A und 1/4 B.

Eine andere Möglichkeit, dies herauszufinden, besteht darin, dass Sie einen Vektor von 75% "nahe" an A und 25% "nahe" an B wünschen. (Ein Vektor, der 100% "nahe" an A ist, ist nur der A-Vektor.)

Sie finden also auch P als:

A*t + (1-t)*B

Mit t = 0,75 (um 75% "nah" an A zu sagen)

0.75A + 0.25B

Eine einfache LERP-Funktion in C für eine Vector3f-Klasse wäre also:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
Bobobobo
quelle