2009-08-13 32 views
6

tôi cần phải lật một quaternion từ phải:
x = left to right
y = front to back
z = top to bottom
Flipping một quaternion từ phải sang trái giao phối

sang trái tọa độ trao nơi:
x = left to right
y = top to bottom
z = front to back

Làm thế nào tôi sẽ đi về việc này?

+1

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 –

+1

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

Trả lời

0
+0

Bài đăng bạn trích dẫn thực sự trả lời một câu hỏi khác - áp phích gốc dường như đã sử dụng "thuận tay trái" để có nghĩa là "xoay theo hướng ngược lại". Điều đó hoàn toàn khác với việc đổi các trục Y và Z như cmann muốn làm. –

0

Khi bạn làm điều đó, bạn không còn có quaternion nữa, tức là các quy tắc thông thường để nhân chúng sẽ không hoạt động. Danh tính i^2 = j^2 = k^2 = ijk = -1 sẽ không còn giữ nếu bạn hoán đổi j và k (y và z trong hệ thống tay phải của bạn).

+0

Vì vậy, bạn có nói rằng bạn không thể thay đổi quaternion? – cmann

+0

@cmann Không nếu bạn muốn bảo tồn các thuộc tính thông thường. Tôi cho rằng người ta có thể lấy được toàn bộ các quy tắc khác cho LH-quaternions ... nhưng tại sao? Bạn đang cố gắng để thực hiện? Có thể có một cách dễ dàng hơn; có lẽ chuyển đổi các tọa độ LH thành RH, quay vòng hay bất cứ điều gì, sau đó chuyển đổi trở lại hệ thống LH? –

+1

Tôi đang cố gắng xuất dữ liệu từ Máy xay sinh tố sang OpenGL – cmann

5

Ok, chỉ để rõ ràng, quaternions không thực sự có sự thuận tiện. Họ không có tay (xem bài viết wikipedia trên quaternions). BAO GIỜ, việc chuyển đổi sang một ma trận từ một quaternion không có sự kết hợp với nó. Xem http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html Nếu mã của bạn thực hiện chuyển đổi này, bạn có thể phải có hai hàm riêng biệt để chuyển đổi sang ma trận tay trái hoặc ma trận tay phải.

Hy vọng điều đó sẽ hữu ích.

+2

Tôi nghĩ người dùng thực sự hỏi là "việc thay đổi mức độ thuận lợi của cơ sở ảnh hưởng đến quaternion luân phiên của tôi như thế nào?" đó là một câu hỏi hợp lệ. Định hướng là một datum về vectorspace, không phải biến đổi của nó (bao gồm các biểu diễn quaternion và ma trận.) – rschwieb

+0

Chuỗi osdir đó không chính xác. Chuyển đổi từ quaternion thành ma trận 3x3 không liên quan đến sự thuận tiện của bất kỳ loại nào. Nó hoàn toàn là "giải quyết cho ma trận M sao cho Mv = qv" (giả sử bạn đang sử dụng các vectơ cột). Xem http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ để tìm nguồn gốc. –

1

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.

3

Tôi nghĩ rằng giải pháp là:

Given: Right Hand: {w,x,y,z} 
Option 1: Left Hand: {y,-z,-w,-x} 
Option 2: Left Hand: {-y,z,w,x} (equivalent) 
+0

Đây là những gì thực sự làm việc ở đây; điều duy nhất là chúng ta cần {y, z, -w, x} (vì vậy 'y' cần phải phủ định). Đó có thể là vì tôi đang làm điều gì đó sai; điều này là trong một ứng dụng OpenGL, nơi tôi tính toán một ma trận modelView, sau đó gửi nó như là một quaternion để Unity và cố gắng để thiết lập máy ảnh ở đó. –

+0

Điều này sẽ không hoạt động trừ khi bạn đang sử dụng cấu trúc dữ liệu quaternion thực sự lạ. Giá trị w thông thường là giá trị đầu tiên hoặc cuối cùng trong bộ dữ liệu, và cũng không liên quan trực tiếp với bất kỳ hướng không gian nào, vì vậy nó không bao giờ kết thúc ở vị trí thứ ba. – Sty

+0

Tôi đã cố gắng điều chỉnh vòng quay của một xương từ cánh tay này sang một phần khác với sự thuận tiện khác nhau, tôi nghĩ điều này đã giải quyết được vấn đề của tôi một cách thanh lịch! Cảm ơn! – Logic1

Các vấn đề liên quan