0

làm game tương tác người máy sử dụng Kinect trong Unity

Lời mở đầu

**Ở bài trước, tôi đã giới thiệu với các bạn cách tạo animation cho nhân vật và xuất ra định dạng file để có thể sử dụng trong game engine Unity. Ở bài này, tôi muốn giới thiệu một ứng dụng khác của Kinect trong việc làm game, nó sẽ được sử dụng như một đạo cụ, phương thức để người chơi tương tác với game. **

**Đặc điểm của Kinect là nó đặc trang bị một cảm biến hồng ngoại, giúp tạo được một depth map (biết được khoảng cách đến từng điểm trên ảnh). Nhờ có thông tin của depth, việc nhận dạng con người và các cử chỉ của họ một cách tự động đã trở nên dễ dàng, chính xác hơn. Do đó, chúng ta hoàn toàn có thể áp dụng nhận dạng cử chỉ của người chơi và lập trình các hành động tương ứng với các cử chỉ đó. **

Cài đặt

  • Tải Kinect SDK 1.8 (Đã thử với bản 2.0 trở đi nhưng lỗi thư viện với wrapper)
  • Tải Kinect wrapper package cho Unity theo link dưới đây

http://wiki.etc.cmu.edu/unity3d/index.php/Microsoft_Kinect_-_Microsoft_SDK

  • Import package vào project.

Làm quen

Trong package có một số ví dụ, việc bạn cần làm để trải nghiệm là cắm giắc nối Kinect vào và play the scene 😄 . Điều quan trọng là bạn nên tìm hiểu về cấu trúc, cách vận hành của từng class, ví dụ như class SkeletonWrapper để lấy thông tin vị trí người chơi, depthwrapper xử lý thông tin của depth map,...

Qua đó, bạn có thể nắm được phần nào sẽ cần thiết cho game của bạn, cấu trúc thông tin như thế nào.

Thực hiện

Đến đây, những gì tôi đã trình bày vẫn hơi trừu tượng và rất khó hình dung phải không? Vậy thông tin vị trí của người chơi là như thế nào? Dựa theo mô hình cấu tạo xương người, SDK đã tạo ra mô hình với những điểm khớp xương và nối các điểm đó lại, ta có một khung người cơ bản (skeleton). Và SDK có khả năng track vị trí (x, y, z) của những điểm khớp đó. Việc lấy thông tin đó rất đơn giản, trong wrapper, ta chỉ cần gọi

Kinect.NuiSkeletonPositionIndex.Head;

là sẽ lấy được thông tin vị trí x,y,z của đầu, tương tự như tay, bàn tay, cổ,... Hay ta cũng có thể lấy thông tin của toàn bộ các điểm khớp bằng cách gọi

SkeletonWrapper.bonePos;

7.png

Theo những gì tôi đã trình bày, việc lấy thông tin người chơi quả thực dễ dàng, nhưng việc xử lý những thông tin đấy như thế nào lại là một câu chuyện khác. Làm sao từ những thông tin vị trí đấy có thể biết được người chơi đang thực hiện động tác nào, người chơi mong muốn máy sẽ phản ứng ra sao? Đó hoàn toàn phụ thuộc vào nội dung game của bạn, bạn cần tạo ra một tập hợp những hành động của người chơi, và ánh xạ tới những xử lý tương ứng trong chương trình của bạn.

Trong những ngày đầu tiên tiếp xúc với lập trình game của tôi, tôi đã tạo một game với Kinect, cách tôi xử lý với những hành động của người chơi là tính toán khoảng cách tương đối giữa các khớp và định nghĩa đó là 1 action tương ứng trong game. Ví dụ như: Đầu người chơi di chuyển theo phương x sẽ tương ứng với nhân vật của tôi đi ngang, tay giơ lên cao -> tấn công,...

Demo

Dưới đây là game tôi làm từ những ngày đầu, sử dụng Unity với Kinect: https://drive.google.com/file/d/0B2mj3ezS8y7mdU12Qm1KSU03Zms/view?usp=sharing


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí