obrót układu w 3d

0

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ć?

0

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

0
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ć?

0

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

0

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 L(a\cdot \vec w + b\cdot \vec v + c\cdot \vec u) = a\cdot \vec{e_1} + b\cdot \vec {e_2} +c\cdot \vec {e_3}.

0
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 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 L(a\cdot \vec w + b\cdot \vec v + c\cdot \vec u) = a\cdot \vec{e_1} + b\cdot \vec {e_2} +c\cdot \vec {e_3}.

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.

0

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;

0

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?

0
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). 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?

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.

0
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'.

0
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?

0

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:

  1. normalizujesz u
  2. 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.
  3. 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.
  4. 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

0
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:

  1. normalizujesz u
  2. 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.
  3. 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.
  4. 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ą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1