Czwartorzędy i obrót wokół osi świata

11

Oświadczenie: Jestem profesjonalnym programistą gier i używam czwartorzędów przez większość dni, ale są one dla mnie bliskie czarnej magii. Jestem względnie w domu z matematyką, ale wyimaginowane liczby zawsze mnie myliły. Często traktuję quaty jako użyteczne i wielokrotnie odwracam multiplikacje. Staram się je rozumować tak, jak w przypadku macierzy z ograniczonym sukcesem.

W każdym razie....

Co mnie zaskakuje, jest następujące. Kiedy chcę obrócić obiekt wokół jego lokalnej osi, mnożę jego obrót przez ćwiartkę reprezentującą obrót, który chcę zastosować. Jest to zatem obrót w przestrzeni lokalnej.

Teraz, jeśli chcę obrócić go wokół osi w przestrzeni świata, moje rozumowanie brzmiałoby następująco: weź obrót w przestrzeni świata jako czwartorzęd. Pomnóż odwrotność obrotu mojego obiektu przez ten czwartorzęd. Spowoduje to obrót mojego świata w przestrzeni lokalnej. Pomnóż moją rotację dzięki tej nowej ćwiartce. tj .: newRot = oldRot * (odwrotny oldRot * worldRot)

Muszę jednak zrobić newRot = oldRot * (odwrotny oldRot * worldRot) * oldRot.

Dlaczego po pomnożeniu z odwrotnym quatem nadal muszę go pomnożyć przed własnym quatem? Wiem, że musi istnieć doskonały ważny powód, ale nie mogę się z tego wytłumaczyć, co jest dla mnie frustrujące. Próbowałem różnych pytań i tak dalej, ale większość z nich zagłębiała się w matematykę, co dla mnie było mniej jasne.

Ktoś, kto może mi to wyjaśnić, jakbym miał 5 lat?

Kaj
źródło
Czy to nie jest trochę jak tłumaczenie macierzy i roatacje (tj. Musisz przesunąć obiekt na środek, obrócić, a następnie cofnąć się, gdy chcesz obrócić przedmiot wokół siebie: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- wtedy jesteś na dobrej drodze. Jeśli zrozumiałeś, jak obracać się wokół osi obiektu i osi świata za pomocą macierzy, możesz zrobić to samo, używając czwartorzędów. Kolejność mnożenia jest taka sama dla macierzy i czwartorzędów.
Maik Semder,

Odpowiedzi:

11

Czwartorzędy są asocjacyjne:

wspominasz, że twoje rozwiązanie to:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

który jest taki sam jak:

newRot = oldRot * inverse oldRot * worldRot * oldRot

który jest taki sam jak:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

co w rzeczywistości prowadzi Cię do tego, co się naprawdę dzieje:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Kolejność aplikacji się zmienia, to wszystko. Wracając do macierzy, kiedy zastosujesz macierz obiektową do macierzy transformacji i zapiszesz ją jako nową macierz obiektową, to będzie twoja lokalna transformacja przestrzeni. Kiedy zastosujesz macierz transformacji do macierzy obiektów i zapiszesz ją, to przekształcisz świat. Chodzi o kolejność aplikacji i nic więcej.

Richard Fabian
źródło
1
+1 za pierwszą część, druga część jest nieco myląca. Jeśli użyjesz tylko „rot” w ostatniej próbce kodu, a nie „localRot” i „worldRot”, przykład stanie się jaśniejszy. W przeciwnym razie oznacza to, że same zgnilizny są tak czy inaczej różne . Różnica polega jednak tylko na kolejności mnożenia, jak pokazano, a nie na różnych kwartałach („localRot” i „worldRot”). „localTransformed” i „worldTransformed” byłyby lepsze jako: „rotatedAroundLocalAxis” i „rotatedAroundWorldAxis”. To samo wyjaśniałoby równania i uczyniłoby ostatni akapit przestarzałym, co ma pewne wady.
Maik Semder,
Wady w ostatnim akapicie: rozróżnienie między macierzą a transformacją (obie są tutaj takie same i wymienne, więc lepiej jest używać tylko macierzy, aby zapobiec pomyłkom) oraz terminów „lokalna transformacja przestrzeni” i „transformacja świata”: byłoby więcej Prawdę mówiąc, pierwsze równanie daje „macierz lokalną do świata” po obróceniu wokół lokalnej osi obiektu, a drugie daje „macierz lokalną do świata” po obróceniu wokół osi świata. W obu przypadkach otrzymujesz po prostu „macierz lokalną dla świata”. Jednak pierwsza część i tak ma moje +1 do analizy.
Maik Semder,
+1 @ Maik, być może mógłbyś napisać osobną odpowiedź, aby jeszcze bardziej wyjaśnić obojętność między rotacjami a kwestią kolejności mnożenia? Dzięki za komentarz tak czy inaczej!
Max Dohme,
Ach, teraz to ma sens. Nie wiedziałem (ouch, to byłoby w FAQ), że mnożenie czwartorzędu było asocjacyjne, więc rzeczywiście rotacja i odwrotność wzajemnie się znoszą, dając mi wgląd, którego potrzebowałem, jeden ma lokalny obrót po prawej, a drugi po stronie po lewej, które w zasadzie mówią „zastosuj obrót w przestrzeni nadrzędnej” lub „zastosuj obrót w przestrzeni lokalnej” ... nie inaczej niż macierze. Dość elementarne, kiedy to zobaczysz! Dzięki!
Kaj,