Thuật ngữ Quaternion
khởi nguồn từ lý thuyết toán học, được ứng dụng trong các phép quay không gian, trong Unity, Quaternion
được sử dụng để biểu diễn phép quay của mọi đối tượng.
Tổng quan
Quaternion được xây dựng dựa trên số phức toán học và được biểu diễn bởi 4 thành phần x, y, z, w với công thức:
Q = w + xi + yj + zk
Với i, j, k là các thành phần ảo, được xem như 3 vector đơn vị của các trục tọa độ tương ứng.
Trong Unity, mọi phép quay của đối tượng đều được lưu trữ và thể hiện bằng Quaternion
với 4 thành phần kể trên, các thành phần này không nên được chỉnh sửa độc lập đối với lập trình viên thông thường.
Để truy xuất các thành phần đó, có thể sử dụng qua các kênh x, y, z, w tương ứng hoặc sử dụng như 1 mảng 4 phần tử với thứ tự như trên, ví dụ như sau:
void Example() { public Quaternion p; p[3] = 0.5f; p.x = 0.75f; }
Ngoài ra còn những cách khác để thiết lập giá trị cho các kênh thông tin của Quaternion
như sử dụng constructor hay phương thức Set
. Các cách này chỉ có thể chỉnh sửa cùng lúc cả 4 kênh của Quaternion
.
eulerAngles
Thuộc tính này trả về 1 Vector3
, tương ứng với góc quay của từng trục trên đối tượng, đây là cách thức biểu diễn thông thường và dễ hiểu hơn của phép quay.
Các hàm quan trọng và chức năng
identity
Thuộc tính này trả về 1 Quaternion
tương ứng không có bất kỳ phép quay nào, tương ứng với Vector3(0, 0, 0)
đối với cách biểu diễn dưới dạng eulerAngles
.
Đối tượng được gán identity
sẽ có các trục toạ độ trùng với hệ trục toạ độ thế giới (World axes) hoặc đối tượng chứa nó (Parent axes).
LookRotation
Hàm LookRotation
tạo ra 1 phép quay với hướng xác định, giá trị trả về là 1 Quaternion
, guyên mẫu hàm như sau:
public static Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up);
Trong đó:
forward
là 1Vector3
được sử dụng để xác định hướng quay của đối tượng, trục z của đối tượng sẽ trùng với hướng quay.- Tham số
upwards
nhận giá trị mặc định làVector3.up
, nghĩa là trục y của đối tượng sẽ hướng lên trên so vớiforward
, với nhu cầu sử dụng thông thường nên giữ nguyên giá trị mặc định củaupwards
để có được hiệu ứng đẹp nhất.
Angle
Trả về 1 góc (tính bằng độ - degree) là góc giữa 2 Quaternion
.
Nguyên mẫu của hàm:
public static float Angle(Quaternion a, Quaternion b);
Euler
Thao tác với Quaternion
qua 4 kênh x, y, z, w khá mơ hồ và khó hiểu. Do đó, Unity cung cấp 1 hàm giúp thao tác và điều chỉnh góc quay của đối tượng thông qua chính ba trục toạ độ của đối tượng đó, cú pháp của hàm như sau:
public static Quaternion Euler(float x, float y, float z);
Trong đó, x, y, z là ba góc quay tương ứng với ba trục toạ độ của đối tượng, các góc quay sử dụng đơn vị là độ.
Lerp - Slerp
Lerp
và Slerp
là 2 hàm nội suy phép quay giữa 2 Quaternion
và hiển thị việc quay ra màn hình theo thời gian, cách sử dụng và chức năng cả 2 hàm là tương đối giống nhau:
public static Quaternion Slerp(Quaternion from, Quaternion to, float t); public static Quaternion Lerp(Quaternion from, Quaternion to, float t);
Với các phép quay lớn, góc quay rộng, hàm Lerp
sẽ cho chất lượng hiển thị kém hơn Slerp
, nhưng bù lại, về mặt tốc độ thì Lerp
nhanh hơn do không thực hiện nội suy một cách phức tạp.
Theo dõi cách sử dụng 2 hàm này trong code demo đính kèm.
Code demo
Bật cờ hiển thị Gizmos trong cửa sổ Game để theo dõi trực quan.