2012-06-03 15 views
8

Mam system wykrywania markerów dla AR, wykrywa on znaczniki w scenie i podaje macierz transformacji kamery dla każdego znacznika w scenie.Uzyskaj macierz rotacji między dwiema macierzami transformacji (XNA)

Załóżmy, że znalazłem 2 markery. Próbuję znaleźć matrycę obrotu, którą będę musiał zastosować do jednego ze znaczników, aby uzyskać dopasowanie do orientacji drugiego markera.

Wyliczyłem, że powinno to być to samo, co obliczanie macierzy przekształcenia jednego znacznika na inny i dekompozycja transformacji w celu uzyskania macierzy rotacji x, y, z, ale nie mogę tego zmusić do działania. Używam C# z XNA.

W kodzie:

Matrix marker1 = markerTransforms[0]; 
Matrix marker2 = markerTransforms[1]; 

Matrix relativeTransform = Matrix.Invert(marker1) * marker2; 

Quaternion rotation; 
Vector3 scale; 
Vector3 translation; 
relativeTransform.Decompose(out scale, out rotation, out translation); 
Matrix rotationMatrix = Matrix.CreateFromQuaternion(rotation); 

Powyższa nie wydają się działać.

Kolejne pytanie brzmi: jak wyodrębnić obroty x, y, z euler z macierzy obrotu?

EDIT:

Znalazłem funkcję konwersji kwaternion Euler po x, y, aby oo tutaj: http://forums.create.msdn.com/forums/p/4574/23763.aspx

Stosując tę ​​do mojego kodu Mam następujące wyniki:

enter image description here

rzeczywisty ruch obrotowy powinny być x: 0 y: 0 z: -0,52

również zauważyć, że th e y i z bardzo się zmieniły w zależności od tego, jak umieściłem kamerę.

Dwa przekształcić matryce mogę otrzymać z detektora znacznika zawierają orientację i translację kamery w stosunku do jednego z markerów jak wyjaśniono tutaj: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm mam ich konwersji do formatu XNA i wiem, że im pracować prawidłowo jako I potrafi narysować rogi na ekranie i dopasowuje się do tego, co kamera widzi.

+0

Jestem prawie pewien, że kąty Eulera są obliczane poprawnie, ale są one podawane w układzie współrzędnych powiązanym z kamerą. Ale chcesz uzyskać kąty Eulera w stosunku do płaszczyzny poziomej, prawda? – user502144

Odpowiedz

7

Rozwiązaniem, które najbardziej lubię, jest używanie kwaternionów. Jeśli jedna orientacja opisał Q1 i inne opisane przez Q2, można uzyskać z jednej orientacji na drugą przez

Q1 = q * Q2

będącego q rotacja, której szukasz.

q = q1 * (q2)^- 1; q = q1 * conj (q2);

Po prostu trzeba przekonwertować z rotation to quaternion i quaternion to rotation.

Tylko upewnij się, że normalizujesz kwaternionki, więc ich równoważność jest prawdziwa. Na połączonych stronach masz wszystkie niezbędne formuły, objaśnienia, a nawet kod w Javie, C++. Naprawdę warto dodać do ulubionych.

Powiązane problemy