Bestimmen Sie die Bogenlänge eines Catmull-Rom-Splines, um sich mit einer konstanten Geschwindigkeit zu bewegen

18

Ich habe einen Pfad, der durch eine Verkettung von Catmull-Rom-Splines definiert ist. In XNA verwende ich die statische Methode Vector2.CatmullRom, die die Interpolation zwischen Punkten mit einem Wert zwischen 0 und 1 ermöglicht.

Nicht jeder Spline in diesem Pfad hat die gleiche Länge. Dies führt zu Geschwindigkeitsunterschieden, wenn ich das Gewicht für jeden Spline auf dem Weg mit konstanter Geschwindigkeit laufen lasse. Abhilfe kann ich schaffen, indem ich die Geschwindigkeit des Gewichts von der Länge des Splines abhängig mache. Wie kann ich die Länge eines solchen Splines bestimmen? Sollte ich mich nur annähern, indem ich den Spline in 10 gerade Linien schneide und deren Länge summiere?

Ich verwende dies für die dynamische Texturabbildung auf einem durch Splines definierten generierten Netz.

Wouter
quelle

Antworten:

25

Es hört sich so an, als ob Sie die Geschwindigkeit des Objekts über die gesamte Kurve auf einem konstanten Wert halten möchten - die Kenntnis der Bogenlänge hilft Ihnen dabei nicht. Es hilft Ihnen zu berechnen, wann das Objekt seinen Endpunkt erreichen würde, wenn es mit dieser Geschwindigkeit fahren würde. Es ist also besser als das, was Sie jetzt haben (das Objekt hat die gleiche Durchschnittsgeschwindigkeit zwischen allen Punkten), aber die Die tatsächliche Geschwindigkeit des Objekts ändert sich weiterhin, wenn es sich um die Kurve bewegt.

Eine bessere Lösung wäre, unseren parametrischen Parameter (den Parameter, der von 0 auf 1 geht, den ich szur Vermeidung von Verwechslungen bezeichne t = time) mit einer variablen Rate zu ändern , die davon abhängt ds/dt, mit welcher Geschwindigkeit sich das Objekt bewegen soll dieser Punkt auf der Kurve. Mit anderen Worten, anstatt sich sbei jedem Frame um 0,01 zu ändern, können wir es bei jedem Frame um 0,005, bei jedem nächsten um 0,02 usw. ändern.

Dazu berechnen wir die Ableitungen von x( dx/ds) und y( dy/ds) für jeden Frame und setzen sie dann

ds / dt = Geschwindigkeit / Quadratmeter ((dx / ds) 2 + (dy / ds) 2 )

Das heißt, indem wir die Geschwindigkeit nehmen, die wir fahren möchten, und durch die Geschwindigkeit dividieren, die wir tatsächlich fahren würden, wenn wir uns sin einem festen Schritt ändern würden .


Beweis

Wir möchten, dass die Geschwindigkeit unseres Objekts konstant bleibt. Geben wir dieser Konstante den Namen speed.

Wir lernen in der zweiten Jahres Kalkül , dass für Parametergleichungen x(s)und y(s),

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

Das lernen wir auch

dx / dt = dx / ds * ds / dt     (Kettenregel)

Somit,

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

Wenn ds/dtwir nach auflösen , erhalten wir die angegebene Gleichung.


Berechnung der Derivate

Ich habe noch nie mit diesem besonderen Splines gearbeitet, aber ich verstehe , dass sie nur geben x(s)und y(s)in Bezug auf den kubisch-Gleichungen s. So können wir die Ableitung dx/dsleicht finden: wenn

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

dann

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

( Das gleiche gilt für dy/ds) Natürlich müssen Sie die genauen Werte von wissen a, bund cdies zu tun. Demnach sind diese Werte auf dieser Seite leicht zu finden.


Um die Frage im Titel zu beantworten: Um die Bogenlängengleichung einer parametrischen Funktion zu finden, muss ein ziemlich kompliziertes bestimmtes Integral gelöst werden . Selbst für den einfachen Fall einer kubischen Gleichung ist dies im Allgemeinen nicht möglich.

Daher müssen Sie das Integral numerisch schätzen . "Schneiden Sie den Spline in 10 gerade Linien und addieren Sie deren Länge", wie Sie vorschlagen, ist eine sehr einfache Möglichkeit, dies zu tun . Es gibt jedoch etwas kompliziertere Methoden , mit denen Sie mit weniger Liniensegmenten viel genauere Ergebnisse erzielen.

BlueRaja - Danny Pflughoeft
quelle