neue Scheitelpunktposition bei gegebener Transformationsmatrix berechnen?

7

Wie kann ich die neue Position meines Scheitelpunkts bei einer 4x4-Transformationsmatrix oder einfach 9 Gleitkommazahlen (PositionX, PositionY, PositionZ, RotationH, RotationP, RotationR, SkalaX, SkalaY, SkalaZ) erhalten? Normalerweise kann ich die Matrix meinem endgültigen Netz (oder "Knoten" oder "Objekt" oder "Geom") zuweisen, aber jetzt muss ich es manuell tun.

ioa
quelle

Antworten:

5

Um eine allgemeine 4x4-Transformationsmatrix auf einen Scheitelpunkt anzuwenden, der als dreidimensionaler Vektor dargestellt wird, müssen Sie:

  1. Erweitern Sie den Vektor in die 4. Dimension, indem Sie eine 1 als w-Komponente hinzufügen:

    (x, y, z) => (x, y, z, 1)

  2. Multiplizieren Sie die Transformationsmatrix mit dem obigen 4-dimensionalen Vektor. Das Ergebnis ist ein weiterer 4-dimensionaler Vektor:

    ( 4x4 matrix ) * (x, y, z, 1) => (tx, ty, tz, w)

    Die allgemeine Formel zum Multiplizieren einer 4x4-Matrix mit einem 4x1-Vektor lautet (wenn ich es nicht vermasselt habe):

    [ m11 m12 m13 m14 ][ x ]   [ m11 * x + m12 * y + m13 * z + m14 * w ]
    [ m21 m22 m23 m24 ][ y ]   [ m21 * x + m22 * y + m23 * z + m24 * w ]
    [ m31 m32 m33 m34 ][ z ] = [ m31 * x + m32 * y + m33 * z + m34 * w ]
    [ m41 m42 m43 m44 ][ w ]   [ m41 * x + m42 * y + m43 * z + m44 * w ]

    Oder wenn Sie die übliche Konfiguration einer Transformationsmatrix betrachten:

    [ m11 m12 m13 px ][ x ]   [ m11 * x + m12 * y + m13 * z + px ]
    [ m21 m22 m23 py ][ y ]   [ m21 * x + m22 * y + m23 * z + py ]
    [ m31 m32 m33 pz ][ z ] = [ m31 * x + m32 * y + m33 * z + pz ]
    [ 0   0   0   1  ][ 1 ]   [ 1 ]
  3. Konvertieren Sie es zurück in die 3. Dimension, indem Sie den Vektor homogenisieren, dh alles durch die vierte Komponente teilen w:

    (tx, ty, tz, w) => (tx/w, ty/w, tz/w)

    Die Sache ist, dass, wenn Ihre Transformationsmatrix nur eine einfache Translation / Rotation / Skalierung durchführt, der Wert von w1 ist und Sie einfach die vierte Komponente löschen können, da dies der Division durch 1 entspricht.

    Es ist jedoch gut zu bedenken, dass das Löschen der w-Komponente nicht in jedem Fall funktioniert, z. B. bei Projektionsmatrizen müssen Sie daran denken, diesen dritten Schritt auszuführen.

David Gouveia
quelle
2
Es tut nicht weh, wenn Sie hinzufügen, dass Sie auf diese Weise für einen als Spalte dargestellten Punkt multiplizieren. Für eine Zeile schreiben Sie zuerst den Vektor und dann die Matrix. Auch wenn Sie mehrere Matrizen multiplizieren möchten, ordnen Sie sie so an, dass In der Gleichung wird die Matrix, die dem Vektor am nächsten liegt, zuerst angewendet. Es ist nur immer gut, dies zu sagen, da einige Bibliotheken Punkte als Zeilen und einige als Spalten behandeln und Sie dies unterscheiden müssen, damit Sie Matrizen richtig anwenden, auch wenn Sie es sind
Um
1
@dreta Ich habe über einige dieser Punkte nachgedacht. Ich könnte es hinzufügen, aber ich denke, Ihr Kommentar leistet bereits hervorragende Arbeit bei der Abdeckung aller Grundlagen, daher habe ich ihn stattdessen positiv bewertet: P
David Gouveia
1

Matrix-Vektor-Multiplikation:

[ rxx rxy rxz px ] [ vx ]   [ vx' ]
[ ryx ryy ryz py ] [ vy ]   [ vy' ]
[ ryx ryy ryz pz ] [ vz ] = [ vz' ]
[   0   0   0  1 ] [  1 ]   [  1  ]

Siehe die Seite auf Wikipedia für mehr

Mihai Maruseac
quelle
Multiplizieren Sie also jede Vektorkomponente mit der entsprechenden Matrixspalte und ignorieren Sie die letzte Zeile?
Ioa
Nein, Sie machen die Matrixmultiplikation genauso wie in der Mathematik. Zum Beispiel wird der vx'Begriff so berechnetvx' = rxx * vx + rxy * vy + rxz * vz + px
Mihai Maruseac
Okay. Ich hoffe, es macht Ihnen nichts aus, wenn ich die obige Antwort akzeptiere. Ich denke, es wird auch für andere informativer sein.
Ioa
Natürlich ist es sauberer geschrieben, es hat es verdient :)
Mihai Maruseac