Đặt vấn đề
Có một chuyện hơi buồn cười thế này.
Bạn cầm điện thoại lên.
Bạn xoay nó sang trái.
Màn hình biết.
Bạn nghiêng nó xuống.
Điện thoại cũng biết.
Bạn mở một game 3D, kéo chuột một cái, nhân vật quay đầu. Chiếc máy bay trong game chúi mũi xuống, con tàu vũ trụ lộn một vòng, camera bay xuyên qua một thành phố giả được tạo bằng hàng triệu tam giác.
Nhìn trên màn hình thì chỉ là vài thứ đang xoay.
Nhưng bên dưới lớp kính lạnh lẽo ấy, CPU và GPU đang phải trả lời một câu hỏi khá kỳ quặc:
Một vật đang hướng về phía này, làm sao biến nó thành hướng về phía kia?
Nghe như bài toán dành cho trẻ mẫu giáo.
Cầm con khủng long đồ chơi lên.
Xoay nó.
Xong.
Nhưng máy tính không có bàn tay.
Nó chỉ có số.
Và thế là một vấn đề tưởng đơn giản như xoay một con khủng long nhựa lại dẫn chúng ta xuống một cái hang toán học rất sâu, nơi số thực sinh ra số phức, số phức mọc thêm hai cái chân nữa, phép nhân bỗng nhiên không còn đổi chỗ được, và một nhà toán học thế kỷ XIX phải khắc công thức lên một cây cầu vì quá phấn khích.
Thứ nằm dưới đáy cái hang đó có tên:
Quaternion — tứ nguyên số.
Nếu số thực giống như một con kiến bò trên một đường thẳng, số phức cho nó chạy ra một mặt phẳng, thì Quaternion bảo:
Hai chiều thôi à? Yếu vậy.
Rồi nó viết:
$$ q = a + bi + cj + dk $$
Bốn con số.
Một phần thực.
Ba phần tưởng tượng.
Và bằng một cách rất kỳ lạ, thứ sống trong không gian bốn chiều này lại trở thành một trong những công cụ đẹp nhất để mô tả phép quay trong không gian ba chiều.
Từ số thực đến một con quái vật bốn đầu
Trước khi gặp Quaternion, ta quay lại với những thứ hiền lành hơn một chút.
Số thực: thế giới một chiều
Giả sử ta có một trục số:
1<---- -2 ---- -1 ---- 0 ---- 1 ---- 2 ---->
Một số thực chỉ cần một con số để xác định vị trí.
Ví dụ:
$$ x = 5 $$
Rất ngoan.
Rất dễ thương.
Không có chuyện gì xảy ra.
Số phức: khi số mọc thêm một chiều
Rồi toán học gặp phương trình:
$$ x^2 = -1 $$
Không có số thực nào bình phương lên bằng (-1).
Thay vì bỏ cuộc, các nhà toán học làm điều mà toán học rất hay làm:
phát minh thêm một thứ mới.
Ta gọi:
$$ i^2 = -1 $$
Một số phức có dạng:
$$ z = a + bi $$
Bây giờ thay vì nằm trên đường thẳng, nó có thể được hình dung trên một mặt phẳng.
1 Im
2 ^
3 |
4 | a + bi
5 | *
6 |
7-----------+------------> Re
8 |
Điều thú vị là số phức cực kỳ phù hợp với phép quay 2D.
Ví dụ:
$$ e^{i\theta}
\cos\theta + i\sin\theta $$
Nhân một số phức với biểu thức trên tương ứng với việc quay nó một góc (\theta) trên mặt phẳng.
Đẹp.
Gọn.
Thơm.
William Rowan Hamilton nhìn thấy điều đó và bắt đầu nghĩ:
Nếu số phức quay được thế giới 2D, liệu có một loại số nào quay được thế giới 3D không?
Nghe hợp lý.
Thế là ông tìm một hệ số kiểu:
$$ a + bi + cj $$
Ba chiều.
Ba thành phần.
Có vẻ quá đẹp.
Chỉ có một vấn đề nhỏ.
Nó không hoạt động.
Hamilton vật lộn với bài toán này trong nhiều năm. Năm 1843, ông nhận ra rằng ba thành phần là chưa đủ. Phải có bốn.
Và Quaternion xuất hiện:
$$ q = a + bi + cj + dk $$
Quaternion tạo thành một không gian vector bốn chiều trên số thực với cơ sở (1,i,j,k). (Wikipedia)
Con quái vật đã mọc đủ bốn cái đầu.
Quaternion là gì?
Một Quaternion thường được viết:
$$ q = w + xi + yj + zk $$
Trong đó:
- (w) là phần vô hướng (scalar part)
- (x,y,z) tạo thành phần vector
- (i,j,k) là ba đơn vị tưởng tượng
Ta cũng có thể viết gọn:
$$ q = (w, \mathbf{v}) $$
với:
$$ \mathbf{v}=(x,y,z) $$
Ví dụ:
$$ q = 2 + 3i + 4j + 5k $$
tương đương:
1w = 2
2x = 3
3y = 4
4z = 5
Đến đây Quaternion trông chẳng có gì ghê gớm.
Chỉ là bốn con số đứng cạnh nhau.
Nhưng rồi Hamilton đưa ra luật chơi.
Và luật chơi hơi điên.
Ba con quỷ i, j, k
Với số phức ta có:
$$ i^2=-1 $$
Quaternion có ba đơn vị tưởng tượng:
$$ i,;j,;k $$
và:
$$ i^2=j^2=k^2=-1 $$
Chưa hết.
Hamilton định nghĩa:
$$ ij=k $$
$$ jk=i $$
$$ ki=j $$
Nhưng nếu đổi thứ tự:
$$ ji=-k $$
$$ kj=-i $$
$$ ik=-j $$
Gộp tất cả lại ta có công thức nổi tiếng:
$$ i^2=j^2=k^2=ijk=-1 $$
Đây là luật nhân Hamilton kinh điển. (Wikipedia)
Có thể nhớ bằng một vòng tròn:
1 i
2 / \
3 / \
4 k --- j
Đi thuận vòng:
1i × j = k
2j × k = i
3k × i = j
Đi ngược vòng thì thêm dấu âm:
1j × i = -k
2k × j = -i
3i × k = -j
Và ở đây có một thứ cực kỳ quan trọng xuất hiện.
Ở Quaternion, 2 × 3 không còn giống 3 × 2
Từ nhỏ ta được dạy:
$$ 2\times3=3\times2 $$
Toán học gọi tính chất này là giao hoán (commutative).
Nhưng Quaternion nói:
Tôi không chơi luật đó.
Ví dụ:
$$ ij=k $$
nhưng:
$$ ji=-k $$
Nghĩa là:
$$ ij\neq ji $$
Phép nhân Quaternion không giao hoán.
Nghe có vẻ như một lỗi thiết kế.
Nhưng thực ra đây chính là thứ khiến Quaternion hoàn hảo cho phép quay.
Bởi vì trong thế giới 3D:
thứ tự quay rất quan trọng.
Cầm một cuốn sách lên thử
Lấy một cuốn sách.
Ban đầu mặt bìa hướng lên trên.
Thực hiện:
- quay 90° quanh trục X;
- sau đó quay 90° quanh trục Y.
Nhìn vị trí cuối.
Bây giờ làm lại:
- quay 90° quanh Y;
- rồi quay 90° quanh X.
Bạn sẽ thấy hai kết quả khác nhau.
1Rotate X -> Rotate Y
2
3khác
4
5Rotate Y -> Rotate X
Đó không phải lỗi của toán.
Đó là bản chất của không gian.
Và Quaternion phản ánh chính xác điều này:
$$ q_1q_2\neq q_2q_1 $$
Một thứ toán học trông có vẻ méo mó thực ra lại méo đúng kiểu mà thế giới vật lý méo.
Đấy mới là chỗ thú vị.
Một Quaternion có thể biểu diễn phép quay như thế nào?
Bây giờ mới đến phần hơi ma thuật.
Giả sử ta muốn xoay một vật quanh vector đơn vị:
$$ \mathbf{u}=(u_x,u_y,u_z) $$
một góc:
$$ \theta $$
Ta tạo Quaternion:
$$ q
\cos\frac{\theta}{2} + (u_xi+u_yj+u_zk)\sin\frac{\theta}{2} $$
Hay dạng bốn số:
$$ q= \left( \cos\frac{\theta}{2}, u_x\sin\frac{\theta}{2}, u_y\sin\frac{\theta}{2}, u_z\sin\frac{\theta}{2} \right) $$
Đây là một unit quaternion, nghĩa là độ dài của nó bằng 1. Công thức axis-angle với góc nửa (\theta/2) chính là cách Quaternion đơn vị mã hóa phép quay 3D. (Wikipedia)
Ví dụ muốn quay 90° quanh trục Z:
$$ \mathbf{u}=(0,0,1) $$
và:
$$ \theta=90^\circ $$
Ta có:
$$ \frac{\theta}{2}=45^\circ $$
Suy ra:
$$ q= \cos45^\circ+k\sin45^\circ $$
hay:
$$ q= \frac{\sqrt2}{2} + \frac{\sqrt2}{2}k $$
Chỉ bốn con số.
Nhưng bên trong bốn con số đó đang cất một phép quay hoàn chỉnh.
Tại sao lại là góc chia đôi?
Đây là đoạn khiến Quaternion có vẻ như uống nhầm thuốc.
Ta muốn quay:
$$ 90^\circ $$
nhưng trong Quaternion lại lưu:
$$ 45^\circ $$
Tại sao?
Bởi vì phép quay một vector không phải là:
$$ qv $$
mà là:
$$ v’=qvq^{-1} $$
Vector ba chiều:
$$ v=(x,y,z) $$
được nhét vào một Quaternion thuần vector:
$$ v=0+xi+yj+zk $$
Sau đó ta kẹp nó giữa:
$$ q $$
và:
$$ q^{-1} $$
Giống như bỏ một miếng bánh mì vào máy ép:
1q -> vector -> q⁻¹
2
3 ↓
4
5 vector đã xoay
Do Quaternion xuất hiện ở cả hai phía, góc nửa ở (q) kết hợp thành góc đầy đủ ở kết quả.
Nếu (q) là unit quaternion thì:
$$ q^{-1}=\bar q $$
với Quaternion liên hợp:
$$ \bar q=w-xi-yj-zk $$
Ví dụ: xoay vector bằng Quaternion
Giả sử ta có vector:
$$ v=(1,0,0) $$
Tức một mũi tên đang chỉ theo trục X.
Ta muốn xoay nó 90° quanh trục Z.
Quaternion quay:
$$ q= \frac{\sqrt2}{2} + \frac{\sqrt2}{2}k $$
Vector được viết thành Quaternion:
$$ p=i $$
Sau đó:
$$ p’=qpq^{-1} $$
Kết quả:
$$ p’=j $$
Hay:
$$ (1,0,0) \rightarrow (0,1,0) $$
Một mũi tên đang chỉ sang phải đã quay lên trên.
Máy tính không cầm mũi tên.
Không biết trên.
Không biết dưới.
Không biết “xoay” nghĩa là gì.
Nó chỉ nhân bốn con số với bốn con số.
Và từ phép nhân lạnh lùng ấy, một vật thể trên màn hình quay đi.
Cũng hơi kỳ.
Độ dài của Quaternion
Với:
$$ q=w+xi+yj+zk $$
độ lớn là:
$$ |q|
\sqrt{w^2+x^2+y^2+z^2} $$
Nếu:
$$ |q|=1 $$
ta gọi nó là unit quaternion.
Các Quaternion dùng để biểu diễn phép quay thường được chuẩn hóa về độ dài 1.
Ví dụ:
$$ q=(0.7071,0,0,0.7071) $$
Ta có:
$$ 0.7071^2+0.7071^2\approx1 $$
Đây gần như là unit quaternion.
Một điều hơi đáng sợ: q và -q là cùng một phép quay
Giả sử:
$$ q=(w,x,y,z) $$
Một điều kỳ quặc xảy ra:
$$ q $$
và:
$$ -q $$
biểu diễn cùng một phép quay 3D.
Ví dụ:
$$ (0.707,0,0,0.707) $$
và:
$$ (-0.707,0,0,-0.707) $$
là cùng một orientation.
Đây không phải bug.
Không gian các unit quaternion là một mặt cầu ba chiều (S^3), và ánh xạ từ unit quaternion xuống các phép quay (SO(3)) là một double cover: mỗi phép quay tương ứng với hai Quaternion đối dấu nhau. (MathWorld)
Hình dung rất thô:
1 Quaternion space S³
2
3 q --------+
4 |
5 +----> một phép quay 3D
6 |
7 -q --------+
Hai điểm khác nhau trong không gian Quaternion.
Nhưng khi chiếu xuống thế giới quay 3D:
chúng trở thành một.
Một thứ rất toán học, nhưng cũng khá triết học.
Có khi hai con đường nằm ở hai phía của một quả cầu, đi xa nhau đến mức tưởng như đối nghịch, cuối cùng lại chỉ vào cùng một hướng.
Vậy tại sao không dùng Euler angles?
Trong game hoặc robotics, một orientation có thể được mô tả bằng ba góc:
- yaw
- pitch
- roll
Ví dụ:
1yaw = 30°
2pitch = 20°
3roll = 10°
Nghe rất tự nhiên.
Con người thích kiểu này vì ta hiểu được:
quay trái 30 độ, ngẩng lên 20 độ.
Nhưng Euler angles có một con quái vật tên là:
Gimbal Lock.
Gimbal Lock: khi hai trục nhập làm một
Hãy tưởng tượng ba vòng xoay lồng vào nhau:
1 vòng Z
2 ┌────────┐
3 │ vòng Y │
4 │ ┌────┐ │
5 │ │ X │ │
6 │ └────┘ │
7 └────────┘
Mỗi vòng đại diện cho một trục quay.
Trong một số tư thế đặc biệt, hai trục có thể chồng lên nhau.
Khi đó hệ thống mất một bậc tự do.
Ví dụ kinh điển là pitch tới:
$$ 90^\circ $$
Lúc ấy hai phép quay vốn độc lập có thể trở nên không còn độc lập theo cách biểu diễn Euler.
Chiếc camera 3D có thể bắt đầu cư xử như vừa tỉnh dậy lúc ba giờ sáng.
Quaternion không dùng ba góc Euler độc lập như vậy nên tránh được singularity kiểu gimbal lock của representation Euler.
Đây là một lý do nó xuất hiện rất nhiều trong:
- game engine
- robotics
- drone
- aerospace
- VR/AR
- computer graphics
- IMU và cảm biến định hướng
Nhưng Quaternion có phải luôn tốt hơn Euler không?
Không.
Toán học hiếm khi có một cây búa đập được tất cả đinh.
Euler angles dễ hiểu với con người.
Nếu tôi nói:
1yaw = 45°
bạn hiểu ngay.
Nếu tôi nói:
1q = (0.9239, 0, 0, 0.3827)
thì trừ khi vừa uống ba ly cà phê và đang debug Unity lúc hai giờ sáng, khả năng cao bạn sẽ nhìn tôi như nhìn một sinh vật biển sâu.
Vì vậy một hệ thống thực tế thường:
- dùng Quaternion để tính toán nội bộ;
- chuyển sang Euler angles khi cần hiển thị cho con người.
Quaternion và ma trận quay
Ta cũng có thể biểu diễn rotation bằng ma trận (3\times3):
$$
R=
\begin{bmatrix}
r_{11} & r_{12} & r_{13}
r_{21} & r_{22} & r_{23}
r_{31} & r_{32} & r_{33}
\end{bmatrix}
$$
Ma trận quay cần 9 con số.
Quaternion chỉ cần 4:
$$ q=(w,x,y,z) $$
Tất nhiên không phải Quaternion có “4 bậc tự do thực sự”. Vì unit quaternion phải thỏa:
$$ w^2+x^2+y^2+z^2=1 $$
nên có một constraint.
Và vì (q) với (-q) là cùng một rotation nên nó còn có tính dư thừa dấu.
Nhưng trong thực tế, bốn giá trị vẫn rất tiện để lưu và kết hợp orientation.
Kết hợp nhiều phép quay
Giả sử robot phải:
- quay 30° quanh X;
- rồi quay 45° quanh Y;
- rồi quay 10° quanh Z.
Ta tạo:
$$ q_x,;q_y,;q_z $$
Sau đó kết hợp chúng bằng phép nhân Quaternion:
$$ q=q_zq_yq_x $$
Thứ tự rất quan trọng.
Bởi:
$$ q_zq_yq_x \neq q_xq_yq_z $$
Điều này chính xác với vật lý.
Quay một vật quanh X rồi Y không nhất thiết giống quay quanh Y rồi X.
Quaternion không cố làm thế giới dễ hơn.
Nó chấp nhận rằng thế giới vốn đã kỳ quặc.
SLERP: xoay mà không giật cục
Giả sử camera game đang hướng về A.
Ta muốn nó quay dần sang B.
Một cách ngây thơ là nội suy từng thành phần.
Quaternion A:
$$ q_0 $$
Quaternion B:
$$ q_1 $$
Ta có thể thử:
$$ q(t)=(1-t)q_0+tq_1 $$
Đây gọi là linear interpolation.
Nhưng rotation không thực sự sống trên một đường thẳng.
Unit quaternion sống trên:
$$ S^3 $$
một mặt cầu trong không gian bốn chiều.
Vì vậy nếu muốn đi từ rotation A sang B một cách tự nhiên, ta nên đi theo cung tròn trên mặt cầu.
Kỹ thuật này gọi là:
SLERP — Spherical Linear Interpolation.
Ý tưởng có thể hình dung:
1 q1 *
2 /
3 /
4 /
5 *
6 q0
7
8đi theo cung của mặt cầu,
9không chọc xuyên thẳng qua bên trong.
Công thức:
$$ \operatorname{slerp}(q_0,q_1,t)
\frac{\sin((1-t)\Omega)} {\sin\Omega}q_0 + \frac{\sin(t\Omega)} {\sin\Omega}q_1 $$
với:
$$ \cos\Omega=q_0\cdot q_1 $$
SLERP cho tốc độ góc đều dọc theo cung ngắn thích hợp và thường được dùng khi cần animation rotation mượt.
Nghe phức tạp.
Nhưng mục tiêu rất đời thường:
Camera quay từ người này sang người kia mà đừng giật như bị ai đá vào tripod.
Một chút Python
Ta thử tạo Quaternion biểu diễn phép quay quanh một trục.
1import math
2
3def axis_angle_to_quaternion(axis, angle_deg):
4 x, y, z = axis
5
6 length = math.sqrt(x*x + y*y + z*z)
7 x /= length
8 y /= length
9 z /= length
10
11 angle = math.radians(angle_deg)
12 half = angle / 2
13
14 w = math.cos(half)
15 s = math.sin(half)
16
17 return (
18 w,
19 x * s,
20 y * s,
21 z * s,
22 )
23
24
25q = axis_angle_to_quaternion(
26 axis=(0, 0, 1),
27 angle_deg=90
28)
29
30print(q)
Kết quả gần:
1(0.70710678, 0.0, 0.0, 0.70710678)
Đúng với công thức:
$$ q= \cos45^\circ + k\sin45^\circ $$
Xong Quaternion.
Quá dễ.
Tất nhiên đấy là câu người ta thường nói trước khi dành ba tiếng debug xem thư viện đang dùng thứ tự (w, x, y, z) hay (x, y, z, w).
Một cái bẫy rất thực tế: convention
Nếu làm với Quaternion trong production, có một thứ rất nên kiểm tra:
quy ước của thư viện.
Có thư viện lưu:
1(w, x, y, z)
Có thư viện lưu:
1(x, y, z, w)
Ngoài ra còn có khác biệt về:
- hệ tọa độ tay trái / tay phải;
- active rotation / passive rotation;
- thứ tự nhân;
- local space / world space.
Thậm chí trong lịch sử kỹ thuật còn tồn tại các convention Quaternion khác nhau; Hamilton convention dùng (ij=k), trong khi một số convention aerospace/JPL từng sử dụng dấu theo cách khác. (Wikipedia)
Đây là loại bug mà code nhìn hoàn toàn đúng.
Vector cũng đúng.
Quaternion cũng normalized.
Chỉ có chiếc drone tưởng rằng “quay trái” nghĩa là “úp mặt xuống đất”.
Quaternion xuất hiện ở đâu?
Game
Mỗi object 3D thường có:
1position
2rotation
3scale
Rotation rất thường được lưu bằng Quaternion.
Ví dụ ý tưởng:
1player.rotation = quaternion
2camera.rotation = quaternion
Nhờ đó ta có thể:
- quay nhân vật;
- xoay camera;
- blend animation;
- interpolate orientation;
- kết hợp nhiều rotation.
Robot
Một cánh tay robot không chỉ cần biết đầu kẹp đang ở:
$$ (x,y,z) $$
Nó còn phải biết đầu kẹp đang hướng như thế nào.
Pose thường có thể được biểu diễn:
1position:
2 x
3 y
4 z
5
6orientation:
7 x
8 y
9 z
10 w
Ba số cho vị trí.
Bốn số cho Quaternion orientation.
Một robot công nghiệp nhặt một con ốc không chỉ cần biết con ốc ở đâu.
Nó còn phải biết:
Tay mình phải nghiêng theo hướng nào để chụp xuống đúng cái con ốc bé tí kia?
Điện thoại
Bên trong điện thoại có thể có:
- accelerometer;
- gyroscope;
- magnetometer.
Từ những cảm biến này, hệ thống ước lượng orientation của thiết bị.
Quaternion là một dạng biểu diễn rất phổ biến trong các bài toán sensor fusion.
Bạn chỉ xoay điện thoại một chút.
Ở tầng trên:
màn hình xoay.
Ở tầng dưới:
điện áp thay đổi trong MEMS sensor, dữ liệu được lấy mẫu, các thuật toán ước lượng trạng thái chạy liên tục, vector gia tốc và vận tốc góc được kết hợp, rồi bốn con số Quaternion thay đổi từng mili giây.
Không có gì là hoàn toàn “ảo”.
Ngay cả một cái xoay màn hình cũng là kết quả cuối của một chuỗi vật chất rất dài.
Tại sao Quaternion lại có bốn chiều nhưng mô tả rotation 3D?
Đây là câu rất hay.
Không gian rotation 3D không đơn giản là:
$$ \mathbb{R}^3 $$
Ta không thể chỉ lấy:
1rotation = (x, y, z)
rồi cộng trừ vô tư như tọa độ thông thường.
Các rotation có cấu trúc toán học riêng gọi là:
$$ SO(3) $$
Trong khi đó các unit quaternion tạo thành:
$$ S^3 $$
và có quan hệ rất đẹp:
$$ S^3/{q\sim-q} \cong SO(3) $$
Nói bằng tiếng người:
mặt cầu unit Quaternion bốn chiều có thể phủ lên toàn bộ không gian rotation 3D, nhưng mỗi rotation được phủ bởi hai điểm (q) và (-q).
Đây chính là double cover nói ở trên. (MathWorld)
Có vẻ như để hiểu đầy đủ cách một vật quay trong ba chiều, ta phải lùi ra ngoài nó một chiều.
Giống như một con kiến sống trên tờ giấy không nhìn được toàn bộ hình dạng của tờ giấy nếu chỉ bò mãi bên trong mặt phẳng.
Đôi khi muốn hiểu một vật, ta phải đứng ở một nơi lớn hơn vật đó.
Ưu điểm và hạn chế
Quaternion được dùng nhiều không phải vì tên nó nghe ngầu, mặc dù tên cũng khá ngầu.
Ưu điểm
- Chỉ cần 4 số để lưu orientation.
- Kết hợp rotation bằng phép nhân khá gọn.
- Tránh singularity kiểu gimbal lock của Euler angles.
- Dễ normalize.
- Nội suy rotation đẹp bằng SLERP.
- Phù hợp với animation, robotics, graphics và orientation tracking.
- Có cấu trúc đại số phản ánh đúng tính không giao hoán của rotation 3D.
Hạn chế
- Khó đọc trực tiếp bằng mắt người.
- Dễ nhầm convention.
- Thứ tự nhân rất dễ gây bug.
- Phải giữ Quaternion normalized khi dùng làm rotation.
- (q) và (-q) đại diện cùng rotation nên cần chú ý khi interpolation.
- Debug
yaw=90°thường dễ hơn debug(0.707, 0, 0.707, 0).
Nói ngắn gọn:
Euler angles thân thiện với con người.
Quaternion thân thiện với máy tính.
Ma trận thân thiện với đại số tuyến tính.
Mỗi đứa có một nghề.
Điều thú vị nhất về Quaternion không phải là game
Quaternion ban đầu không được phát minh để làm Unity.
Không có Unreal Engine.
Không có drone.
Không có điện thoại thông minh.
Không có GPU.
Hamilton chỉ đang cố mở rộng một ý tưởng toán học.
Ông không thể biết rằng gần hai thế kỷ sau, hàng tỷ thiết bị sẽ liên tục thực hiện những phép toán có liên quan đến cấu trúc mà ông tìm ra.
Một đứa trẻ nghiêng chiếc tablet.
Một chiếc drone giữ thăng bằng trong gió.
Một robot xoay cổ tay.
Một nhân vật game quay mặt nhìn người chơi.
Một kính VR cập nhật hướng đầu hàng chục lần mỗi giây.
Ở phía trên, chúng là những hành động hoàn toàn khác nhau.
Ở phía dưới, rất nhiều trong số chúng cuối cùng lại chạm vào cùng một thứ:
$$ q=w+xi+yj+zk $$
Một cấu trúc toán học không có khối lượng.
Không có màu sắc.
Không phát ra ánh sáng.
Nhưng khi được mã hóa thành bit, chạy qua transistor, biến thành dòng điện và được GPU tính toán hàng triệu lần mỗi giây, nó có thể khiến cả một thế giới ảo quay quanh mắt chúng ta.
Đó cũng là một điều mình rất thích ở toán học.
Ta phát minh ra những vật thể tưởng như chẳng liên quan gì đến đời sống.
Rồi vài chục năm, vài trăm năm sau, thế giới vật lý bỗng tìm được một chỗ vừa khít để đặt chúng vào.
Tổng kết
Quaternion có dạng:
$$ q=w+xi+yj+zk $$
với:
$$ i^2=j^2=k^2=ijk=-1 $$
Điểm đặc biệt nhất là phép nhân Quaternion không giao hoán:
$$ q_1q_2\neq q_2q_1 $$
và chính đặc điểm tưởng như khó chịu đó lại phù hợp với bản chất của rotation 3D.
Một unit quaternion:
$$ q= \cos\frac{\theta}{2} + \mathbf{u}\sin\frac{\theta}{2} $$
có thể biểu diễn phép quay góc (\theta) quanh trục (\mathbf{u}).
Vector được quay thông qua:
$$ v’=qvq^{-1} $$
Từ đó Quaternion trở thành công cụ cực kỳ hữu ích trong computer graphics, game, robotics, aerospace, VR và hệ thống cảm biến.
Nhưng có lẽ điều đáng nhớ nhất không phải công thức.
Mà là câu chuyện phía sau nó.
Hamilton muốn tìm một thứ tương tự số phức cho không gian ba chiều.
Ông thất bại.
Ông thử tiếp.
Vẫn thất bại.
Cuối cùng ông phát hiện ra rằng câu trả lời không nằm trong ba chiều.
Nó nằm ở bốn.
Đôi khi một bài toán không giải được không phải vì ta tính chưa đủ giỏi.
Mà bởi vì cái khung ta đang nhốt bài toán vào quá nhỏ.
Và đôi khi, để xoay một vật trong thế giới ba chiều, ta cần một con số sống ở nơi mà mắt mình thậm chí không thể nhìn thấy.
Cảm ơn các bạn đã quan tâm và theo dõi bài viết, hẹn gặp lại ở các bài viết tiếp theo.
Tham khảo
- Wikipedia — Quaternion. Quaternion
- Wikipedia — Quaternions and spatial rotation. Quaternions and spatial rotation
- Wikipedia — Euler–Rodrigues formula. Euler–Rodrigues formula
- Wolfram MathWorld — Special Unitary Group, quan hệ giữa unit quaternion, (SU(2)) và (SO(3)). (MathWorld)
Bình luận