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