Neomi
2010-05-01, 18:11:27
Eigentlich geht es eher um ein mathematisches Problem als um direkte Programmierung. Da wir aber kein Mathematikforum haben, ist das hier wohl am besten untergebracht.
Wenn ich die Position eines Objektes im dreidimensionalen Raum zwischen zwei Keyframes interpolieren möchte, benutze ich dafür Hermitesplines (ganz normale Polynomialsplines 3. Grades), um über eine Serie von Keyframes hinweg eine sanfte Bewegung zu haben, also keine Sprünge in der Geschwindigkeit. Dazu gibt es zusätzlich zur Position pro Keyframe auch noch die Geschwindigkeit. Ob die Geschwindigkeit nun explizit gegeben ist oder implizit durch die Position im vorigen und nachfolgenden Keyframe bestimmt wird, spielt für die Berechnung keine weitere Rolle.
Was bei der Position kein Problem ist, ist bei der Orientierung schon eins. Lineare Interpolation (per Spherical Lerp) reicht nicht, da sich die Rotationsgeschwindigkeit beim Übergang von einem Keyframeintervall in den nächsten schlagartig ändert. Ich habe über Spherical Cubic Interpolation gelesen, nur ist die wegen einer fiesen Einschränkung nicht direkt verwendbar für mich, zumindest die dazugehörige Setup-Funktion. Und zwar werden die beiden Hilfsquaternions, die die beiden Start- und Endquaternions ergänzen, durch eine Folge von 4 Quaternions berechnet, die in gleichen Zeitabständen vorliegen. Wenn ich aber pro Keyframe die Rotationsgeschwindigkeit explizit habe, hilft das nicht. Auch im Fall von einer Sequenz von Keyframes, die keine einheitlichen Zeitabstände haben, hilft das nicht. Die nötige Rotationsgeschwindigkeit pro Keyframe kann ich mir berechnen durch so eine Sequenz, daher beschränkt sich das Problem wohl auf diesen Fall. Die Rotationsgeschwindigkeit liegt übrigens vor als 3er Vektor, dessen Richtung die Achse ist, um die rotiert wird und dessen Länge der Geschwindigkeit der Rotation entspricht. Normalerweise ist die Geschwindigkeit in Bogemaß/s (eine Länge von 2*Pi wäre also eine volle Drehung pro Sekunde), eine Skalierung passend zum Zeitabstand der Keyframes ist aber natürlich auch kein Thema.
Kurz also die Frage:
Wie kann ich die beiden Hilfsquaternions für die übliche Squad-Funktion berechnen, wenn ich nicht zwei weitere Orientierungen in gleichen Zeitabständen vorher und nachher habe, sondern nur die gewünschten Rotationsgeschwindigkeiten zu den Start- und Endorientierungen?
PS:
Das Schreiben dieses Postings hat mich auf eine Spur gebracht, die ich aber nicht direkt verfolgen kann und die evtl. auch gar nicht aufgeht. Also keine Zurückhaltung. ;)
Wenn ich die Position eines Objektes im dreidimensionalen Raum zwischen zwei Keyframes interpolieren möchte, benutze ich dafür Hermitesplines (ganz normale Polynomialsplines 3. Grades), um über eine Serie von Keyframes hinweg eine sanfte Bewegung zu haben, also keine Sprünge in der Geschwindigkeit. Dazu gibt es zusätzlich zur Position pro Keyframe auch noch die Geschwindigkeit. Ob die Geschwindigkeit nun explizit gegeben ist oder implizit durch die Position im vorigen und nachfolgenden Keyframe bestimmt wird, spielt für die Berechnung keine weitere Rolle.
Was bei der Position kein Problem ist, ist bei der Orientierung schon eins. Lineare Interpolation (per Spherical Lerp) reicht nicht, da sich die Rotationsgeschwindigkeit beim Übergang von einem Keyframeintervall in den nächsten schlagartig ändert. Ich habe über Spherical Cubic Interpolation gelesen, nur ist die wegen einer fiesen Einschränkung nicht direkt verwendbar für mich, zumindest die dazugehörige Setup-Funktion. Und zwar werden die beiden Hilfsquaternions, die die beiden Start- und Endquaternions ergänzen, durch eine Folge von 4 Quaternions berechnet, die in gleichen Zeitabständen vorliegen. Wenn ich aber pro Keyframe die Rotationsgeschwindigkeit explizit habe, hilft das nicht. Auch im Fall von einer Sequenz von Keyframes, die keine einheitlichen Zeitabstände haben, hilft das nicht. Die nötige Rotationsgeschwindigkeit pro Keyframe kann ich mir berechnen durch so eine Sequenz, daher beschränkt sich das Problem wohl auf diesen Fall. Die Rotationsgeschwindigkeit liegt übrigens vor als 3er Vektor, dessen Richtung die Achse ist, um die rotiert wird und dessen Länge der Geschwindigkeit der Rotation entspricht. Normalerweise ist die Geschwindigkeit in Bogemaß/s (eine Länge von 2*Pi wäre also eine volle Drehung pro Sekunde), eine Skalierung passend zum Zeitabstand der Keyframes ist aber natürlich auch kein Thema.
Kurz also die Frage:
Wie kann ich die beiden Hilfsquaternions für die übliche Squad-Funktion berechnen, wenn ich nicht zwei weitere Orientierungen in gleichen Zeitabständen vorher und nachher habe, sondern nur die gewünschten Rotationsgeschwindigkeiten zu den Start- und Endorientierungen?
PS:
Das Schreiben dieses Postings hat mich auf eine Spur gebracht, die ich aber nicht direkt verfolgen kann und die evtl. auch gar nicht aufgeht. Also keine Zurückhaltung. ;)