Wie kann ich die Tangente und Normalität an einem interpolierten Punkt auf einem Catmull-Rom / Hermite-Spline finden?

9

Ich habe eine Implementierung eines einfachen Catmull-Rom-Splines . Es funktioniert, aber ich versuche mein Bestes, um Scheitelpunkte an Extrusionen entlang der Kurve platzieren zu können. Dafür brauche ich die Normalen (und Tangenten im Prozess), um die richtigen Positionen außerhalb der Kurve zu finden. Ich kann nirgendwo Informationen finden, zumindest nichts, was ich verstehen kann, wie man schnell die Tangente für einen bestimmten t-Wert auf der Kurve berechnet. Ich habe versucht, das Derivat selbst zu machen, aber mir wurde schnell klar, dass ich keine Ahnung hatte, was ich tat.

Wie finde ich die Ableitung / Tangente / Normal für einen Punkt zum Wert auf einem Catmull-Rom-Spline?

Um ganz klar zu sein, hier ist ein unglaublich grobes Bild von dem, was ich brauche.

Geben Sie hier die Bildbeschreibung ein

Ich muss einen Punkt an einer Stelle entlang der Kurve abtasten und einen orthogonalen Vektor finden, der hier durch die blauen Linien dargestellt wird. Am Ende der blauen Linien werde ich Eckpunkte platzieren. Ich habe bereits eine funktionierende Implementierung davon, aber es ist für eine Bezierkurve.

ssb
quelle

Antworten:

7

OK, ich habe weiter daran herumgespielt und bin weitergegangen und habe nur versucht, die Mathematik zu machen.

Dies ist die Gleichung, die ich für die Interpolation zwischen zwei Punkten verwende:

(2t³ - 3t² + 1) * p0 + (t³ - 2t² + t) * m0 + (-2t³ + 3t²) * p1 + (t³ - t²) * m1

p0 und p1 sind die Kontrollpunkte und m0 und m1 sind ihre jeweiligen Tangenten, die an anderer Stelle berechnet werden.

Früher sagte ich, ich hätte keine Ahnung, was ich mit der Mathematik mache, aber das lag nur daran, dass sich die abgeleitete Route zu einfach anfühlte , also dachte ich, ich hätte etwas falsch gemacht. Ich habe es ausprobiert und trotzdem implementiert. Dies ist die Formel, die sich ergibt:

p '(t) = (6t² - 6t) p0 + (3t² - 4t + 1) m0 + (-6t² + 6t) p1 + (3t² - 2t) m1

Und würden Sie nicht wissen, dass es funktioniert! Wenn Sie dies verwenden, erhalten Sie den Tangentenvektor bei jedem interpolierten t-Wert auf der Kurve.

Ab hier ist die Umstellung auf eine Normalität einfach. In meinem Fall bin ich in 3D und brauche keine spezielle Drehung, also muss ich nur tun Vector3.Cross(Vector3.up, tangent), und das ergibt einen Vektor in einer Richtung orthogonal zur Kurve in der x / z-Ebene (in Einheit).

Hier ist ein Bild, um zu zeigen, was ich erreichen wollte.

Sie können einige rudimentäre Quellcode finden hier .

Geben Sie hier die Bildbeschreibung ein

ssb
quelle
Ich habe hier eine Abwertung bemerkt. Wenn es also einen Fehler gibt, weisen Sie darauf hin und ich werde ihn korrigieren.
SSB
1
Wie haben Sie m0 und m1 für eine zufällige Anzahl von Punkten berechnet?
Virgiliu
Egal, ich habe Ihren Github-Account gefunden und Ihren Code gelesen. Super Job: D
Virgiliu
1
In Zukunft könnten Sie die Länge der gesamten stückweisen Kurve schätzen, um äquidistante Schritte zu unternehmen (sehen Sie, wie die rechte Seite mehr Stichproben als die linke Seite zu haben scheint). Wie hier: stackoverflow.com/questions/29438398/…
R. Navega