Mamy dany wersor u, i chcemy teraz cały świat tak obrócić, aby ten wektor leżał na osi z, tz. u' = (0,0,1).
Jak to zrobić?
Mamy dany wersor u, i chcemy teraz cały świat tak obrócić, aby ten wektor leżał na osi z, tz. u' = (0,0,1).
Jak to zrobić?
Są odpowiednie wzory na obroty w 3D -- ogólnie trzeba obrócić o kąt pomiędzy u a u' (który łatwo obliczyć), ale nie wokół punktu (0,0,0) (bo obrót wokół punktu w 3d nie jest jednoznaczny), tylko wokół prostej prostopadłej do płaszczyzny wyznaczonej przez wektory u i u'.
Oczywiście tak robimy, jeśli chodzi o obrót. Jeśli chodzi o przekształcenie (zachowujące orientację i odległość) takie, by obrazem u było u' -- to oczywiście nie musi to być sam obrót, ale jego złożenie z innym obrotem wokół u' (których jest oczywiście nieskończenie wiele). Masz świadomość tej wieloznaczności?
Obracanie wokół prostej było tutaj:
Obrót punktu wokół osi
koszalek-opalek napisał(a):
Są odpowiednie wzory na obroty w 3D -- ogólnie trzeba obrócić o kąt pomiędzy u a u' (który łatwo obliczyć), ale nie wokół punktu (0,0,0) (bo obrót wokół punktu w 3d nie jest jednoznaczny), tylko wokół prostej prostopadłej do płaszczyzny wyznaczonej przez wektory u i u'.
Oczywiście tak robimy, jeśli chodzi o obrót. Jeśli chodzi o przekształcenie (zachowujące orientację i odległość) takie, by obrazem u było u' -- to oczywiście nie musi to być sam obrót, ale jego złożenie z innym obrotem wokół u' (których jest oczywiście nieskończenie wiele). Masz świadomość tej wieloznaczności?
Obracanie wokół prostej było tutaj:
Obrót punktu wokół osi
E... tam.. jakieś to pogmatwane...
Ja wymyśliłem lepszy skecz, ale nie wiem czy on dobrze działa. :)
Mamy dany ten wersor u, który ma być finalnie osią 'z' w nowym układzie, czyli chyba:
z' = k' = u' = (0,0,1)';
ale pozostaje problem z pozostałymi osiami... x' i y';
No ale skoro one mają być prostopadłe do siebie, no to co to za problem?
Robię wektor:
w = z x u
co jest na pewno prostopadłe do u, więc pasuje.
a trzeci ma być prostopadły do obu poprzednich, czyli jest znowu ich iloczynem wektorowym:
v = z x u x u;
Zatem mamy trzy nowe wektory... bazowe:
w, v i u...
no i co teraz z tym zrobić?
Każdą pozycje w 3d można przedstawić albo jako 3 pozycje x,y,z albo jako długość i dwa kąty. Przelicz to sobie na współrzędne biegunowe porostu obróć i (bo obrót to w tym układzie dodawanie)przejdź na normalne.
Obliczasz sobie kąty miedzy osią z'et i długość wektora dla każdego ptk na mapię, obliczasz o ile jest przesunięty interesujący Cie wektor względem osi z'et, i odejmujesz otrzymaną róznce od wszystkich ptk. Do układu kartezjańskiego wracasz wzorami z gimnazjum:P, https://pl.wikipedia.org/wiki/Układ_współrzędnych_sferycznych
Po pierwsze, iloczyn wektorowy nie jest łączny, zatem zapis v = z x u x u
jest niepoprawny - konieczne jest użycie nawiasów.
Jeśli chcesz obracać, to wygodniej będzie gdy wektory w
i v
będą znormalizowane (o długości 1):
w = (z x u)/||z x u||
(konieczne jest założenie, że wektory z
i u
nie są współliniowe
v = (w x u)/||w x u||
.
Wtedy .
bogdans napisał(a):
Po pierwsze, iloczyn wektorowy nie jest łączny, zatem zapis
v = z x u x u
jest niepoprawny - konieczne jest użycie nawiasów.
Jeśli chcesz obracać, to wygodniej będzie gdy wektoryw
iv
będą znormalizowane (o długości 1):
w = (z x u)/||z x u||
(konieczne jest założenie, że wektoryz
iu
nie są współliniowe
v = (w x u)/||w x u||
.
Wtedy .
wiadomo że to są wersory, bo |u| = 1, więc i pozostałe w i v także...
No i OK, mam bazę: w, v, u, więc robię sobie z tego macierz A = (w, v, u);
znaczy przepisuję zwyczajnie składowe tych wektorów:
A =
wx wy wz
vx vy vz
ux uy uz
no i co to jest za obrót?
Wyliczam:
Au = [w.u,v.u,v.v] = (0,0,1), czyli jest OK.
ale czym to się różni od bezpośredniego obrotu osi z do u?
Taki obrót byłby wokół osi prostopadłej do z i u, więc to byłby wektor: z x u, i o kąt: f
gdzie: cosf = uz = u_z, bo (ux,uy,uz)(0,0,1) = u_z;
no a sinf = ?... chyba u x z = sinf.
lekki błąd
zamiast: Au = [w.u,v.u,v.v] = (0,0,1)
powinno być:
[w.u, v.u, u.u] = (0,0,1)
przy okazji wytłumaczę wynik:
w i u są prostopadłe więc iloczyn skalarny = 0,
podobnie v i u, no a: u.u = 1, no bo to jest.. u jest unit: |u| = u^2 = u.u = 1;
wiadomo że to są wersory, bo |u| = 1, więc i pozostałe w i v także...
Tylko późna pora Cię usprawiedliwia. z = (0,0,1)
,u = (sqrt(2)/2,0,sqrt(2)/2)
. Wektory z
i u
są wersorami (mają długość 1), a wektor v = z x u
ma długość sqrt(2)/2.
ale czym to się różni od bezpośredniego obrotu osi z do u?
Istnieje nieskończenie wiele obrotów, które przeprowadzają wersor u
w wersor (0,0,1)
. Masz jakieś dodatkowe kryterium, którym należy się posłużyć by wybrać "właściwy" obrót?
bogdans napisał(a):
wiadomo że to są wersory, bo |u| = 1, więc i pozostałe w i v także...
Tylko późna pora Cię usprawiedliwia.
z = (0,0,1)
,u = (sqrt(2)/2,0,sqrt(2)/2)
. Wektoryz
iu
są wersorami (mają długość 1), a wektorv = z x u
ma długość sqrt(2)/2.ale czym to się różni od bezpośredniego obrotu osi z do u?
Istnieje nieskończenie wiele obrotów, które przeprowadzają wersor
u
w wersor(0,0,1)
. Masz jakieś dodatkowe kryterium, którym należy się posłużyć by wybrać "właściwy" obrót?
Po co mi kryterium?
Wektor u ma być obrócony finalnie do z, i tyle...
aha! ma być zachowana konfiguracja, co znaczy że to ma być obrót: zachowana skala, odległości, itd.
peton napisał(a):
Po co mi kryterium?
Wektor u ma być obrócony finalnie do z, i tyle...aha! ma być zachowana konfiguracja, co znaczy że to ma być obrót: zachowana skala, odległości, itd.
Pisałem ja, pisał bogdans -- nie ma obrotu wokół punktu w 3d -- jest wokół osi. Wokół punktu byłby niejednoznaczny. O dodatkowym (moim zdaniem dość intuicyjnym) kryterium pisałem -- wybierz oś prostopadła do płaszczyzny uu'.
koszalek-opalek napisał(a):
peton napisał(a):
Po co mi kryterium?
Wektor u ma być obrócony finalnie do z, i tyle...aha! ma być zachowana konfiguracja, co znaczy że to ma być obrót: zachowana skala, odległości, itd.
Pisałem ja, pisał bogdans -- nie ma obrotu wokół punktu w 3d -- jest wokół osi. Wokół punktu byłby niejednoznaczny. O dodatkowym (moim zdaniem dość intuicyjnym) kryterium pisałem -- wybierz oś prostopadła do płaszczyzny uu'.
Przecież nie obracam wokół punktu, lecz dookoła osi...
A aktualnie moje pytanie brzmi:
czym się różni obrót dookoła tej osi uu' o kąt u do u' = z', w porównaniu z transformacją:
A= (w,v,u);
gdzie wersory: w, v, u są prostopadłe wzajemnie, tz.: w= k x u oraz v = w x u; i po normalizacji.
Będzie to pewnie ten sam obrót, ale plus obrót dookoła nowego zeta: z', o jakiś tam kąt... jaki?
Nie tak się to robi, ty nie chcesz obrócić tylko przenieść układ do innej bazy (coś jak kamera, wektor u jest kierunkiem w którym ustawiona jest kamera).
Zwykle robi się to tak:
Teraz wykonujesz przejście z bazy X = (1, 0, 0), Y = (0, 1, 0), Z = (0, 0, 1) do bazy U, V, T http://edu.pjwstk.edu.pl/wyklady/alg/scb/index83.html
Ogólny wzór A'=P-A*P A to wektor P to macierz przejścia
Zwróć jeszcze uwage na to :
W przypadku, gdy B1 jest bazą kanoniczną w przestrzeni Rn, macierz przejścia od bazy kanonicznej do dowolnej bazy składa się z wektorów tej bazy ustawionych w kolumnach.
Tak więc wyznaczenie P jest w tym przypadku trywialne. Są to po prostu wektory U, V, T w kolumnach
xxx_xx_x napisał(a):
Nie tak się to robi, ty nie chcesz obrócić tylko przenieść układ do innej bazy (coś jak kamera, wektor u jest kierunkiem w którym ustawiona jest kamera).
Zwykle robi się to tak:
- normalizujesz u
- wybierasz wektor v pionowy lub poziomy czyli v = (0, 1, 0) lub v = (1, 0, 0). Decyzje który wektor użyć podejmujesz na podstawie wektora u. jeżeli U jest "bardzo" pionowe czyli np. abs(u.y) > 0.9 to bierzesz v = (1,0, 0). Tak żeby u i v było możliwie różne.
- Wyznaczasz T = u x v czyli. Dostaniesz wektor prostopadały do u oraz v. Wektory U i T są odpowiednio wektorem Z' i X'(lub Y') to czy drugi jest X' czy Y' nie ma większego znaczenia.
- Teraz brakuje ci jednego wektora. Wyliczasz go w ten sposób V = U x T.
Teraz wykonujesz przejście z bazy X = (1, 0, 0), Y = (0, 1, 0), Z = (0, 0, 1) do bazy U, V, T http://edu.pjwstk.edu.pl/wyklady/alg/scb/index83.html
Ogólny wzór A'=P-A*P A to wektor P to macierz przejścia
Zwróć jeszcze uwage na to :
W przypadku, gdy B1 jest bazą kanoniczną w przestrzeni Rn, macierz przejścia od bazy kanonicznej do dowolnej bazy składa się z wektorów tej bazy ustawionych w kolumnach.
Tak więc wyznaczenie P jest w tym przypadku trywialne. Są to po prostu wektory U, V, T w kolumnach
Nie. W kolumnach masz te wektory dla transformacji w wersji: u' = uA,
a ja używam:
u' = Au, więc teraz masz te wektory w wierszach. :)
tam jest chyba nawet tak w przypadku wektorów ortogonalnych:
A-1 = AT
czyli zamieniając zwyczajnie wiersze z kolumnami robisz tu macierz odwrotną.