Wie berechnet man die Winkel von Splines ?

Johnny Doe

Grünschnabel
Hi.

Ich bin gerade dabei mir mal quadratische und kubische Splines im 3D-Raum anzuschauen und habe mir dafür eine kleine 3D-Umgebung programmiert.
Die Berechnung und Anzeige der Splines ist kein Problem und das habe ich auch bereits umgesetzt. Aktuell wird an jedem der berechneten Koordinaten [x,y,z] ein kleiner Würfel angezeigt. Allerdings haben diese Würfel natürlich alle die gleiche Ausrichtung und ich frage mich wie man das ändern kann.

Nun könnte man sich den Winkel der (lokalen) X- und Y-Rotation jedes Würfels ausrechnen indem man sich den Abstand zum jeweils vorherigen oder nächsten anschaut, aber zum Einen deckt das die Z-Rotation nicht ab und zum Anderen geht das doch bestimmt irgendwie einfacher, denke ich.

Es ist nicht ganz einfach verständlich zu beschreiben was ich meine, aber als Beispiel ist mir gerade eine Achterbahn eingefallen, bei der sich die Schienen ja auch in den Kurven neigen.

Hat jemand einen Denkanstoß für mich wie man die Winkel der einzelnen Punkte berechnen könnte ?
 

p.doblhofer

Grünschnabel
Hallo,

im Prinzip brauchst du deine Interpolation nur zu differenzieren. Danach kannst du über die trigonometrischen Funktionen die benötigten Winkeln ausrechnen.

Zur Not kannst du auch statt zu differenzieren den Differenzenquotienten berechnen und darüber dann die Winkel ermitteln.

Liebe Grüße
Philipp
 

p.doblhofer

Grünschnabel
Ok ;)
Mit welchem Framework berechnest du denn die Splines? Bzw. wie stellst du sie dar?
Eventuell gibt es da schon fertige Funktionen dafür.

Ansonsten hilft dir vielleicht das weiter (hier jedoch nur für 2D erklärt)
https://de.wikipedia.org/wiki/Differenzenquotient

Unter der Annahme, dass ausreichend viele Punkte auf deiner Spline berechnet werden, ist es kein Problem für x1 den Punkt in dem du den Würfel platzieren möchtest und für x0 den letzten berechneten Punkt zB. vor x1 zu wählen. Dadurch kannst du dir die Steigung berechnen, die ja mit dem Winkel zusammenhängt.
 

Johnny Doe

Grünschnabel
Wenn ich Dich richtig verstanden habe, dann willst Du den Winkel des aktuellen Punktes berechnen, indem man sich den Abstand zum vorherigen Punkt anschaut und dann über einfache trigonomische Berechnung (rechtwinkliches Dreieck) den Winkel herausfindet. Richtig ?

Falls Du das meinst, dann ist es die Herangehensweise die ich auch als erstes im Kopf hatte, auch schon umgesetzt habe und die ich schon im Eröffnungspost ansprach. Dies funktioniert auch wunderbar, allerdings nur für die Pitch (lok. X-Achse) und Yaw (lok. Y-Achse), nicht aber für Rollbewegungen (lok. Z-Achse).

Damit hätte ich zwei Rotationsachsen abgedeckt und für die Z-Achse dachte ich mir auch eine Formel à la [aktueller Winkel = Startwinkel + (Endwinkel - Startwinkel) * Nummer des Punktes auf dem Spline] zu nehmen. Aber das gibt irgendwie seltsame Ergebnisse.

Meine Idee war folgende:
Ausgehend von einem quadratischen Spline habe ich einen Startpunkt, einen Endpunkt und einen Stützpunkt. Nun wollte ich dem Start- und dem Endpunkt einen Winkel um die Z-Achse zuweisen und dann mit oben genannter 'Formel' die Rollneigung berechnen. Ich weiß aber nicht wie ich den Stützpunkt da mit einfließen lassen kann.

Nehmen wir mal an daß der Start- und der Endpunkt eine Rollneigung von 0 haben also 'gerade' sein soll. Ansich ist das ja kein Problem, denn dann sind alle anderen Punkte auf dem Spline auch einfach nur gerade. Wenn die Punkte zwischen Start- und Endpunkt aber geneigt sein sollen, dann müsste man ja irgendwie noch den 'Mittelpunkt' zwischen Start und Ende einbeziehen, oder müsste man das dann in zwei Splines aufteilen ?
 

p.doblhofer

Grünschnabel
Sorry, ich war da ein bisschen falsch unterwegs..

Man braucht natürlich 3 Punkte, nachdem es ja schließlich 3 Winkel sind.
Ich hab mich jetzt auch ein bisschen in MATLAB gespielt und auch was dazu gefunden: https://de.mathworks.com/matlabcent...-coordinates-of-3-planar-points#answer_231350

Zusammengefasst:
- Man hat 3 Punkte auf der Kurve (P1, P2, P3, alles Vektoren)
- Vektor X berechnen: X=norm((P1+P2)/2 - P3)
- Vektoren V1 = P2-P1, V2 = P3-P1
- Z = norm(V1 x V2) (Kreuzprodukt und normieren)
- Y = Z x X

- roll = atan2(-Z(2), Z(3))
- pitch = asin(Z(1))
- yaw = atan2(-Y(1), X(1))

Gedreht wird dann in der Reihenfolge XYZ.
So hats dann bei mir in MATLAB gut ausgesehen.

Ich hoffe das hilft dir weiter
 

Neue Beiträge