Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.09.2012, 19:44

Hermite Interpolation Tangenten

Hallo alle zusammen,
für ein kleines Programm das ich gerade schreibe, muss ich zwischen einigen Punkten interpolieren. Momentan verwende ich lineare Interpolation, allerdings finde ich nicht das das besonders ansprechend aussieht. Ich hab im Buch in Kapitel 9 den Abschnitt zur Hermite-Interpolation gefunden und das sieht genau nach dem aus was ich suche. Allerdings ist mir eines nicht klar: Wie berechne ich die Tangenten? In meinem Fall interpoliere ich immer nur zwischen 2 Punkten. Ist der Endpunkt erreicht, wird ein neuer zufälliger Punkt gewählt. Mir ist klar, das ich zur Berechnung der Tangente des "Endpunkts" schon den nächsten Punkt brauche. Aber wie berechnet man die Tangenten? Könnte mir jemand helfen?
Vielen Dank schonmal,
Foaly

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

2

13.09.2012, 20:04

Diese sind frei wählbar. Ein Beispiel wäre, das arithmetische Mittel (="Durchschnitt") der Verbindungsvektoren zum Jeweils vorherigen und darauffolgenden Vektoren zu nehmen. Das ergibt die sanfteste Interpolation.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

13.09.2012, 20:42

Ein Beispiel wäre, das arithmetische Mittel (="Durchschnitt") der Verbindungsvektoren zum Jeweils vorherigen und darauffolgenden Vektoren zu nehmen. Das ergibt die sanfteste Interpolation.


Oder etwas präziser ausgedrückt:

§\mathrm{\mathbf t}_k = \frac{\mathrm{\mathbf p}_{k+1} - \mathrm{\mathbf p}_{k-1}}{2}§

Auch bekannt als Catmull-Rom Spline.

4

13.09.2012, 23:40

Vielen Dank das ist genau das was ich meinte :) Die Frage war nen bisschen schlecht gestellt. Ich meinte wie man die Tangenten berechnet, so dass die Punkte "weich" in einander übergehen. Aber ihr habt ja verstanden was ich meinte :thumbsup:
Nochmal eine kleine Verständnisfrage: Ist eine Catmull-Rom Interpolation das gleiche wie eine Hermite-Interpolation nur das die Tangenten aus den Mittelwerten errechnet werden? (Also ist Catmull-Rom praktisch eine Spezialform der Hermite-Interpolation?)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

13.09.2012, 23:42

Ganz genau, Catmull-Rom Splines sind eine Art von kubisch hermitschen Splines...

6

13.09.2012, 23:46

Ok Top! Danke für die Hilfe! Ich hab das ganze implementiert und es funktioniert einwandfrei :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

13.09.2012, 23:54

Um das vielleicht nocht etwas verständlicher auszudrücken: Kubisch hermitsche Splines sind eben einfach eine bestimmte Art von Splines dritten Grades, die zwischen Kontrollpunkten interpolieren, an denen Position und Tangente der Kurve festgelegt werden. Die Tangenten sind in der allgemeinen Form des kubisch hermitschen Spline beliebig. Nun gibt es bestimmte Arten von kibusch hermitschen Splines, die sich in der Art und Weise unterscheiden, wie eben die Tangenten festgelegt werden. Eine solche Art sind Cardinal Splines und ein Spezialfall des Cardinal Spline ist das sehr verbreitete Catmull-Rom Spline (beim allgemeinen Cardinal Spline kann einfach noch die Länge der Tangente an jedem Kontrollpunkt gesteuert werden, beim Catmull-Rom Spline ist diese fix).

8

14.09.2012, 00:29

Ah interessant! Das sind zwar viele neue Begriffe, aber ich denke ich hab verstanden was du meinst. Vielen Dank für die Erklärung!

Noch eine Frage: Die Interpolation sieht schon wesentlich besser aus als die lineare Interpolation von davor, aber manchmal wirkt sie immer noch ein bisschen scharf und "kantig". Gibt es eine Möglichkeit das ganze noch ein bisschen weicher und "kurviger" zu machen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

14.09.2012, 01:11

Bin mir nicht ganz sicher, was genau du mit "scharf und kantig" meinst. Aber ich vermute mal, dein Problem ist, dass die Geschwindigkeit, mit der du dich entlang des Spline bewegst, wenn du den Parameter linear laufen lässt, nicht konstant ist. Das Problem ist darin begründet, dass der Parameter t nicht proportional zum Weg entlang der Kurve ist. Eine solche sog. Bogenlängenparametrisierung, wo das der Fall wäre, ist für Splines im Allgemeinen leider nicht analytisch berechenbar. Da das ein relativ wichtiges Thema is, gibt es allerdings viele Publikationen darüber, wie man die Bogenlänge approximieren kann. Wenn dich das interessiert, schau einfach mal hier.

Ich hab das damals jedenfalls einfach so gelöst, dass ich mir immer die momentane Tangente an den Spline berechnet hab (einfach die Formel für die Position nach t ableiten) und die Länge dieser Tangente (entspricht der Momentangeschwindigkeit) beim Update des Parameters berücksichtigt hab. Also sei §v§ die Geschwindigkeit, mit der du entlang des Spline fliegen willst, dann ergibt sich die entsprechende Geschwindigkeit §v'§ für den Parameter t nach

§v'(t) = \frac{v}{\|\mathrm{\mathbf p}'(t)\|}§

Das hat eigentlich ganz gut funktioniert.

Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von »dot« (14.09.2012, 01:51)


10

14.09.2012, 12:13

Hmm nein das meinte ich nicht. Ich finde sogar, dass es ganz gut aussieht, das die Geschwindigkeit nicht linear ist. Was ich meine ist, das mir der Verlauf der Interpolation immer noch ein bisschen zu "linear" ist. Gibt es eine Möglichkeit die Kurve stärker auszuprägen (eventuell Tangenten verlängern oder so entwas?!?)

Werbeanzeige