1
votes

Déplacer l'objet le long de la courbe avec une vitesse personnalisée

J'ai une courbe catmull-rom définie avec quelques points de contrôle comme indiqué ici:

img

Je voudrais animer un objet se déplaçant le long de la courbe, mais être capable de définir la vitesse de l'objet.

Lors de l'itération sur les points de la courbe à l'aide de la méthode getPoint, l'objet se déplace de manière harmonieuse (dans l'image, à u = 0, nous sommes à p1, à u = 0,25, nous sommes à p2 etc.). À l'aide de la méthode getPointAt, l'objet se déplace à une vitesse uniforme le long de la courbe.

Cependant, ce que je voudrais, c'est avoir un plus grand contrôle sur l'animation, afin de pouvoir spécifier que le mouvement de p1 à p2 devrait prendre 0,5, de p2 à p3, 0,3 et de p3 à p4 0,2. Est-ce possible?


2 commentaires

oui c'est possible mais il faut prendre en compte la distorsion car le paramètre u est non linéaire et il dépend de la courbure et de l'uniformité des points de contrôle (distance entre eux) donc pour une meilleure précision il vous faudrait d'abord pour linéariser u (convertir entre la longueur d'arc / courbe et u ) puis vous pouvez appliquer n'importe quelle physique dessus ... Pour la linéarisation, vous pouvez utiliser la recherche binaire ou plus trucs mathématiques dont je ne suis pas au courant qui peuvent calculer la distance depuis le début de la courbe à partir de u et aussi vers l'arrière


Merci, c'est ce que j'ai fait à la fin.


3 Réponses :


0
votes

Cependant, ce que je voudrais, c'est avoir un plus grand contrôle sur l'animation, afin de pouvoir spécifier que le mouvement de p1 à p2 devrait prendre 0,5, de p2 à p3, 0,3 et de p3 à p4 0,2. Est-ce possible?

Vous pouvez y parvenir en utilisant une bibliothèque d'animations telle que tween.js . De cette manière, vous pouvez spécifier la position de début et de fin de votre objet et la durée souhaitée. Il est également possible de personnaliser le type de transition en utilisant les fonctions d'accélération .


0 commentaires

0
votes

Vous avez plusieurs options, je vais décrire la théorie et ensuite une implémentation possible.

Théorie

Vous souhaitez paramétrer arclength votre courbe. Ce qui signifie qu'un incrément de 1 dans le paramètre entraîne une distance de déplacement le long de la courbe de 1.

Cette paramétrisation vous permettra de contrôler totalement le mouvement de votre objet à n'importe quelle vitesse que vous voulez, qu'elle soit constan't linéaire, non linéaire, par morceaux ...

Application possible

Il existe de nombreuses techniques d'intégration numérique qui vous permettront de paramétrer la longueur de la courbe.

Un possible sur est de précalculer les valeurs et de les mettre sur une table. Choisissez un petit epsilon et en commençant à la première valeur de paramètre x_0, évaluez la fonction à x_0, x_0 + epsilon, x_0 + 2 * epsilon ...

En faisant cela, prenez la distance linéaire entre chaque échantillon et ajoutez-la à un accumulateur. c'est-à-dire travelled_distance + = length (échantillon [x], échantillon [x + 1]).

Stockez la paire dans une table.

Maintenant, lorsque vous êtes à x et que vous voulez déplacer des unités y, vous pouvez arrondir x au x_n le plus proche et rechercher linéairement la première valeur x_n dont la distance est supérieure à y, puis renvoyer ce x_n.

Cet algorithme n'est pas le plus efficace, mais il est facile à comprendre et à coder, donc au moins il peut vous aider à démarrer.

Si vous avez besoin d'une version plus optimisée, recherchez des algorithmes de paramétrage de la longueur de l'arc.


1 commentaires

Le paramétrage de la longueur de l'arc est intégré à three.js à l'aide de la fonction getPointAt