1D Splines
Verfasst: 18.08.2026, 14:45
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:
- 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.
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:
- 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.