Kolejność mnożenia transformacji macierzy

21

Mam trudności z ustaleniem prawidłowej kolejności mnożenia dla ostatecznej macierzy transformacji. Zawsze mam dziwny ruch lub zniekształconą geometrię. Mój obecny model jest wyjaśniony poniżej:

W przypadku pojedynczego węzła moja kolejność mnożenia wynosi:

L = S * R * T

gdzie

L = lokalna macierz transformacji

S = macierz skali lokalnej

R = lokalna macierz obrotu

T = lokalna macierz translacji

W przypadku transformacji świata w węźle:

W = PW * L

gdzie

W = macierz transformacji świata

PW = macierz transformacji świata macierzystego

L = lokalna macierz transformacji obliczona powyżej

Podczas renderowania dla każdego węzła obliczam macierz:

MV = Inv (C) * NW

gdzie

MV = macierz transformacji widoku modelu dla określonego węzła

Inv (C) = odwrotna macierz transformacji kamery

NW = obliczona powyżej macierz transformacji świata węzła.

Wreszcie w shaderze mam następującą transformację:

TVP = PRP * MV * VP

gdzie

TVP = końcowa przekształcona pozycja wierzchołka

PRP = macierz perspektywiczna

MV = obliczona powyżej macierz transformacji świata węzła

VP = pozycja nietransformowanego wierzchołka.

W obecnym modelu węzły potomne o lokalnym obrocie obracają się dziwnie podczas przekształcania kamery. Gdzie popełniłem błąd przy mnożeniu?

Colin Dumitru
źródło

Odpowiedzi:

37

Każda kombinacja rzędu S*R*Tdaje prawidłową macierz transformacji. Często zdarza się jednak, że najpierw skaluje się obiekt, a następnie obraca go, a następnie tłumaczy:

L = T * R * S

Jeśli nie zrobisz tego w tej kolejności, poprzedni obrót wpłynie na nierównomierne skalowanie, przez co Twój obiekt będzie wyglądał na wypaczony. Tłumaczenie będzie miało wpływ na rotację, dzięki czemu ostateczna pozycja obiektu będzie bardzo różna od oczekiwanej wartości tłumaczenia.

sam hocevar
źródło
Czy możesz to trochę wyjaśnić? Z tego, do czego jestem przyzwyczajony, tłumaczenie nie może wpływać na obrót, ponieważ jest to różnica w orientacji między dwiema ramkami, niezależnie od położenia. Zamiast tego na tłumaczenie może wpływać obrót, który nastąpi przed nim, ponieważ będzie on tłumaczyć na nowo zdefiniowanej osi obrotu. W L = TRS tłumaczenie odbywa się najpierw, więc nowe wektory utworzone przez obrót nie mają na niego wpływu.
user-2147482637
4
Zamieszanie wynika z faktu, że mówimy o lokalnych transformacjach (gdzie ramka pozostaje połączona z obiektem), podczas gdy opisane tutaj transformacje zachodzą w przestrzeni świata (gdzie jest tylko jedna stała ramka odniesienia, świat). Koncepcyjnie, twój sposób widzenia rzeczy jest prawidłowy i jest równoważny z zastosowaniem transformacji w odwrotnej kolejności.
sam hocevar