Transformation Matrix Multiplikationsreihenfolge

21

Ich habe Schwierigkeiten, die richtige Multiplikationsreihenfolge für eine endgültige Transformationsmatrix herauszufinden. Ich bekomme immer entweder seltsame Bewegungen oder verzerrte Geometrie. Mein aktuelles Modell wird unten erklärt:

Für einen einzelnen Knoten lautet meine Multiplikationsreihenfolge:

L = S * R * T

woher

L = lokale Transformationsmatrix

S = lokale Skalenmatrix

R = lokale Rotationsmatrix

T = lokale Übersetzungsmatrix

Für die Welttransformation eines Knotens:

W = PW * L

woher

W = Welttransformationsmatrix

PW = Elternwelt-Transformationsmatrix

L = die oben berechnete lokale Transformationsmatrix

Beim Rendern berechne ich für jeden Knoten die Matrix:

MV = Inv (C) * NW

woher

MV = Die Modellansichtstransformationsmatrix für einen bestimmten Knoten

Inv (C) = die inverse Kameratransformationsmatrix

NW = die oben berechnete Welttransformationsmatrix des Knotens.

Schließlich habe ich im Shader die folgende Transformation:

TVP = PRP * MV * VP

woher

TVP = endgültige transformierte Scheitelpunktposition

PRP = Perspektivmatrix

MV = die oben berechnete Welttransformationsmatrix des Knotens

VP = nicht transformierte Scheitelpunktposition.

Beim aktuellen Modell drehen sich untergeordnete Knoten, die eine lokale Drehung aufweisen, beim Transformieren der Kamera merkwürdig. Wo habe ich mit der Multiplikationsreihenfolge einen Fehler gemacht?

Colin Dumitru
quelle

Antworten:

37

Jede Kombination der Reihenfolge S*R*Tergibt eine gültige Transformationsmatrix. Es ist jedoch üblich, das Objekt erst zu skalieren, dann zu drehen und dann zu übersetzen:

L = T * R * S

Wenn Sie dies nicht in dieser Reihenfolge tun, wirkt sich die vorherige Drehung auf eine ungleichmäßige Skalierung aus, sodass Ihr Objekt schief aussieht. Und die Drehung wird durch die Übersetzung beeinflusst, wodurch sich die endgültige Position Ihres Objekts stark von der unterscheidet, die Sie aufgrund des Übersetzungswerts erwarten würden.

sam hocevar
quelle
Können Sie das etwas näher erläutern? Soweit ich es gewohnt bin, kann die Drehung nicht durch eine Verschiebung beeinflusst werden, da es sich um einen positionsunabhängigen Orientierungsunterschied zwischen zwei Frames handelt. Stattdessen kann eine Verschiebung durch eine Rotation beeinflusst werden, die vor ihr stattfindet, da sie auf der neu definierten Rotationsachse verschoben wird. In L = TRS erfolgt die Translation zuerst, sodass sie nicht von den neuen Vektoren beeinflusst wird, die durch die Rotation erzeugt werden.
User-2147482637
4
Die Verwirrung ergibt sich aus der Tatsache, dass Sie von lokalen Transformationen sprechen (bei denen der Frame mit dem Objekt verknüpft bleibt), während die hier beschriebenen Transformationen im Weltraum stattfinden (bei dem es nur einen festen Referenz-Frame gibt, die Welt). Konzeptionell ist Ihre Sichtweise gültig und entspricht der Anwendung von Transformationen in umgekehrter Reihenfolge.
Sam Hocevar