Mam kilka modeli, które chcę obracać za pomocą czwartorzędów w normalny sposób, z wyjątkiem tego, że zamiast obrotu wokół początku chcę, aby został nieco przesunięty. Wiem, że nie mówisz w przestrzeni 3D, że obracasz się wokół punktu; mówisz, że obracasz się wokół osi. Wizualizuję to jako obracanie się wokół wektora, którego ogon nie jest ustawiony w miejscu pochodzenia.
Wszystkie transformacje afiniczne w moim silniku renderowania / fizyce są przechowywane za pomocą SQT (skala, kwaternion, tłumaczenie; pomysł zapożyczony z książki Game Engine Architecture ). Więc buduję macierz z każdej części z tych komponentów i przekazuję ją do modułu cieniującego wierzchołki. W tym systemie stosowane jest tłumaczenie, następnie skalowanie, a następnie obrót.
W jednym konkretnym przypadku muszę przetłumaczyć obiekt w przestrzeni świata, przeskalować go i obrócić wokół wierzchołka, który nie jest wyśrodkowany na lokalnym pochodzeniu obiektu.
Pytanie: Biorąc pod uwagę ograniczenia mojego obecnego systemu opisane powyżej, jak mogę osiągnąć lokalny obrót wyśrodkowany wokół punktu innego niż początek? Automatyczna opinia dla każdego, kto potrafi opisać, jak to zrobić, używając tylko matryc :)
źródło
Odpowiedzi:
W skrócie
Musisz tylko zmienić T w formularzu SQT.
Wymień wektor przesunięcia
v
zv' = v-invscale(p-invrotate(p))
którymv
jest początkowy wektor tłumaczenie,p
jest punktem, wokół którego chcesz rotacja występuje, ainvrotate
iinvscale
są odwrotności rotacji i skali.Szybka demonstracja
Niech
p
będzie punktem, w którym zastosujesz obrótr
. Niechs
będą twoimi parametrami skalowania iv
wektorem translacji. Ostateczna transformacja macierzowa jestT(p)R(r)T(-p)S(s)T(v)
zamiastR(r)S(s)T(v)
.Co chcesz to nowe parametry transformacji
v'
,r'
is'
tak, że transformacja matryca jest ostatecznaR(r')S(s')T(v')
i mamy:Zachowanie w nieskończoności wskazuje, że parametry obrotu i parametry skalowania nie mogą się zmienić (można to wykazać). Mamy więc
r = r'
is = s'
. Jedynym brakującym parametrem jest zatemv'
nowy wektor tłumaczenia:Jeśli te macierze są równe, ich odwrotności są równe:
Dotyczy to zwłaszcza pochodzenia
O
:Skalowanie i obracanie początku daje początek, dzięki czemu uzyskuje się:
v'
to nowy wektor tłumaczenia, którego szukasz, który pozwala przechowywać transformację w formie SQT. Prawdopodobnie możliwe jest uproszczenie obliczeń; ale przynajmniej wymagana przestrzeń dyskowa nie zostanie zwiększona.źródło
Wszystkie kanoniczne formuły rotacyjne użyte do wyprowadzenia macierzy rotacji służą do rotacji wokół źródła. Jeśli zamiast tego chcesz zastosować obrót wokół określonego punktu, musisz najpierw przesunąć początek - lub, równoważnie, przesunąć obiekt, aby punkt, który chcesz obrócić, znajdował się u początku.
Najpierw rozważ przypadek 2D, ponieważ jest on prostszy, a technika skalowana. Jeśli miałeś sześcian o szerokości 2 wyśrodkowany na początku i chciałbyś go obrócić o 45 stopni wokół jego środka, byłoby to trywialne zastosowanie macierzy obrotu 2D .
Ale jeśli zamiast tego chcesz go obrócić wokół jego prawego górnego rogu (znajdującego się w
1,1
), najpierw musisz go przetłumaczyć, aby ten narożnik był na początku. Można tego dokonać tłumacząc-1,-1
. Następnie możesz obrócić obiekt jak poprzednio, ale musisz to zrobić, tłumacząc go wstecz (o1,1
). Ogólnie rzecz biorąc, aby uzyskać macierz obrotuR
dla obrotur
około punktuP
, należy:gdzie
translate
irotate
są odpowiednio kanoniczne macierze translacji / rotacji. Tak się składa, że skaluje się w sposób trywialny do 3D, z wyjątkiem konieczności podania osi do obrotu - zawsze możesz wybrać kanoniczne macierze obrotu osi X, Y lub Z, ale byłoby to nudne. Będziesz chciał zastosować dowolną macierz obrotu kąta osi . Twój finałR
w 3D to:gdzie
a
jest wektorem jednostek reprezentującym oś obrotu iP
jest teraz punktem 3D w przestrzeni modelu reprezentującym punkt obrotu.Tak się składa, że czwartorzędy można konwertować na i z reprezentacji macierzowych, dzięki czemu możesz dokonać konkatenacji w ten sposób, jeśli chcesz. Lub możesz po prostu zostawić wszystko jako macierze (czwartorzędy mają pewne fajne zalety, takie jak łatwiejsza interpolacja w rozsądny sposób, ale to, czy potrzebujesz, zależy od ciebie).
Również:
Ściśle mówiąc, podczas gdy wektory mogą być używane do reprezentowania pozycji poprzez uznanie ich za przemieszczenia od początku, wektor sam nie ma pozycji, więc wizualizacja jednej z nich jest trochę niezwykła.
źródło