Jaka jest poprawna kolejność mnożenia macierzy skalowania, rotacji i translacji dla właściwej matrycy świata?

62

Przyjmij DirectX za platformę, jeśli jest to ważne. (Jestem pewien, że tak nie jest)

Zakładając, że mam odpowiednią macierz skali, rotacji i translacji, w jakiej kolejności je pomnożę, aby uzyskać odpowiednią matrycę świata i dlaczego?

Przez „właściwe” mam na myśli „mógłbym wrzucić je bezpośrednio do DirectX i uzyskać najczęściej używaną ramkę 3D”.

Narf Mysz
źródło
6
Oto wyjaśnienie „obracaj, a następnie tłumacz” (wirowanie) vs „tłumacz, a następnie obracaj” (orbitowanie)
bobobobo
link jest dobry, ale z małym błędem. powinien się toczyć, a nie wirować, ponieważ kula ma tendencję do oddalania się od swojej pozycji (pozostawania na osi) przez translację.
zaatakowany

Odpowiedzi:

77

Zwykle jest to skala, potem rotacja i na koniec tłumaczenie. Z oznaczeniem macierzy (tj. T dla macierzy translacji, R dla macierzy rotacji i S dla macierzy skalowania), która byłaby:

T * R * S

Jeśli jednak chcesz obrócić obiekt wokół określonego punktu, to jest to skala, translacja punktów, obrót i wreszcie translacja obiektu.

Dlaczego: Najpierw chcesz skalować obiekt, aby tłumaczenia działały poprawnie. Następnie obracasz osie, aby tłumaczenie odbywało się na skorygowanych osiach. Na koniec tłumaczysz obiekt na jego pozycję.

W OpenGL możesz użyć gluLookAt, aby uzyskać pełną transformację kamery w jednym wywołaniu. Prawdopodobnie istnieje podobne wywołanie dla DirectX.

Raphael R.
źródło
11
I pamiętaj, że jeśli chcesz przekształcić wokół środka, najpierw musisz przetłumaczyć, aby przesunąć środek na początek, a następnie zrób tak, jak powiedział użytkownik 392858, a następnie przetłumacz go ponownie z powrotem o tę samą wartość. Zasadniczo jest to jednak konieczne tylko w 2D, gdzie masz trochę duszka, którego górny lewy jest u początku.
Inżynier
Wspaniały. :) Teraz muszę tylko dowiedzieć się, dlaczego mój model odwraca się teraz w widoku poziomym i potrzebuje iloczynu punktowego na kierunkowym świetle odwróconego w widoku pionowym. Kiedyś tak się nie
działo
Wystarczy zauważyć, że nienawidzę źle umieszczonych znaków ujemnych. W każdym razie dzięki i możesz rozważyć to pytanie. :)
Narf the Mouse
Nie ma problemu, zawsze chętnie pomogę.
Raphael R.
2
@Matthias O ile mi wiadomo, zależy to od sposobu pomnożenia przez wektor, który chcesz przekształcić. Jeśli pomnożysz M * v, to tak, odpowiedź ma odwrotną kolejność.
bialpio
-4

rotacja translacji i skalowanie to sekwencja wykonywania operacji

zero
źródło
-5

Wierzę, że to rotacja tłumaczeń i dialacja

Jimmy
źródło
2
To nie dostarcza więcej wyjaśnień niż istniejące odpowiedzi.
DMGregory