Quaternion và Phép quay không gian – Phần 1

Quarternion được sử dụng trong phép quay không gian. Trong phần 1 này, tôi sẽ nói về cách sử dụng sơ lược của nó trong phép quay không gian.

Các bài viết khác trong loạt bài về quaternion:

Quaternion được định nghĩa như là một số phức có ba thành phần ảo:

\boldsymbol{q} = w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}

Đừng mường tượng quaternion là một cái gì đó bốn chiều, đầu bạn sẽ nổ tung. Các thành phần ảo i, j, k có thể được coi như ba vector đơn vị của trục tọa độ x, y, z. Và một quaternion có thể được viết lại như sau:

\boldsymbol{q} = w + \boldsymbol{v}

Với \boldsymbol{v} là một vector trong không gian 3 chiều, và w là một đại lượng vô hướng chỉ độ lớn (nói chung là một con số). Dễ tưởng tượng hơn rồi đúng không!

Áp dụng vào phép quay không gian của chúng ta. Giả sử bạn có một vector trục quay \boldsymbol{u} (vector \boldsymbol{u} phải là vector đơn vị, tức u_x^2 + u_y^2 + u_z^2 = 1 ) và góc quay \theta (dương khi quay cùng chiều với vector, theo nguyên tắc nắm tay phải) thì chúng ta sẽ có một quaternion quay như sau:

\boldsymbol{q} = \cos \frac{1}{2} \theta + \boldsymbol{u} \sin \frac{1}{2} \theta = \cos \frac{1}{2} \theta + (u_x \boldsymbol{i} + u_y \boldsymbol{j} + u_z \boldsymbol{k}) \sin \frac{1}{2} \theta

Ví dụ, bạn muốn tạo một phép quay một góc 120 độ (tức 2/3 pi radian) quay trục \boldsymbol{v} = \boldsymbol{i} + \boldsymbol{j} + \boldsymbol{k} . Đầu tiên chúng ta sẽ chuẩn hóa (normalize) vector \boldsymbol{v} thành vector đơn vị \boldsymbol{u}.

\boldsymbol{u} = \boldsymbol{\hat{v}} = \dfrac{\boldsymbol{v}}{|\boldsymbol{v}|} = \dfrac{\boldsymbol{i} + \boldsymbol{j} + \boldsymbol{k}}{\sqrt{1^2 + 1^2 + 1^2}} = \frac{1}{\sqrt{3}}(\boldsymbol{i} + \boldsymbol{j} + \boldsymbol{k})

Và từ đó, chúng ta có quaternion cho phép quay là:

\boldsymbol{q} = \cos \frac{1}{2} \theta + \boldsymbol{u} \sin \frac{1}{2} \theta = \cos \frac{\pi}{3} + \frac{1}{\sqrt{3}}(\boldsymbol{i} + \boldsymbol{j} + \boldsymbol{k}) \sin \frac{\pi}{3} = \dfrac{1 + \boldsymbol{i} + \boldsymbol{j} + \boldsymbol{k}}{2}

Để thực hiện phép quay, bạn cần một cái gì đó để quay. Ví dụ tôi có một điểm P trong không gian có tọa độ (a, b, c) được xác định trong không gian bởi vector \boldsymbol{p} = a\boldsymbol{i} + b\boldsymbol{j} + c\boldsymbol{k} thì phép quay điểm P theo \boldsymbol{q} được định nghĩa là:

\boldsymbol{p}' = \boldsymbol{qpq}^{-1}

Trong đó \boldsymbol{p}' là vector tọa độ của điểm P sau khi xoay. Và \boldsymbol{q}^{-1} là nghịch đảo của \boldsymbol{q}. Cụ thể trong trường hợp này:

\boldsymbol{q}^{-1} = \dfrac{1}{\boldsymbol{q}} = \cos \frac{1}{2} \theta - \boldsymbol{u} \sin \frac{1}{2} \theta = \dfrac{1 - \boldsymbol{i} - \boldsymbol{j} - \boldsymbol{k}}{2}

Trong trường hợp này, nghịch đảo bằng lượng liên hợp do trị tuyệt đối của quaternion trong phép quay bằng 1. Nếu bạn thắc mắc tại sao có công thức biến đổi quarternion, xin xem phần sau.

Sau đó, chúng ta sẽ sử dụng phép nhân quartenion. Hãy ghi nhớ phép nhân quaternion không có tính giao hoán. Bạn có thể nghiên cứu thêm về phép nhân quaternion tại đây. Trong blog này tôi chỉ đề cập tới kết quả của phép nhân. Cho 2 quaternion \boldsymbol{q_1} = w_1 + x_1\boldsymbol{i} + y_1\boldsymbol{j} + z_1\boldsymbol{k}\boldsymbol{q_2} = w_2 + x_2\boldsymbol{i} + y_2\boldsymbol{j} + z_2\boldsymbol{k} thì tích \boldsymbol{q} = \boldsymbol{q_1 q_2} là:

\boldsymbol{q} = w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2 \\ + (w_1x_2 + x_1w_2 + y_1z_2 - z_1y_2)\boldsymbol{i} \\ + (w_1y_2 - x_1z_2 + y_1w_2 + z_1x_2)\boldsymbol{j} \\ + (w_1z_2 + x_1y_2 - y_1x_2 + z_1w_2)\boldsymbol{k}

Sử dụng công thức trên để áp vào ví dụ của chúng ta (biến đổi \boldsymbol{p} = a\boldsymbol{i} + b\boldsymbol{j} + c\boldsymbol{k} theo \boldsymbol{q}) và làm phép nhân rất điên cuồng (tôi khuyên bạn nên dùng máy vi tính), chúng ta sẽ ra được:

\boldsymbol{p}' = \boldsymbol{qpq}^{-1} = c\boldsymbol{i} + a\boldsymbol{j} + b\boldsymbol{k}

Ví du về phép quay. Nguồn: Wikipedia.

Hinh bên mô tả phép quay ví dụ của chúng ta. Chúng ta có thể thấy nếu chúng ta quay quanh trục \boldsymbol{v} một góc 120 độ thì tọa độ (a, b, c) sẽ tráo cho nhau thành (c, a, b). Phù hợp với kết quả của phép nhân ở trên.

Vừa rồi tôi vừa mới giới thiệu sơ lược về cách sử dụng quaternion trong phép quay. Trong phần sau, tôi sẽ nói đi sâu về phần toán, việc tối ưu hóa nó trong lập trình và so sánh với các phép biến đổi khác.

Advertisements

4 comments

    1. Cách biểu diễn quaternion trực quan hơn (vừa nhìn qua có thể tưởng tượng được trục xoay). Ngoài ra quaternion chỉ cần 4 tham số tiết kiệm hơn so với ma trận 9 tham số, do đó khi lưu trữ sẽ tiết kiệm dung lượng (đổi ra phép toán sẽ nặng hơn) và ít ràng buộc hơn (với quaternion là tổng bình phương tham số bằng 1; còn với ma trận quay thì nhiều hơn (vì ma trận có thể dùng cho các phép biến hình khác như scaling, skewing nên thiếu ràng buộc sẽ không thành ma trận quay được).

      Số lượt thích

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s