Search…

Cơ Bản về Camera trong Unity

24/09/20205 min read
Giới thiệu các thông số của camera trong Unity và các thao tác thường sử dụng với camera.

Camera là một khái niệm quen thuộc đối với mọi nền tảng phát triển game, với các thao tác chỉnh sửa và chuyển đổi camera, có thể tạo ra vô số hiệu ứng độc đáo và ứng dụng vào game một cách sinh động và hấp dẫn, thu hút nhiều người chơi. 

Các khái niệm cơ bản

Projection

Có 2 loại phép chiếu của camera:

  • Orthographic: phép chiếu song song, được sử dụng trong các game 2D, các đối tượng sẽ được vẽ đúng tỉ lệ dù ở bất kỳ khoảng cách nào của chiều sâu.
  • Perspective: phép chiếu phối cảnh, được ứng dụng trong game 3D, mô phỏng lại thế giới thực của con người. Các vật thể càng ở xa thì tỉ lệ hình ảnh sẽ càng nhỏ và ngược lại.

Field of view (fov)

Là góc mở của camera Perspective. Đối với Orthographic camera, tham số này sẽ được bỏ qua. Fov được mô tả thông qua hình minh hoạ sau:

Mô tả Fov

Với cùng 1 đối tượng và 1 vị trí, nếu fov càng lớn, đối tượng sẽ càng nhỏ và ngược lại. Đây là đặc điểm thú vị và được ứng dụng trong việc tạo hiệu ứng zoom trong môi trường 3D.

Near - Far

Near và Far là hai mặt phẳng cắt, quy định khoảng nhìn thấy của camera tính theo chiều sâu. 1 vật muốn được hiển thị phải nằm trong phạm vi nhìn thấy của camera, bao gồm cả khoảng cách từ camera đến vật đó. Nếu quá gần hoặc quá xa, camera sẽ không thu được hình ảnh để hiển thị lên màn hình.

Camera trong Unity

Tuỳ chỉnh tại Inspector

Camera trong Unity

Tại Inspector, có thể chỉnh sửa các thuộc tính minh hoạ ở trong hình. Chi tiết 1 số thuộc tính thường dùng:

  • Clear Flag: quy định cách thức xoá các đối tượng. Trong 3D game tuỳ chọn Skybox thường được sử dụng và tuỳ chọn Solid color đối với game 2D.
  • Background: màu nền sau khi các đối tượng đã được render.
  • Culling Mask: quy định các layer sẽ được vẽ hoặc ẩn đi.
  • Projection: chọn phép chiếu cho camera.
  • Size: kích thước của camera. Tuỳ chọn này chỉ có khi phép chiếu được chọn là Orthographic.
  • Field of view: góc đo tính bằng độ, là góc đo chiều rộng góc nhìn của Camera.
  • Clipping Planes: bao gồm 2 thuộc tính Near và Far. Là khung nhìn thấy của camera.
  • Viewport Rect: kích thước của camera và vị trí của nó trên màn hình. Các giá trị này sử dụng hệ toạ độ Screen Coordinate (giới thiệu ở phần dưới).

Một số thao tác trong C# Script

Thông thường, các thuộc tính quy định tính chất của camera sẽ ít khi được chỉnh sửa trong script. Tuy nhiên, có thể thay đổi chúng trong Runtime để tạo ra các hiệu ứng như Camera Zoom, thay đổi màu sắc Background qua từng màn chơi, …

1 số thuộc tính chính của Camera:

Thuộc tính Chức năng
main Trả về đối tượng camera đầu tiên được gắn tag "MainCamera".
allCameras Trả về tất cả các đối tượng camera đang được kích hoạt.
allCamerasCount Số lượng camera trong scene hiện tại.
aspect Tỉ lệ màn hình, tính bằng công thức aspect = width / height.
backgroundColor Màu nền.
clearFlags Cờ quy định việc xoá camera sau mỗi frame.
fieldOfView Góc nhìn của camera, sử dụng cho phép chiếu Perspective.
orthographicSize Kích thước camera, sử dụng với phép chiếu Orthographic.
cameraToWorldMatrix Ma trận 4x4 biến đổi toạ độ trong không gian camera sang toạ độ thế giới game.
worldToCameraMatrix Ma trận 4x4 biến đổi toạ độ thế giới game sang toạ độ trong không gian camera.

Các hệ toạ độ trong Unity

World Coordinate

Là hệ toạ độ của thế giới thực trong game. Hệ toạ độ này tuân theo quy tắc bàn tay trái:

  • Chiều x dương là bên phải.
  • Chiều y dương hướng lên trên.
  • Chiều z dương hướng vào bên trong màn hình.

Toạ độ của đối tượng được thể hiện trong thành phần Transform chính là toạ độ trong World coordinate.

Các đối tượng con còn có 1 toạ độ khác được lưu trữ tại các thuộc tính localPosition, localRotationlocalScale của Transform.

Viewport Coordinate

Là hệ toạ độ của camera. Trong Unity, các trục toạ độ của World space và Viewport space trùng nhau, nhưng khác nhau về đơn vị của các trục.

Trong camera, góc dưới bên trái có toạ độ (0, 0), góc trên bên phải có toạ độ (1, 1).

Các giá trị này có thể được chỉnh sửa thông qua Viewport Rect trong Inspector của đối tượng Camera.

Screen Coordinate

Screen Coordinate là hệ toạ độ của màn hình hiển thị.

Đơn vị của các trục là pixel.

  • Góc dưới bên trái màn hình có toạ độ (0, 0).
  • Góc trên bên phải là (screenWidth – 1, screenHeight – 1).

UI Coordinate

Là hệ toạ độ của các đối tượng UI, giá trị của các trục toạ độ sẽ nằm trong khoảng (0, 1).

  • Góc trên bên trái có toạ độ (0, 0).
  • Góc dưới bên phải là (1, 1).

Chuyển đổi giữa các hệ toạ độ trong Unity

Trong khi thao tác với các đối tượng thông qua script, nhiều trường hợp nhận được input từ các sự kiện click chuột, touch,… và dùng nó để thao tác với các đối tượng. Thông thường các sự kiện này sẽ trả về toạ độ của Screen space. Vậy làm sao có thể chuyển đổi sang World space để thao tác được với các đối tượng chính xác?

Unity hỗ trợ sẵn các hàm chuyển đổi giữa các Coordinate system. Các hàm này được gắn vào camera chính đang được sử dụng (trong trường hợp game có nhiều hơn 1 camera):

  • Camera.WorldToScreenPoint
  • Camera.WorldToViewportPoint
  • Camera.ScreenToViewportPoint
  • Camera.ScreenToWorldPoint
  • Camera.ViewportToScreenPoint
  • Camera.ViewportToWorldPoint

Các hàm trên sẽ nhận vào 1 Vector3 và trả về 1 Vector3 tương ứng với hệ toạ độ cần chuyển.

2 thao tác liên tiếp hỗ trợ việc chuyển từ Ui sang Screen Coordinate và ngược lại.

  • GUIUtility.ScreenToGUIPoint
  • GUIUtility.GUIToScreenPoint
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