Animieren einer reibungslosen linearen Transformation

7

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:

[0,9998- -0,01750,01750,9998]]

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.

Vermillion
quelle
2
Ja, aber aufgrund der numerischen Instabilität wird es irgendwann schief gehen. Ich sollte meine Vorlesungsunterlagen nachschlagen und habe sie nicht noch einmal gelesen, nachdem ich aufgehört hatte zu unterrichten.
Jojaja
Wird es für irgendeine Art von Transformation schief gehen oder nur für solche, die zu groß sind?
Vermillion
2
Eine Transformationsmatrix erfasst nur das Endergebnis einer Transformation, nicht "wie sie dort ankam". Die Matrix für die 180 ° -Drehung in eine Richtung, die Matrix für die 180 ° -Drehung in der anderen Richtung und die Matrix zum Umdrehen des Gitters, die um (-1, -1) skaliert wird, sehen alle gleich aus.
Quinchilion
Der erste Gedanke, der mir in den Sinn kommt, ist, dass Sie die Matrix in eine Möbius-Transformation einbeziehen und dann die Mengen lerp. en.wikipedia.org/wiki/…
MB Reynolds
Ich hatte noch nie von der Möbius-Transformation gehört, danke!
Vermillion

Antworten:

6

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

    | a  b |
T = | c  d |
  • Die Skala ist[sqrt(a² + c²), sqrt(b² + d²)]
  • Der Drehwinkel beträgtatan(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]

Paul-Jan
quelle
2
Sollte der Winkel nicht sein atan(c/a)? (Oder besser atan2(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.
Nathan Reed
1
In einer reinen Rotationsmatrix ist c = sin ( t ) und sowohl a als auch d sind gleich cos ( t ). Vielleicht funktionieren beide Antworten?
Vermillion
1
Danke @NathanReed, dass du den Winkel korrigiert hast! Und tatsächlich berücksichtigt dies keine Scherung. Ich bin es gewohnt, in 3D zu arbeiten, wo wir normalerweise mit dem Ignorieren der Scherung davonkommen können, aber in 2D-Transformationen wird die Scherung vermutlich viel häufiger verwendet.
Paul-Jan
@Vermillion: In der Tat sind sie für eine reine Rotationsmatrix gleich, aber für eine skalierte Matrix ist die Skalierung pro Spalte unterschiedlich (wenn Sie also stattdessen Element d verwenden möchten, müssen Sie zuerst die Skalierung berechnen und so etwas wie atan ausführen ( (sx / sy) * c / d).
Paul-Jan