Nghệ thuật nếu không có kỹ thuật chỉ là giấc mơ, kỹ thuật không bao gồm nghệ thuật thì chỉ là giải toán. Steven K Robert
STDIO 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, chúng ta 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.
Nội dung bài viết

Giới thiệu

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, chúng ta 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. Bài viết này sẽ giúp các bạn hiểu được các thông số của một camera trong Unity, cùng với một số thao tác thường sử dụng với camera.

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

Projection

Góc chiếu của camera. Đối với các loại camera trong game thì có hai loại phép chiếu:

  • Phép chiếu song song – Orthographic.
  • Phép chiếu xa gần – Perspective.

Orthographic đượ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 đượ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 một đối tượng và một vị trí, nếu fov càng lớn, đối tượng sẽ càng nhỏ và ngược lại. Đây là một đặ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. Một 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

ss_2

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

  • 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. Bạn đọc có thể xem thêm về cách tạo layer qua bài viết GameObject - Thao Tác Với C# Script.
  • 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 hai thuộc tinh là 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, ta hoàn toà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, … Các hiệu ứng này là đặc thù của từng game nên tôi sẽ chỉ liệt kê một số thuộc tính chính của Camera để bạn tham khảo. Chi tiết các bạn có thể xem thêm trong đường dẫn ở cuối bài viết.

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ó một toạ độ khác được lưu trữ tại các thuộc tính localPosition, localRotation và localScale 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) trong khi 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) và 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 ta 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 chúng ta có thể chuyển đổi sang World space để thao tác được với các đối tượng một cách chính xác?

Unity hỗ trợ sẵn cho chúng ta 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 một Vector3 và trả về một Vector3 tương ứng với hệ toạ độ cần chuyển.

Đối với UI Coordinate, Unity hỗ trợ chuyển từ UI sang Screen Coordinate và ngược lại. Do đó chúng ta có thể sẽ cần thực hiện hai thao tác liên tiếp để thực hiện được điều cần thiết. Các hàm đó như sau:

  • GUIUtility.ScreenToGUIPoint
  • GUIUtility.GUIToScreenPoint

Tham khảo

  • http://docs.unity3d.com/ScriptReference/Camera.html - 23/08/2015.
  • http://docs.unity3d.com/Manual/class-Camera.html - 23/08/2015.

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG