Nachdem ich dieses Video auf Matrizen gesehen hatte, versuchte ich eine einfache Animation von linearen 2D-Transformationen zu erstellen. Ausgehend von einer Reihe von 2D-Punkten in einem Raster habe ich auf jeden Punkt eine 2x2-Matrix angewendet und eine Reihe transformierter Punkte erhalten.
Ich bin mir nicht sicher, wie ich den Übergang zwischen Anfangs- und Endzustand animieren soll. Zuerst habe ich jeden Punkt auf dem geraden Weg zwischen seiner Anfangs- und Endposition bewegt. Dies verursachte Probleme für Rotationsmatrizen. Zum Beispiel sollte eine Drehung um 180 zeigen, dass sich die Punkte in Kreisbögen um den Ursprung drehen, aber meine Methode ließ es so aussehen, als würde das gesamte Gitter umgedreht, ohne sich zu drehen.
Eine bessere Rotationsanimation kann erzielt werden, indem eine sehr kleine Rotation, z. B. 1 , mehrmals angewendet wird . Die Matrix für eine 1 liegt nahe an der Identitätsmatrix:
Gibt es eine allgemeine Formel, die angesichts der vollständigen Transformationsmatrix eine differentielle Transformationsmatrix erzeugen kann? Ich möchte, dass es für jede 2x2-Matrix funktioniert, ohne dass die Art der Transformation angegeben werden muss.
quelle
Antworten:
In der Regel können Sie Transformationsmatrizen nicht interpolieren. Stattdessen zerlegen Sie sie in ihre einzelnen Werte, interpolieren diese dann und setzen sie neu zusammen.
Die Möbius-Transformation, wie in den Kommentaren vorgeschlagen, klingt interessant, aber traditionell würde ich nur Skalierung und Rotation extrahieren und diese interpolieren.
Annahme einer Transformationsmatrix
[sqrt(a² + c²), sqrt(b² + d²)]
atan(c/a)
Sie würden jetzt diese Skalierung und diesen Drehwinkel interpolieren und die Matrix bei jedem Frame neu zusammensetzen.
[Bearbeiten] Der Winkel wurde korrigiert (wie von Nathan Reed entdeckt). [/ Bearbeiten]
quelle
atan(c/a)
? (Oder besseratan2(c, a)
, wenn Ihre Sprache dies unterstützt.) Beachten Sie auch, dass die Matrix keine Scherung enthält. In diesem Fall können Sie versuchen, diesen Teil zu extrahieren und auch separat zu interpolieren.