Search…

C# Script - Lớp Quaternion

25/09/20203 min read
Hướng dẫn thao tác với lớp Quaternion để quay đối tượng trong Unity.

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à 1 Vector3 đượ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ới forward, với nhu cầu sử dụng thông thường nên giữ nguyên giá trị mặc định của upwards để 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

LerpSlerp 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.

STDIO_UnityQuaternion.zip

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024