Déterminer la longueur d'arc d'une spline Catmull-Rom pour se déplacer à une vitesse constante

18

J'ai un chemin qui est défini par une concaténation de splines Catmull-Rom. J'utilise la méthode statique Vector2.CatmullRom dans XNA qui permet une interpolation entre des points avec une valeur allant de 0 à 1.

Toutes les splines de ce chemin n'ont pas la même longueur. Cela provoque des différences de vitesse si je laisse le poids aller à une vitesse constante pour chaque spline tout en poursuivant le long du chemin. Je peux y remédier en laissant la vitesse du poids dépendre de la longueur de la spline. Comment puis-je déterminer la longueur d'une telle spline? Dois-je simplement approximer en coupant la spline en 10 lignes droites et additionner leurs longueurs?

Je l'utilise pour le mappage de texture dynamique sur un maillage généré défini par des splines.

Wouter
la source

Réponses:

25

Il semble que vous souhaitiez maintenir la vitesse de l'objet à une valeur constante sur toute la courbe - sachant que la longueur de l'arc ne vous y aidera pas. Cela vous aidera à calculer à quelle heure l'objet atteindrait son point final s'il allait à cette vitesse, il sera donc meilleur que ce que vous avez maintenant (l'objet aura la même vitesse moyenne entre tous les points), mais le la vitesse réelle de l'objet variera quand il se déplace sur la courbe.

Une meilleure solution serait de changer notre paramètre paramétrique (le paramètre qui va de 0 à 1, que j'appellerai spour éviter toute confusion t = time) à une vitesse variable ds/dt, qui est déterminée par la vitesse à laquelle vous voulez que l'objet se déplace ce point sur la courbe. En d'autres termes, au lieu de changer sde 0,01 chaque image, nous pourrions le changer de 0,005 une image, 0,02 la suivante, etc.

Nous faisons cela en calculant les dérivées de x( dx/ds) et y( dy/ds) chaque image, puis en définissant

ds / dt = vitesse / sqrt ((dx / ds) 2 + (dy / ds) 2 )

Autrement dit, en prenant la vitesse que nous voulons aller, et en divisant par la vitesse que nous allions réellement si nous changions sà un incrément fixe.


Preuve

Nous voulons que la vitesse de notre objet soit constante; donnons le nom à cette constante speed.

Nous apprenons en calcul de deuxième année que, pour les équations paramétriques x(s)et y(s),

vitesse = sqrt ((dx / dt) 2 + (dy / dt) 2 )

Nous apprenons également que

dx / dt = dx / ds * ds / dt     (règle de chaîne)

Donc,

vitesse = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

En résolvant pour ds/dt, nous obtenons l'équation indiquée.


Calcul des dérivés

Je n'ai jamais travaillé avec ces splines particulières, mais je comprends qu'elles donnent juste x(s)et y(s)en termes d'équations cubiques de s. Ainsi, nous pouvons dx/dsfacilement trouver la dérivée : si

x (s) = a * s 3 + b * s 2 + c * s + e

ensuite

dx / ds = 3a * s 2 + 2b * s + c

(Idem pour dy/ds) Bien sûr, vous aurez besoin de connaître les valeurs exactes de a, bet cde le faire. Selon cette page , ces valeurs sont faciles à trouver.


Enfin, pour répondre à la question du titre: trouver l'équation de longueur d'arc d'une fonction paramétrique implique de résoudre une intégrale définie assez compliquée ; même pour le cas simple d'une équation cubique, cela ne peut généralement pas être fait.

Ainsi, vous devrez estimer l'intégrale numériquement . "Couper la spline en 10 lignes droites et additionner leurs longueurs" comme vous le suggérez est une façon très simple de le faire ; cependant, il existe des méthodes légèrement plus compliquées qui vous donneront des résultats beaucoup plus précis en utilisant moins de segments de ligne.

BlueRaja - Danny Pflughoeft
la source