Tại sao quaternion được sử dụng cho các phép quay?


107

Tôi là một nhà vật lý và đã học lập trình, và đã gặp rất nhiều người sử dụng quaternion cho phép quay thay vì viết mọi thứ dưới dạng ma trận / vectơ.

Trong vật lý, có những lý do chính đáng để chúng ta không sử dụng quaternion (mặc dù câu chuyện kỳ ​​lạ thỉnh thoảng được kể về Hamilton / Gibbs / etc). Vật lý yêu cầu các mô tả của chúng ta phải có hành vi phân tích tốt (điều này có ý nghĩa được xác định chính xác, nhưng theo một số cách khá kỹ thuật vượt xa những gì được dạy trong các lớp học giới thiệu thông thường, vì vậy tôi sẽ không đi sâu vào bất kỳ chi tiết nào). Hóa ra là các quaternion không có hành vi tốt đẹp này, và do đó chúng không hữu ích, và vectơ / ma trận thì có, vì vậy chúng tôi sử dụng chúng.

Tuy nhiên, bị hạn chế đối với các phép quay và mô tả cứng nhắc không sử dụng bất kỳ cấu trúc phân tích nào, phép quay 3D có thể được mô tả tương đương theo một trong hai cách (hoặc một số cách khác).

Nói chung, chúng ta chỉ muốn ánh xạ điểm X = (x, y, z) đến điểm mới X '= (x', y ', z') tuân theo ràng buộc X 2 = X ' 2 . Và có rất nhiều thứ làm được điều này.

Cách đơn giản là chỉ cần vẽ các tam giác mà nó xác định và sử dụng lượng giác, hoặc sử dụng phép đẳng cấu giữa một điểm (x, y, z) và một vectơ (x, y, z) và hàm f (X) = X 'và ma trận MX = X ', hoặc sử dụng quaternion, hoặc chiếu các thành phần của vectơ cũ dọc theo vectơ mới bằng một số phương pháp khác (x, y, z) T. (a, b, c) (x', y ', z '), v.v.

Từ quan điểm toán học, những mô tả này đều tương đương trong thiết lập này (như một định lý). Tất cả chúng đều có cùng số bậc tự do, cùng số lượng ràng buộc, v.v.

Vậy tại sao quaternion dường như được ưa thích hơn vectơ?

Những lý do thông thường mà tôi thấy là không có khóa gimbal hoặc các vấn đề về số.

Đối số không có khóa gimbal có vẻ kỳ quặc, vì đây chỉ là vấn đề của góc euler. Nó cũng chỉ là một vấn đề tọa độ (giống như điểm kỳ dị tại r = 0 trong tọa độ cực (Jacobian tụt hạng)), có nghĩa là nó chỉ là một vấn đề cục bộ và có thể được giải quyết bằng cách chuyển tọa độ, xoay vòng từ suy biến, hoặc sử dụng hai hệ tọa độ trùng nhau.

Tôi ít chắc chắn hơn về các vấn đề số, vì tôi không biết chi tiết cách cả hai điều này (và bất kỳ lựa chọn thay thế nào) sẽ được triển khai. Tôi đã đọc rằng việc chuẩn hóa lại một quaternion dễ dàng hơn so với làm điều đó cho một ma trận xoay, nhưng điều này chỉ đúng với một ma trận tổng quát; một phép quay có các ràng buộc bổ sung làm nhỏ điều này (được xây dựng trong định nghĩa của các quaternion) (Trên thực tế, điều này phải đúng vì chúng có cùng số bậc tự do).

Vì vậy, lý do cho việc sử dụng quaternion trên vectơ hoặc các lựa chọn thay thế khác là gì?


2
Điều "không có khóa gimbal" dù sao cũng là một lời nói dối. Bạn có cùng một vấn đề về khóa gimbal mà bạn gặp phải với các góc Euler nếu bạn sử dụng hai phép quay trực giao với một quaternion. Bạn chỉ không có một vấn đề đối với một vòng quay đơn vì nó là 1 hoạt động, chứ không phải 3.
Damon

2
@Damon Điều này không hoàn toàn đúng. Xem mathoverflow.net/a/95908/97344
plasmacel

Câu trả lời:


61

Khóa gimbal là một lý do, mặc dù như bạn nói đó chỉ là vấn đề với góc Euler và có thể dễ dàng giải quyết. Góc Euler vẫn được sử dụng khi bộ nhớ là mối quan tâm vì bạn chỉ cần lưu trữ 3 số.

Đối với quaternion so với ma trận xoay 3x3, quaternion có lợi thế về kích thước (4 vô hướng so với 9) và tốc độ (phép nhân quaternion nhanh hơn nhiều so với phép nhân ma trận 3x3).

Lưu ý rằng tất cả các biểu diễn này của phép quay đều được sử dụng trong thực tế. Góc Euler sử dụng ít bộ nhớ nhất; ma trận sử dụng nhiều bộ nhớ hơn nhưng không bị khóa Gimbal và có các thuộc tính phân tích tốt; và quaternion tạo ra sự cân bằng tuyệt vời của cả hai, nhẹ nhưng không bị khóa Gimbal.


Nhưng ma trận xoay không có nhiều thành phần độc lập như vậy - nó bị hạn chế. Phép quay hai chiều được xác định bởi ba tọa độ trong ba chiều, bất kể biểu diễn là gì. Nhìn chung, ma trận có nhiều thành phần hơn vì chúng có thể làm được nhiều việc hơn là phép quay. Nhưng trong trường hợp quay, các thành phần phụ được xác định theo các thành phần khác.
JMP

1
@JMP: Bạn nói đúng. Nhiều người làm "nén" ma trận để bạn chỉ lưu trữ càng nhiều thông tin khi cần thiết, nhưng một ma trận nén khó xử lý hơn, vì vậy bạn sẽ mất hiệu suất. Đó là tất cả về sự đánh đổi trong bộ nhớ và hiệu suất.
Peter Alexander

10
@JMP Tuy nhiên, quy trình nhân ma trận tiêu chuẩn cần tất cả 9 giá trị. Mặc dù chỉ có 3 trong số chúng là độc lập, nhưng vẫn cần bộ nhớ của 9 số khi bạn thực sự làm phép toán (một lần nữa, nếu bạn thực sự thực hiện phép nhân ma trận trong máy tính).
David Z

1
"phép nhân quaternion nhanh hơn nhiều so với phép nhân ma trận 3x3" Thật không? Phép quay tứ phân vị yêu cầu 24 phép toán cộng / đa (do hai lần phép toán chéo và phép bổ sung), ma trận 3x3 chỉ yêu cầu 15 phép toán cộng / đa.
Marat Buharov

Có thể sử dụng chỉ cần sử dụng 2 vectơ (6 phao) để thể hiện hoàn toàn một hướng 3D, vectơ thứ 3 chỉ là một dấu gạch chéo. Một lợi thế của ma trận là chúng đã ở dạng sẵn sàng để sử dụng cho nhiều ứng dụng. Euler và Quats đều yêu cầu đóng gói (từ ma trận) và giải nén (thành ma trận), tiêu thụ thêm quá trình xử lý. Euler và Quats có thể hữu ích cho việc lưu trữ dài hạn nhỏ gọn.
user3015682

39

Trong vật lý, có những lý do chính đáng để chúng ta không sử dụng quaternion (mặc dù câu chuyện kỳ ​​lạ thỉnh thoảng được kể về Hamilton / Gibbs / etc). Vật lý yêu cầu các mô tả của chúng ta phải có hành vi phân tích tốt (điều này có ý nghĩa được xác định chính xác, nhưng theo một số cách khá kỹ thuật vượt xa những gì được dạy trong các lớp học giới thiệu thông thường, vì vậy tôi sẽ không đi sâu vào bất kỳ chi tiết nào). Hóa ra là các quaternion không có hành vi tốt đẹp này, và do đó chúng không hữu ích, và vectơ / ma trận thì có, vì vậy chúng tôi sử dụng chúng.

Tôi cũng là một nhà vật lý. Và có một số tình huống mà các quaternion chỉ đơn giản là đá! Ví dụ như Spherical Harmonics. Bạn có hai nguyên tử tán xạ, trao đổi một electron: sự chuyển spin của quỹ đạo là gì? Với các quaternion, nó chỉ là phép nhân tức là tổng các số mũ của các hàm cơ sở SH được biểu thị dưới dạng các quaternion. (Mặc dù vậy, việc đưa Đa thức Legendre vào ký hiệu quaternion là một chút tẻ nhạt).

Nhưng tôi đồng ý, chúng không phải là một công cụ phổ biến, và đặc biệt là trong cơ chế cơ thể cứng nhắc, chúng sẽ rất cồng kềnh khi sử dụng. Tuy nhiên, để trích dẫn câu trả lời của Bertrand Russell trong câu hỏi của một sinh viên, một nhà vật lý cần biết bao nhiêu môn toán: "Càng nhiều càng tốt!"

Dù sao: Tại sao chúng ta yêu thích quaternion trong đồ họa máy tính? Bởi vì chúng có một số đặc tính hấp dẫn. Đầu tiên, người ta có thể nội suy chúng một cách độc đáo, điều này rất quan trọng nếu người ta đang tạo hoạt ảnh cho những thứ đang xoay, chẳng hạn như các chi quanh khớp. Với một quaternion, nó chỉ là phép nhân vô hướng và chuẩn hóa. Biểu diễn điều này bằng ma trận yêu cầu đánh giá sin và cos, sau đó xây dựng ma trận quay. Sau đó, nhân một vectơ với một quaternion vẫn rẻ hơn khi trải qua một phép nhân đầy đủ vectơ-ma trận, nó cũng vẫn rẻ hơn nếu người ta thêm một phép tịnh tiến sau đó. Nếu bạn xem xét một hệ thống hoạt hình xương cho một nhân vật con người, nơi người ta phải đánh giá rất nhiều phép dịch / phép quay cho một số lượng lớn các đỉnh, thì điều này có tác động rất lớn.

Một tác dụng phụ tuyệt vời khác của việc sử dụng quaternion là bất kỳ phép biến đổi nào vốn dĩ đều là chính tắc. Với ma trận dịch, người ta phải chuẩn hóa lại mỗi một vài bước hoạt ảnh, do lỗi làm tròn số.


1
Bạn có tài liệu tham khảo cho sóng hài hình cầu / đa thức Legendre với quaternion không? Tôi sắp gửi một bài báo về các chủ đề liên quan và rất muốn xem (có thể trích dẫn) công việc khác về vấn đề này.
Mike

4
@Mike: Ra khỏi đầu tôi, tiếc là không có gì được xuất bản. Thật không may, các quaternion vẫn còn khá mù mờ đối với các nhà vật lý. Tôi chỉ nhớ nó, bởi vì gia sư của tôi về Cơ học lượng tử 2 đã làm cho bài tập này thành một bài tập và tôi đã bị nó thổi bay. Những gì chúng tôi đã làm về cơ bản là sử dụng thuật ngữ exp ((a · iω + b · jθ + c · kη + d) r), trong đó bản thân r là một biến phức. Nếu bạn vẽ biểu đồ này, bạn sẽ nhận được phân phối 3 chiều (trước tiên chúng tôi phải phát triển chuỗi số mũ liên quan đến một biến quaternion). Điều này cho phép thực hiện một biến đổi "fourier", dẫn đến một cái gì đó bạn có thể biến thành các thuật ngữ SH đã biết.
datenwolf

31

Đối số không có khóa gimbal có vẻ kỳ quặc, vì đây chỉ là vấn đề của góc euler. Nó cũng chỉ là một vấn đề tọa độ (giống như điểm kỳ dị tại r = 0 trong tọa độ cực (Jacobian tụt hạng)), có nghĩa là nó chỉ là một vấn đề cục bộ và có thể được giải quyết bằng cách chuyển tọa độ, xoay vòng từ suy biến, hoặc sử dụng hai hệ tọa độ trùng nhau.

Nhiều ứng dụng 3D như sử dụng góc Euler để xác định hướng của đối tượng. Đặc biệt, đối với các sim chuyến bay, chúng thể hiện một cách hữu ích về mặt lý thuyết để lưu trữ hướng theo cách có thể dễ dàng sửa đổi.

Bạn cũng nên biết rằng những việc như "chuyển đổi tọa độ, xoay ra khỏi độ suy biến hoặc sử dụng hai hệ tọa độ chồng chéo" đều đòi hỏi nỗ lực. Nỗ lực có nghĩa là mã. Và mã có nghĩa là hiệu suất. Giảm hiệu suất khi bạn không cần thiết không phải là một điều tốt đối với nhiều ứng dụng 3D. Rốt cuộc, những gì sẽ đạt được bằng tất cả những thủ thuật này, chỉ cần sử dụng quaternion là bạn sẽ có được mọi thứ bạn cần.

Tôi ít chắc chắn hơn về các vấn đề số, vì tôi không biết chi tiết cách cả hai điều này (và bất kỳ lựa chọn thay thế nào) sẽ được triển khai. Tôi đã đọc rằng việc chuẩn hóa lại một quaternion dễ dàng hơn so với làm điều đó cho một ma trận xoay, nhưng điều này chỉ đúng với một ma trận tổng quát; một phép quay có các ràng buộc bổ sung làm nhỏ điều này (được xây dựng trong định nghĩa của các quaternion) (Trên thực tế, điều này phải đúng vì chúng có cùng số bậc tự do).

Các vấn đề số xuất hiện khi xử lý nhiều phép quay liên tiếp của một hướng. Hãy tưởng tượng bạn có một vật thể trong không gian. Và mỗi lần đếm thời gian, bạn áp dụng một thay đổi nhỏ của yaw cho nó. Sau mỗi lần thay đổi, bạn cần chuẩn hóa lại hướng; nếu không, các vấn đề về độ chính xác sẽ len lỏi vào và làm hỏng mọi thứ.

Nếu bạn sử dụng ma trận, mỗi lần bạn thực hiện phép nhân ma trận, bạn phải chuẩn hóa lại ma trận. Ma trận mà bạn đang orthonormalizing không phải là chưa một ma trận luân chuyển, vì vậy tôi sẽ không quá chắc chắn về điều đó orthonormalization dễ dàng. Tuy nhiên, tôi có thể chắc chắn về điều này:

Nó sẽ không nhanh như chuẩn hóa vector 4D. Đó là những gì các quaternion sử dụng để bình thường hóa sau các lần quay liên tiếp.

Chuẩn hóa Quaternion rẻ. Thậm chí chuyên ma trận xoay bình thường sẽ không được như giá rẻ. Một lần nữa, hiệu suất quan trọng.

Ngoài ra còn có một vấn đề khác mà ma trận không làm được dễ dàng: nội suy giữa hai hướng khác nhau.

Khi xử lý một nhân vật 3D, bạn thường có một loạt các phép biến đổi xác định vị trí của từng xương trong nhân vật. Hệ thống phân cấp xương này đại diện cho nhân vật trong một tư thế cụ thể.

Trong hầu hết các hệ thống hoạt hình, để tính toán tư thế cho một nhân vật tại một thời điểm cụ thể, người ta sẽ nội suy giữa các lần biến đổi. Điều này yêu cầu nội suy các phép biến đổi tương ứng.

Nội suy hai ma trận là ... không tầm thường. Ít nhất, đó là nếu bạn muốn một cái gì đó giống như một ma trận xoay ở cuối. Rốt cuộc, mục đích của phép nội suy là tạo ra một cái gì đó một phần giữa hai phép biến đổi.

Đối với quaternion, tất cả những gì bạn cần là một lerp 4D theo sau là một chuẩn hóa. Đó là tất cả: lấy hai quaternion và nội suy tuyến tính các thành phần. Chuẩn hóa kết quả.

Nếu bạn muốn nội suy có chất lượng tốt hơn (và đôi khi là như vậy), bạn có thể sử dụng lerp hình cầu . Điều này làm cho phép nội suy hoạt động tốt hơn cho các hướng khác nhau hơn. Toán này là nhiều khó khăn hơn và đòi hỏi nhiều hoạt động cho các ma trận hơn quaternion.


7

Ý kiến: Quaternion rất tốt.

Ma trận xoay: Nhược điểm nhỏ : Phép nhân ma trận chậm hơn quaternion ~ 2 lần. Ưu điểm nhỏ : Phép nhân vectơ ma trận nhanh hơn ~ 2 lần và lớn hơn. Bất lợi lớn : Bình thường hóa! Ghram-Shmit là không đối xứng, không đưa ra câu trả lời chính xác bậc cao khi làm phương trình vi phân. Các phương pháp tinh vi hơn rất phức tạp và tốn kém.

Axis (góc = độ dài trục) Ưu điểm nhỏ: Nhỏ. Nhược điểm vừa phải : Phép nhân và áp dụng cho một vectơ chậm với trig. Nhược điểm vừa phải : Điểm kỳ dị cực Bắc ở độ dài = 2 * pi, vì tất cả các hướng trục đều không có tác dụng gì. Thêm mã (và gỡ lỗi) để tự động bán lại khi nó đạt gần 2pi.


5

Nói chung, chúng ta chỉ muốn ánh xạ một điểm X = (x, y, z) tới một điểm mới X '= (x', y ', z') tuân theo ràng buộc X ^ 2 = X '^ 2. Và có rất nhiều thứ làm được điều này.

Chúng tôi hoàn toàn không chỉ muốn như vậy. Có một sự tinh tế rất quan trọng mà rất nhiều người bỏ lỡ . Việc xây dựng bạn đang nói đến (vẽ các hình tam giác và sử dụng hình tam giác, v.v.) sẽ xoay một cách chính xác vectơ này sang vectơ kia. Nhưng có vô số phép quay sẽ làm được điều này. Đặc biệt, tôi có thể đi cùng sau khi bạn thực hiện xong thao tác xoay, và sau đó xoay toàn bộ hệ thống xung quanh vectơ X '. Điều đó sẽ không thay đổi vị trí của X '. Sự kết hợp giữa vòng quay của bạn và của tôi tương đương với một vòng quay đơn lẻ khác (vì các phép quay tạo thành một nhóm ). Nói chung, bạn cần có khả năng biểu diễn bất kỳ vòng quay nào như vậy.

Nó chỉ ra rằng bạn có thể làm điều này chỉ với một vector. (Đó là biểu diễn góc trục của phép quay .) Nhưng việc kết hợp các phép quay trong biểu diễn góc trục là khó. Quaternion làm cho nó dễ dàng, cùng với rất nhiều thứ khác. Về cơ bản, quaternion có tất cả các ưu điểm của các biểu diễn khác và không có nhược điểm nào. (Mặc dù tôi thừa nhận rằng có thể có các ứng dụng cụ thể mà một số cách trình bày khác có thể tốt hơn.)


4

Những lý do thông thường mà tôi thấy là không có khóa gimble hoặc các vấn đề về số.

Và chúng là những lý do chính đáng.

Như bạn đã hiểu, các quaternion mã hóa một phép quay quanh một trục tùy ý thay vì ba phép quay tuần tự trong không gian 3 Euler. Điều này làm cho các quaternion miễn nhiễm với khóa gimbal .

Ngoài ra, một số dạng nội suy trở nên đẹp và dễ thực hiện, như SLERP .

... hoặc sử dụng hai hệ tọa độ trùng nhau.

Từ góc độ hiệu suất, tại sao giải pháp của bạn tốt hơn?

Tôi có thể tiếp tục, nhưng quaternion chỉ là một công cụ có thể sử dụng. Nếu chúng không phù hợp với nhu cầu của bạn, thì đừng sử dụng chúng.


Tuy nhiên, ma trận xoay cũng làm như vậy, cũng như có nhiều thuộc tính đại số hơn có thể được sử dụng gọn gàng. Ngoài ra, thao tác với ma trận là một trong những thứ mà máy tính đặc biệt giỏi.
paul23,

3

Cần lưu ý rằng tất cả các thuộc tính liên quan đến quay không thực sự là thuộc tính của các Quaternion: chúng là thuộc tính của các Tham số Euler-Rodrigues , là cấu trúc 4 phần tử thực tế được sử dụng để mô tả một vòng quay 3D.

Mối quan hệ của chúng với các Quaternion hoàn toàn là do một bài báo của Cayley, "Về một số kết quả nhất định liên quan đến Quaternion", nơi tác giả quan sát mối tương quan giữa phép nhân Quaternion và sự kết hợp của các tham số Euler-Rodrigues. Điều này cho phép các khía cạnh của lý thuyết Quaternion được áp dụng để biểu diễn các phép quay và đặc biệt là để nội suy giữa chúng.

Bạn có thể đọc bài báo tại đây: https://archive.org/details/collmathpapers01caylrich . Nhưng vào thời điểm đó, không có mối liên hệ nào giữa Quaternion và vòng quay và Cayley khá ngạc nhiên khi thấy rằng:

Trên thực tế, các công thức chính xác là những công thức được đưa ra cho một phép biến đổi như vậy bởi M. Olinde Rodrigues Liouville, tv, "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (hoặc Comb. Math. Journal, t. iii. trang 224 [6]). Đó sẽ là một câu hỏi thú vị để giải thích, tiên nghiệm, cho sự xuất hiện của các hệ số này ở đây.

Tuy nhiên, không có gì nội tại về các Quaternion mang lại bất kỳ lợi ích nào cho việc quay. Quaternion không tránh được khóa gimbal; Các tham số Euler-Rodrigues thì có. Rất ít chương trình máy tính thực hiện phép quay có khả năng thực sự triển khai các kiểu Quaternion là các giá trị toán học phức tạp hạng nhất. Thật không may, một sự hiểu lầm về vai trò của các Quaternion dường như đã bị rò rỉ ở đâu đó dẫn đến khá nhiều sinh viên đồ họa bối rối khi học các chi tiết của phép toán phức tạp với nhiều hằng số tưởng tượng và sau đó bối rối không biết tại sao điều này lại giải quyết được các vấn đề với phép quay.


1

Một câu trả lời mà ai đó có thể đọc: Có những vấn đề tẻ nhạt với tất cả các biểu diễn. Quaternion nhỏ hơn ma trận nhưng phép nhân quaternion không phải là một tích số chấm vectơ đơn thuần hay tương tự, và trên thực tế, trên máy tính mất nhiều thời gian hơn so với tích số chấm của hai ma trận 3x3. (Máy tính hoạt động rất tốt với ma trận thông thường)

Ma trận mặc dù có các tính năng khó chịu khác. Ví dụ, chúng không phải là những sinh vật ổn định về lâu dài. Khi mô hình hóa các phép quay trong không gian 3D, người ta thường tích lũy các phép quay chồng lên nhau thành một ma trận Định hướng, đó chỉ là một ma trận quay duy nhất lưu trữ hướng của hệ quy chiếu. Quá trình này trong quá trình hàng triệu lần bổ sung sẽ làm cho ma trận O phân kỳ từ dạng ma trận quay nghiêm ngặt. Điều này có thể được phá vỡ bằng cách định cấu hình lại ma trận, nhưng có những điều kiện khi điều này là không đáng kể. Cụ thể là trường hợp không quay của ma trận nhận dạng.

Bạn muốn tìm một biểu diễn góc trục (hoặc biểu diễn quaternion) của phép quay, và sau đó tái tạo một ma trận cho điều đó. Hầu hết các thuật toán tạo ra một vectơ 0 và sau đó gặp phải phép chia 0 trong trường hợp này. Trong những loại trường hợp này, nói chung cũng là một ý kiến ​​tồi khi cố gắng tránh những trường hợp như vậy với loại giải pháp "nếu 0 thì ...", vì a) fork chậm và b) bạn vẫn có thể kết thúc máy epsilon ngoại trừ kỳ dị và kết thúc với những sai sót khủng khiếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.