Pracuję nad projektem oceny ułożenia głowyza pomocą 2 kamer. Dla jednego systemu kamer działa i zwraca macierz obrotu i wektor translacji głowy w odniesieniu do każdego układu współrzędnych kamery. Renderowałem obiekt w scenie OpenGL, który jest obracany i tłumaczony, aby reprezentować ruchy głowy. Aby wyświetlić obliczoną macierz obrotu i wektor translacji, po prostu używam następujących poleceń OpenGL.
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(pose_matrix);
gdzie macierzą pozy jest macierz OpenGL ModelView zbudowana z macierzy obrotu i wektora translacji głowy.
Teraz próbuję to zrobić dla 2 skalibrowanychaparaty fotograficzne. Kiedy pierwsza kamera straciła ślad twarzy, ale druga ocenia pozycję głowy, wyświetlam obrót i translację w odniesieniu do drugiej i odwrotnie. Chcę wyświetlić jeden obiekt OpenGl i przenieść go w obu przypadkach. W tym celu muszę przenieść macierze pozy do wspólnej ramki współrzędnych.
Znam względną geometrię 2 kamerszanować się nawzajem. Zakładam, że jedna z kamer jest światową ramką współrzędnych i przenoszę macierz pozy drugiej kamery na ramkę pierwszej kamery, mnożąc macierz pozy i matrycę kalibracji drugiej kamery względem pierwszej kamery. Kiedy ładuję tę zwielokrotnioną macierz do macierzy OpenGL ModelView, otrzymuję błędne wyniki. Gdy pierwsza kamera zarejestruje twarz, obiekt porusza się w prawo, ale w przypadku drugiej kamery obiekt jest przesuwany i obracany i nie znajduje się w tym samym miejscu, co w przypadku pierwszej kamery.
Co może być problemem? Może część wyświetlająca OpenGL jest nieprawidłowa lub?
Odpowiedzi:
0 dla odpowiedzi № 1Bezpieczne domyślne założenie: OpenGL ma rację, kod jest niepoprawny.
Nie widząc twojego kodu, mogę zaproponować wydrukowanie twoich macierzy i dwukrotne sprawdzenie matematyki w Matlabie lub Oktawie.
Częstym błędem jest zapominanie o tym domyślnieOpenGL PRE-zwielokrotnia wektory ROW przez macierz modelvie (faktycznie wszystkie macierze). Oznacza to, że mnoży się jako v_row * M, a macierz przechowywana jest w porządku col-dur, podczas gdy możesz myśleć w ramach wspólnej matematycznej konwencji traktowania wektorów jako COLUMN i POST-mnożenie ich jako M * v_col (z M zapisanymi rząd główny).
Jeśli wolisz pracować z tą ostatnią konwencją (zalecane), sprawdź GL_ARB_transpose_matrix rozbudowa.