Comment interpoler linéairement entre deux vecteurs?

16

J'ai un vecteur de vitesse où mon client est et où il va, et j'ai le même vecteur qui vient du serveur indiquant où le client devrait être. Parfois, c'est un peu différent, donc je veux interpoler entre ma position actuelle et la position correcte du serveur.

entrez la description de l'image ici

La flèche noire est le vecteur de vitesse du client, la flèche rouge est le vecteur de vitesse du client sur le serveur et la flèche bleue est celle sur laquelle je veux calculer et interpoler.

Comment calculer le vecteur bleu? Alors, comment puis-je interpoler linéairement entre eux?

gmemario
la source

Réponses:

18

Le vecteur bleu peut être calculé facilement: rouge - noir (le signe entre les vecteurs est négatif). Mais si vous voulez simplement interpoler entre le vecteur noir et le vecteur rouge, vous n'avez pas à le calculer. L'interpolation linéaire n'est qu'une combinaison linéaire. Vous pouvez donc simplement prendre: alpha * noir + (1 - alpha) * rouge, où alpha doit provenir de l'intervalle <0,1>. Si alpha sera 1, alors vous obtiendrez un vecteur noir, quand alpha sera 0, vous obtiendrez un vecteur rouge.

Et si j'ai bien compris, vous interpolerez entre ces vecteurs dans le temps. Il suffit donc de choisir le bon incrément d'alpha dans le temps.

Vous ai-je bien compris? Ou vouliez-vous dire quelque chose de complètement différent?

zacharmarz
la source
Oui, tu m'as bien compris. Encore une question, comment puis-je multiplier le nombre pour le vecteur? Cette opération me rendra-t-elle un nouveau vecteur? Par exemple, le rouge est un vecteur (0, 10) avec une longueur de 8 et le noir est (-2, 5) avec une longueur de 4. Comment puis-je faire de l'alpha * noir ou (1 - alpha) * du rouge? Je vous remercie.
gmemario
Vous multipliez simplement chaque coordonnée vectorielle séparément. Si alpha est par exemple 0,5, alors alpha * noir + (1 - alpha) * rouge = (0,5) + (-1, 2,5) = (-1, 7,5) - si vous dessinez ceci sur du papier, vous verra que c'est vraiment exactement entre ces deux vecteurs.
zacharmarz
10

Prendre cette photo:

entrez la description de l'image ici

AB est le vecteur rouge de A à B.

Supposons que P représente 25% du trajet de A à B.

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

Donc 3/4 A et 1/4 B.

Une autre façon de trouver cela veut dire que vous voulez un vecteur 75% "proche" de A et 25% "proche" de B. (Un vecteur 100% "proche" de A n'est que le vecteur A.)

Ainsi, vous pourrez également trouver P comme:

A*t + (1-t)*B

Avec t = 0,75 (pour dire 75% "proche" de A)

0.75A + 0.25B

Ainsi, une simple fonction LERP en C pour une classe Vector3f serait:

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