Tôi không nghĩ bất kỳ câu trả lời nào trong số này là chính xác.
Đúng là quaternions không có sự thuận tiện. Sự thuận tay (hoặc cái mà tôi gọi là "quy ước trục" là tài sản mà con người áp dụng; đó là cách chúng tôi lập bản đồ khái niệm "về phía trước, bên phải, lên" với các trục X, Y, Z.
Những điều này là đúng :
- ma trận Pure-luân chuyển (trực giao, yếu tố quyết định 1, vv) có thể được chuyển đổi sang một đơn vị quaternion và trở lại, khôi phục ma trận gốc
- ma trận có không quay tinh khiết (đặc biệt là những người thân. mà lật một trục duy nhất và do đó có định thức -1) không thể được chuyển đổi thành một đơn vị quaternion và quay trở lại của bạn mat_to_quat() thường xuyên có thể không thổi lên, nhưng nó sẽ không cung cấp cho yo u câu trả lời đúng (theo nghĩa là quat_to_mat (mat_to_quat (M)) == M).
- Một thay đổi cơ sở mà trao đổi thuận tay có yếu tố quyết định -1. Nó tương đương với một vòng quay (có thể là bản sắc) cộng với một phản chiếu về một số trục.
Để thay đổi cơ sở của quaternion, từ ROS (tay phải) sang Unity (thuận tay trái), chúng ta có thể sử dụng phương pháp.
mat3x3 rosToUnity = /* construct this by hand */;
mat3x3 unityToRos = rosToUnity.inverse();
quat q_ros = ...;
mat3x3 m_unity = rosToUnity * mat3x3(q_ros) * unityToRos;
quat q_unity = quat(m_unity);
dòng 1-4 chỉ đơn giản là phương pháp https://stackoverflow.com/a/39519079/194921: làm thế nào để bạn thực hiện một sự thay đổi-of-cơ sở trên một ma trận.
Dòng 5 rất thú vị. Chúng ta biết mat_to_quat() chỉ hoạt động trên các ma trận xoay vòng thuần túy. Làm thế nào để chúng ta biết rằng m_unity là một vòng quay thuần túy? Nó chắc chắn có thể hiểu rằng nó không phải, bởi vì unityToRos và rosToUnity cả hai đều có định thức -1 (như là kết quả của việc chuyển đổi tay).
Câu trả lời bằng tay lượn sóng là bàn tay chuyển đổi hai lần, do đó kết quả không có công tắc tay.Câu trả lời sâu hơn phải làm với thực tế là các phép biến đổi tương tự bảo tồn các khía cạnh nhất định của toán tử, nhưng tôi không có đủ toán để làm bằng chứng.
Lưu ý rằng điều này sẽ cung cấp cho bạn một kết quả chính xác, nhưng bạn có thể làm điều đó nhanh hơn nếu unityToRos là một ma trận đơn giản (ví dụ, chỉ cần trao đổi trục). Nhưng bạn có lẽ nên lấy được phương pháp đó nhanh hơn bằng cách mở rộng toán học được thực hiện ở đây.
Nguồn
2016-09-15 20:08:57
Xin giải thích những gì bạn đang thực sự cố gắng để làm. Như vậy, câu hỏi của bạn không có ý nghĩa. Không sao để hiểu làm thế nào để làm điều gì đó, nhưng bạn phải đưa ra câu chuyện đầy đủ. ** của tôi ** là câu hỏi của bạn nên đọc một cái gì đó như "Tôi có một quaternion đại diện cho một vòng quay trong 3 chiều, nhưng bởi vì tôi đang sử dụng một hệ thống phối hợp khác với dự định * theo cách đặc biệt này *, quaternion không đại diện cho vòng quay mà tôi muốn. Làm thế nào để chuyển đổi nó thành một quaternion mà quay mà tôi muốn? " Đây gần như là một sự lừa đảo của http://stackoverflow.com/questions/1263072 –
Tôi đã không nghĩ rằng cần thiết phải cung cấp nhiều hơn nhưng có nó đại diện cho một vòng quay, hoặc có thể là một định hướng, trong 3d nơi trục z hướng lên trên. Bây giờ, tôi cần phải hoán đổi trục z và trục y để trục y hướng lên trên. Và có nó tương tự như câu hỏi khác của tôi bởi vì tôi đang cố gắng để đạt được cùng một nhưng họ là hai câu hỏi khác nhau. – cmann