Seite 1 von 1

1D Splines

Verfasst: 18.08.2026, 14:45
von Jonathan
Ich hab gar keine Frage, aber arbeite gerade an etwas, was andere vlt. interessieren könnte, also dokumentiere ichs kurz:

Angefangen hat alles mit "Ich hätte gerne Tag/Nacht Wechsel in Landvogt". Es geht erstmal nur um die Beleuchtung, also keine neue Spielmechanik. Man kann die Sonne ein wenig drehen und die Farbe ist halt am Morgen anders als am Mittag. Nun ist es aber irgendwie blöde, die Hälfte der Zeit bei Dunkelheit zu spielen, also will ich lange Tage und kurze Nächte. Ich muss also irgendwie die Zeitachse warpen. Kein Problem, da nehmen wir doch einfach jedermans Lieblingstool, Splineinterpolation.

Kubische Beziersplines hatte ich eh schon für Harald Hoppelhase implementiert, Eingabe sind ein paar Positionen, Ausgabe ist eine Kurve die weich durch alle Positionen läuft. Für 1D-Funktionen also das selbe, ich habe einen linearen Zeitparameter und berechne daraus die "verbogene" Zeit. Splines sind ja eh nur lineare Kombinationen der Kontrollpunkte, also dachte ich, ich mache einfach eine template Klasse daraus, und benutze floats statt meiner vec2. Dachte ich zumindest...

Letztendlich musste ich dann doch einige neue Features implementieren. Hier mal ein Beispiel. Ich habe 3 Knotenpunkte (bei 0, 8, und 10) die auf (0, 1, 0) mappen sollen:
2026-08-18_15-31-28_python.png
- Blau: Meine Initiale Kurve
- Geld: Bei der Berechnung der Knotentangenten, sollte man die Länge der Segmente einberechnen, sonst gibt es komische Unsymmetrien. Aber jetzt geht die Kurve über den Wertebereich hinaus
- Grün: Ein Skalierungsfaktor für die Tangenten macht die Kurve weicher (Übertretung tritt aber weiterhin auf)
- Rot: Ein Tagesablauf sollte natürlich periodisch sein. Also muss man die Berechnung der Tangenten an den Enden entsprechend anpassen
- Lila: Will man Streng im Wertebereich bleiben muss man die Tangenten weiter Anpassen. Beispielsweise mit der Fritsch–Carlson Methode. Die muss man auch erstmal periodisch machen, aber dann gibt es endlich eine schöne Kurve.

Ich wollte jetzt nicht 20 Plots zeigen, deshalb zeigt das Beispiel jetzt nicht alle Features super gut. Aber wie man z.B. hier sieht, können monotone Knotenpunkte zu nicht-monotonen Interpolationen führen - die Zeit läuft dann quasi für einen kurzen Moment rückwärts, was natürlich Quatsch ist. Und wenn man 2D oder 3D Kurven modelliert, macht man sich über die Sample-Positionen des Kurvenparameters auch nicht unbedingt direkt Gedanken (In reinen Grafikanwendungen ist der ja auch weniger wichtig, im Gegensatz zu Animationen).

Ich hab mich dazu entschieden, das allermeiste mal wieder komplett per Hand zu implementieren. Hat jetzt wieder überraschend lange gedauert, die KI hätte mir den Code direkt runterschreiben und dann 3 mal anpassen können, bis die Kurve aussieht, wie sie sollte, aber dafür hab ich jetzt was neues über Spline-Interpolation gelernt.

Das scheint mir jetzt eine allgemeine Grundsatzentscheidung zu werden: Man kann entweder 5 mal so lange brauchen und dafür die Lösung verstehen, oder KI nutzen und möglichst schnell Ergebnisse produzieren. Die Qualität kann vielleicht in beiden Fällen gleich gut sein, aber wenn man sich immer für die Abkürzung entscheidet, ist man in 5 Jahren noch so dumm wie heute und komplett ersetzlich durch KI. Die spannende Frage wird sein, ob auch die Leute die ihren Job noch verstehen, ersetzt werden, oder nicht.

Re: 1D Splines

Verfasst: 18.08.2026, 23:08
von Spiele Programmierer
Ich glaube, ich verstehe das Ziel und den Algorithmus noch nicht ganz. Welche Eigenschaften erreichst du genau, die man nicht einfacher erreichen kann?

Für das Bild würde ich sagen, einfach polynomiell interpolieren (ggf. abschnittweise, also mit Splines) und die Ableitung an den Stützstellen auf 0 setzen, damit es flach wird. Wenn es noch nicht gefällt weil entweder zu viel oder zu wenig Fokus auf den Stützstellen, evt. Polynome höherer Ordnung und Wölbung niedrig oder hoch setzen.

Aber das scheint mir relativ naheliegend. Deswegen gehe ich gerade mal davon aus, dass ich einfach deinen Anwendungsfall noch nicht verstehe, warum das keine gute Lösung wäre.

Re: 1D Splines

Verfasst: 19.08.2026, 14:01
von Jonathan
Ok, also der Grundgedanke war: Allgemeine Spline-Interpolation. Weil, es gibt natürlich für alle möglichen Spezialfälle Speziallösungen, aber ich wollte meine Engine um ein allgemeines Tool erweitern, damit man einfach immer was zur Hand hat. Splines sind deshalb nett, weil man einen Kurvenparamter t hat, aber die Stützstellen jeden Typ haben können: 2D Positionen, 3D Positionen, Farben - alles was man sinnvoll linear interpolieren kann. Aktuell zeigt das Landvogt-Hauptmenü zum Beispiel eine Spielszene und die Kamera rotiert um den Mittelpunkt - mit Spline könnte ich daraus sehr schnell und einfach eine hübschere Kamerafahrt machen.

Hauptproblem ist jetzt, dass es natürlich beliebig viele Möglichkeiten gibt, zwischen Punkten zu interpolieren. Ich hab keine Lust mir für jede einzelne Kurve Dinge wie Tangenten immer von Hand überlegen zu müssen, also wollte ich ein Verfahren, das in den meisten Fällen eine sinnvolle Standardlösung bietet.

Was im Beispiel oben jetzt etwas Komplexität erzeugt hat war der Wunsch, mit den selben Hilfsmitteln auch 1D Funktionen zu unterstützen. Für die geschwungenen Pflanzenteile in Harald hab ich prinzipiell die erste Lösung (blaue Kurve) verwendet.

Was hier vielleicht etwas verwirrend ist, ist dass dieses übertreten des Wertebereiches (orangene Kurve) scheinbar erst erzeugt wird, nachdem ich die nicht-uniformen Stützstellen eingebaut habe. Aber, die wesentliche Idee ist, nicht-uniforme Stützstellen möglichst schön und glatt zu interpolieren, insbesondere auch in Fällen wo kein Overshooting stattfindet. D.h. das ist ein schlechtes Beispiel um es zu demonstrieren, aber im Wesentlichen ist die Idee, dass man das einfach für glatte Kurven braucht.

Das ist ja auch später sehr nützlich um Beispielsweise Kamerapfade zu machen. Vielleicht hat man jetzt eine lange Strecke zwischen 2 Stützpunkten. Eine uniforme Verteilung (des t-Parameters) bedeutet, dass jedes Segment gleich lang braucht, egal ob die Strecke kurz oder lang ist. Die Kamera ist also mal schnell, mal langsam - doof. Man könnte jetzt irgendwie die Geschwindigkeit von Hand anpassen, aber dann hat man einen abrupten Übergang zwischen den Segmenten, weil man dann die von Hand eingebaute, plötzliche Änderung zwischen Segmenten hat. Also besser direkt die richtige, glatte Interpolation einbauen, dann hat man überall Kontrolle über die Kamerageschwindigkeit und der Pfad bleibt sanft. Das ist quasi das, was die Orangene Kurve macht, nur hier halt in 1D.

Periodizität macht für Kamerapfade natürlich auch genauso Sinn, man will den mehrmals wiederholen ohne spürbaren Übergang. Natürlich könnte man Tangenten von Hand setzen, aber der Benutzer will sich darüber keine Gedanken machen. Die Vorgabe ist schlicht "Weicher Übergang bei Wiederholung", und dementsprechend werden dann die Tangenten halt automatisch ausgerechnet. Das ist jetzt natürlich nicht schwer, aber man kriegt es halt auch nicht geschenkt, ganz ohne etwas zu tun.

Das komplizierteste war dann die letzte, lilane Kurve. Das ist tatsächlich ein Spezialfall für 1D Funktionen, weil man da ein sinnvolles Monotonie-Kriterium hat. Den Teil hätte man also tatsächlich einfacher haben können, wenn man alternative 1D Interpolation (etwa Polynome etc.) verwenden würde. Aber naja, das ist halt eine Zusatzfunktion in der Spline-Klasse (automatisch generierte Tangenten werden nachträglich entsprechend angepasst), was immer noch netter ist, als ein komplett zweites Verfahren zu implementieren.