LERP - Interpolation linéaire
J'ai donné cette réponse pour un problème similaire il y a quelques jours, mais c'est parti:
L'interpolation linéaire est une fonction qui vous donne un nombre entre deux nombres, en fonction de la progression. Vous pourriez en fait, obtenir un point entre deux points.
La grande formule - Comment la calculer
La formule générale du LERP est donnée par pu = p0 + (p1 - p0) * u
. Où:
- pu: le numéro du résultat
- p0: le nombre initial
- p1: Le nombre final
- u: Le progrès. Il est donné en pourcentage, entre 0 et 1.
Comment obtenir un pourcentage
Vous vous demandez peut-être: "Comment puis-je obtenir ce pourcentage!?". Ne t'inquiète pas. C'est comme ceci: combien de temps le point prendra-t-il pour voyager pour que le vecteur de départ se termine? Ok, divisez-le par le temps qui s'est déjà écoulé. Cela vous donnera le pourcentage.
Regardez, quelque chose comme ça: percentage = currentTime / finalTime;
Calcul des vecteurs
Pour obtenir un vecteur résultant, il vous suffit d'appliquer la formule deux fois, une pour le composant X et une pour le composant Y. Quelque chose comme ça:
point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;
Calcul du temps variable
Vous voudrez peut-être que vos points voyagent à une vitesse de 0,5 point, oui? Disons donc qu'une distance plus longue sera parcourue dans un temps plus long.
Vous pouvez le faire comme suit:
Obtenez la longueur de la distance Pour cela, vous aurez besoin de deux choses. Obtenez le vecteur de distance, puis transformez-le en valeur de longueur.
distancevec = final - start;
distance = distancevec.length();
J'espère que vous connaissez les vecteurs mathématiques. Si vous ne le faites pas, vous pouvez calculer une longueur vectorielle par cette formule d = sqrt(pow(v.x, 2) + pow(v.y, 2));
.
Obtenez le temps qu'il faudra et mettez à jour la dernière fois. Celui-ci est facile. Comme vous voulez que chaque tick vous donne une longueur de 0,5, il suffit de diviser et d'obtenir le nombre de ticks que nous avons obtenus.
finalTime = distance / 0.5f;
Terminé.
AVIS: Peut-être que ce n'est pas la vitesse prévue pour vous, mais c'est le bon. vous avez donc un mouvement linéaire, même sur les mouvements diagonaux. Si vous vouliez faire x + = 0,5f, y + = 0,5f, alors lisez un livre de mathématiques vectorielles et revérifiez vos plans.
goal_dist
dans tonif
état?