Transformation zeitabhängig anwenden
-
Hallo,
Ich habe eine 3x3-Matrix
M
, die eine Transformation im 2D-Raum darstellt. Nun möchte ich die Transformation abhängig von einem Zeitintervalldt
auf einen Vektorv
anwenden. Dabei dachte ich an Matrixpotenz im Sinne vonM[h]dt[/h] * v
, allerdings stelle ich mir vor, dass das relativ ineffizient (und eventuell auch ungenau) ist.Lässt sich sowas generell überhaupt umsetzen oder sollte man Translation, Rotation und Skalierung jeweils einzeln speichern und anpassen? Dann müsste ich mich auf diese 3 Transformationen beschränken.
-
eine matrix-vector multiplikation hat an sich keine "rotation/skalierung/translation", es ist lediglich eine transformation von einem punkt im raum in einen anderen, die punkte dazwischen sind undefiniert. du kannst den vector linear zwischen den beiden transformationen interpolieren, du koenntest es mittels splines machen oder cosinus interpolation..
wenn du "rotation/skalierung/translation" reinterpretieren moechtest, dann kannst du auch in die zeit eine nicht lineare translation einbauen, z.b. wenn du zwei transformationen in einer physic simulation hast, kann es sein dass die zwischenschritte garnicht linear, sondern gedaempft ablaufen.somit, wenn du irgendwas interpolieren moechtest, interpoliere das was fuer dich sinnvoll erscheint, sprich: wenn du eine rotierende muehle hast, dann interpolier den rotationswinkel. wenn du eine physic simulation hast, dann wende mehr zwischenschritte an (mit rotation/skalierung/translation waere deine interpolation nicht ruckfrei), und wenn du z.b. eine kameraanimation anhand von splines machst, dann interpoliere mehr zwischenschrite auf der spline, hier wuerde rotation/skalierung.. ebenfalls nicht sauber aussehen, auch beim skinning von objekten ist eine reine lineare interpolation von r/s/t nicht wirklich gut sieh z.b. http://isg.cs.tcd.ie/projects/DualQuaternions/ ).
liste geht endlos so weiter
-
Vielen Dank für die Antwort. Momentan verwende ich hauptsächlich Translation/Rotation/Skalierung, um Partikel mittels Affektoren zu ändern. Ich überlegte mir, das Ganze auf Transformationen generell zu verallgemeinern (da SFML mit
sf::Transform
ein schönes API anbietet) und dabei den Zeitschritt miteinzubeziehen. Aber so wäre es vielleicht besser, die 3 wichtigen Transformationen direkt anzubieten und Weiteres benutzerdefinierten Allokatoren zu überlassen...Matrixpotenz schien mir vom Gedanken her relativ naheliegend und bei kurzem Ausprobieren kamen auch erwartete Resultate heraus. Hat die Matrixpotenz (mit reellen Exponenten) geometrisch keine Bedeutung, wird sie in der Spieleprogrammierung nicht oft angewandt?
-
Nexus schrieb:
Matrixpotenz schien mir vom Gedanken her relativ naheliegend und bei kurzem Ausprobieren kamen auch erwartete Resultate heraus. Hat die Matrixpotenz (mit reellen Exponenten) geometrisch keine Bedeutung, wird sie in der Spieleprogrammierung nicht oft angewandt?
Natürlich entspricht die Matrixpotenz der wiederholten Anwendung der Transformation. Die Frage ist ob das im allgemeinen soviel Sinn macht.
Abgesehen davon ist eine Matrixpotenz eben alles andere als effizient zu berechnen, numerisch vermutlich nicht so ganz ideal und afaik nur für ganzzahlige Exponenten sinnvoll definierbar, du bist dann also an fixe Zeitschritte gebunden.Sinnvoller ist es, wie rapso sagt, entsprechende Parameter der jeweiligen Animation zu interpolieren und dann eine Matrix für das ganze auszurechnen.
-
Schau dir mal die Screw-Theorie an. Die macht genau, was du willst benutzt aber nur Matrizen deren exponentielfunktion sich gut berechnen lassen.
//edit, was du willst ist unter anderem das hier:
-
Vielen Dank für alle Inputs. Ich schau mir die verschiedenen Möglichkeiten nochmals in Ruhe an...