2013-04-18 12 views
7

starałem się wypracować jak rozwiązać następujący problem przy użyciu Pythona:implementacja Pythona 3D sztywnego tłumaczenia ciała i rotacji

  1. Mamy punkty A, B, C, D, które tworzą sztywny korpus
  2. Jakiś nieznany 3D tłumaczenie i obrót nakłada się na ciało sztywne
  3. teraz wiemy współrzędne a, b, c
  4. Chcemy obliczyć współrzędne d

co wiem do tej pory:

Co nie mogę pracować na to, jak mogę obliczyć rotacji i translacji macierzy podanych „nowych” współrzędnych a, b, c.

Widzę, że w ogólnym przypadku (ciało niesztywne) część obrotowa tego jest Wahba's problem, ale myślę, że dla ciał sztywnych powinien istnieć jakiś szybszy sposób obliczenia go bezpośrednio przez opracowanie zbioru ortogonalnego wektory jednostek używające punktów.

+1

Można obliczyć macierz "nieznane tłumaczenie i obrót 3D" za pomocą opcji "affine_matrix_from_points" (abc, abc_new, shear = False, scale = False) 'from http://www.lfd.uci.edu/~gohlke/code/transformations .py.html # line-882 i zastosować go do 'd' – cgohlke

+0

Dzięki - faktycznie wygląda na to, że' superimposition_matrix' w rzeczywistości zrobi to dla mojego przypadku, tak myślę? Jeśli zrobisz komentarz powyżej odpowiedzi, zaakceptuję to! – lost

Odpowiedz

2

Dla zestawu odpowiadających punktów, które próbujesz dopasować (z możliwymi perturbacjami) użyłem SVD (dekompozycja wartości osobliwej), która wydaje się istnieć w numpy.

Przykładem tej techniki (nawet w Pythonie) może być found here, ale nie oceniłem jej pod względem poprawności.

Chodzi o "podstawową transformację" lub "zmianę podstawy", która będzie reprezentowana jako macierz transformacji. Zakładając, że 3 znane punkty nie są współliniowe, można stworzyć swój początkowy bazowych:

  1. obliczanie wektorów: X = (BA) i Y = (CA)
  2. Normalizuj x (x = x/wielkości (x)) y
  3. rzutować x (proj_y = x DOT y * x)
  4. odjąć występ z Y (Y = Y - proj_y)
  5. normalizacja y
  6. Oblicz z = x CROSS y

To daje początkową podstawę współrzędną x, y, z A. Wykonaj to samo dla nowych punktów, a otrzymasz drugą podstawę B. Teraz chcesz znaleźć transformatę T, która zajmie punkt A i przekonwertuje go do B (zmiana podstawy). Ta część jest łatwa. Możesz odwrócić A, aby przekształcić punkty z powrotem na normalne, a następnie użyć B, aby przekształcić się w drugi.Ponieważ A jest ortonormalne, możesz po prostu transponować A, aby uzyskać odwrotność. Tak więc "nowy d" jest równy d * odwrotny (A) * B. (Chociaż w zależności od twojej reprezentacji, być może będziesz musiał użyć B * odwrotnego (A) * d.)

Musisz mieć trochę znajomości z macierzami, aby to wszystko uzyskać. Twoja reprezentacja wektorów i macierzy poinformuje cię, która kolejność pomnożyć macierze, aby uzyskać T (T jest albo odwrotna (A) * B albo B * odwrotna (A)).

Aby obliczyć swoją macierzą bazową od wektora x = (x1, x2, x3), Y = (y1, y2, y3), Z = (Z1, Z2, Z3) można wypełnić ją jako:

| x1 y1 z1 | 
| x2 y2 z2 | 
| x3 y3 z3 | 
+0

Zaakceptowanie tego, ponieważ zapewnia ogólną odpowiedź o wysokiej jakości, chociaż komentarz do mojego pytania faktycznie rozwiązuje mój problem bardziej bezpośrednio. – lost

+0

* "Zakładając, że twoje trzy znane punkty nie są koplanarne" * Raczej, współliniowy, prawda? – rschwieb

+0

Prawidłowe, poprawione. Myślałem o 4 punktach, nie coplanararnie, ale tylko 3 punkty są potrzebne, jak poprawiłeś. –