Question

Je veux passer quelque chose à une distance déterminée. Cependant, dans mon système il y a inertie / glisser / accelaration négatif. J'utilise un calcul simple comme celui-ci pour lui:

v = oldV + ((targetV - oldV) * inertia)

L'application que sur un certain nombre de cadres rend le mouvement « rampe jusqu'à » ou la décomposition, par exemple:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame

Je sais la distance que je veux voyager et l'accélération, mais pas la vitesse initiale qui va me arriver. Peut-être une meilleure explication est que je veux savoir à quel point de frapper une balle de billard afin qu'il arrête sur un certain point.

J'ai regardé les équations du mouvement ( http://en.wikipedia.org/wiki / Equations_of_motion ) mais ne peut pas travailler ce que le bon pour mon problème est ...

Toutes les idées? Merci - Je suis d'un arrière-plan de la conception pas de la science

.

Update: Fiirhok a une solution avec une valeur d'accélération déterminée; HTML + jQuery démo:
http://pastebin.com/ekDwCYvj
Est-il possible de le faire avec une valeur fractionnelle ou une fonction d'assouplissement? L'avantage de cela dans mon expérience est que l'accélération fixe et de l'animation à base de trames Dépasse parfois le point final et doit être forcé, ce qui crée un léger défaut serpentine.

Était-ce utile?

La solution

Ceci est un simple problème cinématique.

A un instant t, la vitesse (v) d'un objet en accélération constante est décrit par:

v = v0 + at

Si v0 est la vitesse initiale et a est l'accélération. Dans votre cas, la vitesse finale est égale à zéro (l'objet est arrêté) afin que nous puissions résoudre pour t:

t = -v0/a

Pour la différence totale parcourue, nous prenons l'intégrale de la vitesse (la première équation) au fil du temps. Je ne l'ai pas fait une intégrale des années, mais je suis sûr que celui-ci fonctionne à:

d = v0t + 1/2 * at^2

On peut remplacer dans l'équation T nous avons développé ealier:

d = v0^2/a + 1/2 * v0^2 / a

Et pour résoudre v0:

v0 = sqrt(-2ad)

Ou, dans un format plus langage de programmation:

initialVelocity = sqrt( -2 * acceleration * distance );

L'accélération dans ce cas est négatif (l'objet ralentit), et je suppose qu'il est constant, sinon cela devient plus compliqué.

Si vous souhaitez utiliser cette dans une boucle avec un nombre fini d'étapes, vous aurez besoin d'être un peu prudent. Chaque itération de la boucle représente une période de temps. L'objet se déplace un montant égal à la moyenne de la vitesse par la longueur du temps. Une boucle d'échantillon avec la durée d'une itération égale à 1 ressemblerait à quelque chose comme ceci:

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}

Autres conseils

Si vous voulez déplacer une distance définie, utilisez ce qui suit:

text alt

La distance parcourue est juste l'intégrale de la vitesse par rapport au temps. Vous devez intégrer votre expression par rapport au temps des limites [v, 0] et cela vous donnera une expression pour la distance en termes de v (vitesse initiale).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top