Câu hỏi Lấy ma trận xoay giữa hai ma trận biến đổi (XNA)


Tôi có một hệ thống phát hiện điểm đánh dấu cho AR tại thời điểm này, nó phát hiện các dấu hiệu trong cảnh và cung cấp ma trận biến đổi của máy ảnh cho mỗi điểm đánh dấu trong cảnh.

Giả sử tôi đã tìm thấy 2 điểm đánh dấu. Tôi đang cố gắng tìm ma trận xoay, tôi sẽ phải áp dụng cho một trong các điểm đánh dấu để làm cho nó phù hợp với hướng của điểm đánh dấu khác.

Tôi đoán nó phải giống như tính toán ma trận biến đổi của một điểm đánh dấu này đến điểm đánh dấu khác và phân tách biến đổi để thu được ma trận xoay x, y, z euler nhưng tôi dường như không thể làm việc này. Tôi đang sử dụng C # với XNA.

Trong mã:

 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);

Điều này dường như không hoạt động.

Một câu hỏi khác là làm thế nào để trích ra các phép quay x, y, z euler từ ma trận xoay?

CHỈNH SỬA:

Tôi tìm thấy một hàm để chuyển đổi quaternion thành euler theo thứ tự x, y, z ở đây: http://forums.create.msdn.com/forums/p/4574/23763.aspx 

Áp dụng mã này vào mã của tôi, tôi nhận được các kết quả sau:

enter image description here

Xoay thực tế phải là: x: 0 y: 0 z: -0,52

Tôi cũng nhận thấy rằng y và z thay đổi rất nhiều tùy thuộc vào cách tôi định vị máy ảnh.

Hai ma trận biến đổi mà tôi thu được từ máy dò đánh dấu chứa định hướng và bản dịch của máy ảnh liên quan đến một trong các điểm đánh dấu như được giải thích ở đây: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm  Tôi đã chuyển đổi chúng sang định dạng XNA và tôi biết chúng hoạt động chính xác khi tôi có thể vẽ các góc trên màn hình và nó khớp với những gì máy ảnh đang nhìn thấy.


8
2018-06-03 16:00


gốc


Tôi gần như chắc chắn rằng góc euler được tính toán một cách chính xác, nhưng chúng được đưa ra trong hệ thống tọa độ liên quan đến máy ảnh. Nhưng bạn muốn có được góc euler tương đối so với mặt phẳng nằm ngang, phải không? - fdermishin


Các câu trả lời:


Giải pháp tôi thích nhất là sử dụng quaternions. Nếu bạn có một hướng được mô tả bởi q1, và khác được mô tả bởi q2, bạn có thể nhận được từ hướng này sang hướng khác

q1 = q * q2

đang được q vòng quay bạn đang tìm kiếm.

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

Bạn chỉ cần chuyển đổi từ xoay đến quaternion và quaternion để xoay.

Chỉ cần chắc chắn rằng bạn bình thường hóa quaternions để tương đương là đúng sự thật. Trong các trang tôi đã liên kết, bạn có tất cả các công thức, giải thích cần thiết, thậm chí là mã trong Java, c ++. Thực sự đáng để thêm vào mục yêu thích.


7
2018-06-04 10:48