Jak interpolować liniowo między dwoma wektorami?

16

Mam wektor prędkości, w którym znajduje się mój klient i dokąd zmierza, i mam ten sam wektor, który pochodzi z serwera, informując, gdzie powinien być klient. Czasami jest trochę inaczej, więc chcę interpolować moją aktualną pozycję do prawidłowej pozycji serwera.

wprowadź opis zdjęcia tutaj

Czarna strzałka to wektor prędkości klienta, czerwona strzałka to wektor prędkości klienta na serwerze, a niebieska strzałka to ta, którą chcę obliczyć i interpolować.

Jak obliczyć niebieski wektor? Jak mogę interpolować liniowo między nimi?

gmemario
źródło

Odpowiedzi:

18

Wektor niebieski można łatwo obliczyć: czerwono - czarny (znak między wektorami to minus). Ale jeśli chcesz tylko interpolować wektor czarny i czerwony, nie musisz go obliczać. Interpolacja liniowa to po prostu kombinacja liniowa. Możesz więc wziąć: alfa * czarny + (1 - alfa) * czerwony, gdzie alfa musi być z przedziału <0,1>. Jeśli alfa będzie równe 1, otrzymasz czarny wektor, a gdy alfa będzie równy 0, otrzymasz czerwony wektor.

A jeśli dobrze to zrozumiałem, z czasem interpolujesz te wektory. Więc po prostu wybierz odpowiedni przyrost alfa w czasie.

Czy zrozumiałem cię, prawda? A może miałeś na myśli coś zupełnie innego?

zacharmarz
źródło
Tak, masz rację. Jeszcze tylko jedno pytanie, jak pomnożyć liczbę dla wektora? Czy ta operacja zwróci mi nowy wektor? Na przykład czerwony to wektor (0, 10) o długości 8, a czarny to (-2, 5) o długości 4. Jak zrobić alfa * czarny lub (1 - alfa) * czerwony? Dziękuję Ci.
gmemario
Wystarczy pomnożyć każdą współrzędną wektora osobno. Jeśli alfa wynosi na przykład 0,5, to alfa * czarny + (1 - alfa) * czerwony = (0,5) + (-1, 2,5) = (-1, 7,5) - jeśli narysujesz to na papierze, zobaczymy, że to naprawdę dokładnie między tymi dwoma wektorami.
zacharmarz
10

Robienie tego zdjęcia:

wprowadź opis zdjęcia tutaj

AB to czerwony wektor od A do B.

Powiedzmy, że P to 25% drogi od A do B. Podstawowym sposobem na dostanie się do P od początku jest

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

Więc 3/4 A i 1/4 B.

Innym sposobem na znalezienie tego jest stwierdzenie, że wektor 75% „blisko” do A i 25% „blisko” do B. (Wektor, który jest w 100% „blisko” do A, to tylko wektor A).

Więc możesz również znaleźć P jako:

A*t + (1-t)*B

Przy t = 0,75 (75% „blisko” do A)

0.75A + 0.25B

Tak więc prostą funkcją LERP w C dla klasy Vector3f byłoby:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
Bobobobo
źródło