Mam zestaw punktów danych w przestrzeni 3D, które najwyraźniej wszystkie mieszczą się na konkretnej płaszczyźnie. Używam PCA do obliczania parametrów płaszczyzny. Trzeci składnik PCA daje mi normalny wektor płaszczyzny (najsłabszy komponent).Obrót wektora normalnego na płaszczyznę osi
Co chcę zrobić, to przekształcić wszystkie punkty na płaszczyznę i spojrzeć na nią w 2D.
Mój pomysł był aby wykonać następujące czynności:
- Znajdź punkt środkowy (średni punkt) na płaszczyźnie
- odjąć go od wszystkich punktów danych w celu ustalenia ich wokół pochodzenia
- Obrót normalny tak, że staje się (0,0, 1)
- Zastosować ten obrót wszystkich punktów danych
- Używaj rzut prostopadły (zasadniczo pominąć oś z)
Teraz utknąłem w znalezieniu właściwej operacji obrotu. Próbowałem pracować z acos lub atanem i konfigurowałem dwie macierze rotacyjne. Wydaje się, że obie metody (używając acos, używając atan) dają mi zły wynik. Być może możesz mi pomóc tutaj!
kod MATLAB następująco:
b = atan(n(1)/n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1)/n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
się spodziewać n2
mieć y składnik zero. Jednak to się nie udaje dla wektora (-0,6367, 0,7697, 0,0467).
Dlaczego po prostu nie rzutujesz wszystkich punktów na płaszczyźnie, a następnie obracasz wszystko, aby można było po prostu narysować punkty za pomocą współrzędnych xz (lub xy)? –
To lub przymocuj kamerę bezpośrednio do samolotu tak, aby patrzyła bezpośrednio na niego. –
Idea aparatu jest dobra. Przesuwasz kamerę z samolotu z miejsca początkowego w pewnej odległości wzdłuż normalnej. Następnie wskaż aparat w punkcie początkowym. Oczywiście zakłada to, że masz kod projekcji kamery, który można wykonać za pomocą obrotów lub wektorów. – Nosredna