Was ist die richtige Reihenfolge, um Skalierungs-, Rotations- und Translationsmatrizen für eine richtige Weltmatrix zu multiplizieren?

62

Nehmen Sie DirectX als Plattform an, wenn dies wichtig ist. (Ziemlich sicher ist es nicht)

Angenommen, ich habe eine geeignete Skalierungs-, Rotations- und Translationsmatrix. In welcher Reihenfolge multipliziere ich sie, um eine geeignete Weltmatrix zu erhalten, und warum?

Mit "richtig" meine ich "ich könnte sie direkt in DirectX werfen und den am häufigsten verwendeten 3D-Rahmen erhalten."

Narf die Maus
quelle
6
Hier ist eine Erklärung von "drehen, dann übersetzen" (drehen) vs "übersetzen, dann drehen" (umkreisen)
Bobobobo
Der Link ist gut, aber mit einem kleinen Fehler. Es sollte rollend wirken und sich nicht drehen, da die Kugel dazu neigt, sich durch Verschieben von ihrer Position zu entfernen (auf der Achse zu bleiben).
Infoclogged

Antworten:

77

Normalerweise handelt es sich um Skalierung, dann Rotation und zuletzt um Translation. Bei Matrixbezeichnung (dh T für Translationsmatrix, R für die Rotationsmatrix und S für die Skalierungsmatrix) wäre dies:

T * R * S

Wenn Sie jedoch ein Objekt um einen bestimmten Punkt drehen möchten, handelt es sich um Skalierung, Punktverschiebung, Drehung und zuletzt Objektverschiebung.

Warum: Zuerst möchten Sie das Objekt skalieren, damit die Übersetzungen ordnungsgemäß funktionieren. Anschließend drehen Sie die Achsen so, dass die Verschiebung auf den angepassten Achsen erfolgt. Zuletzt übersetzen Sie das Objekt in seine Position.

In OpenGL können Sie gluLookAt verwenden, um eine vollständige Kameratransformation in einem Aufruf zu erhalten. Es gibt wahrscheinlich einen ähnlichen Aufruf für DirectX.

Raphael R.
quelle
11
Und denken Sie daran, dass Sie, wenn Sie eine Transformation um die Mitte durchführen möchten, zunächst eine Verschiebung vornehmen müssen, um die Mitte auf dem Ursprung zu versetzen. Führen Sie dann die Schritte aus, die von user392858 angegeben wurden, und verschieben Sie sie dann wieder um denselben Betrag vom Ursprung weg. Im Allgemeinen ist dies jedoch nur in 2D erforderlich, wo Sie ein Sprite haben, dessen Ursprung oben links liegt.
Ingenieur
Toll. :) Jetzt muss ich nur noch herausfinden, warum mein Modell jetzt in einer horizontalen Ansicht invertiert und das Skalarprodukt für das gerichtete Licht in einer vertikalen Ansicht umgekehrt werden muss. Früher habe ich das nicht gemacht, dann habe ich ein
bisschen
Lassen Sie es einfach bemerkt werden, ich hasse falsch gesetzte negative Zeichen. Wie auch immer, danke, und Sie können diese Frage als erledigt betrachten. :)
Narf die Maus
Kein Problem, immer gerne behilflich.
Raphael R.
2
@Matthias Soweit ich weiß, hängt das davon ab, wie Sie dann mit dem Vektor multiplizieren, den Sie transformieren möchten. Wenn Sie M * v multiplizieren, hat die Antwort die Reihenfolge umgekehrt.
Bialpio
-4

Translation, Rotation und Skalierung ist die Reihenfolge, in der die Operation ausgeführt wird

Null
quelle
-5

Ich glaube, es ist Translation Rotation und Dialation

Jimmy
quelle
2
Dies liefert keine Erklärung mehr als die vorhandenen Antworten.
DMGregory