Thuật Toán Phát Hiện Va Chạm Trong Game Hành Động - nói dối e blog

Thuật Toán Phát Hiện Va Chạm Trong Game Hành Động

Gần đây, tôi bị cuốn vào tựa game Monster Hunter World, chơi qua loa khoảng 100 tiếng. Kể cả thời gian trải nghiệm các phiên bản trước, tổng cộng cũng vài trăm tiếng. Dù không dám tự xưng lão làng, nhưng có thể tự nhận là fan cứng của series này.

Với chuyên môn kỹ thuật, tôi bắt đầu tò mò về cơ chế vận hành bên trong game. Do tài liệu tiếng Việt hiếm hoi, bài viết này sẽ ghi lại cách tôi hình dung hệ thống xác định đòn đánh giữa vũ khí và quái vật. Đây là góc nhìn cá nhân kết hợp tư duy lập trình game.

Sự khác biệt giữa game hành động và game đối kháng

Dù có nhiều điểm tương đồng, hai thể loại này lại áp dụng phương pháp phát hiện va chạm khác nhau. Đặc biệt, thể loại đối kháng 2D thường dùng hệ thống AABB (Axis-Aligned Bounding Box) - những hình chữ nhật cố định song song với trục tọa độ. Phương pháp này không chỉ tối ưu hiệu năng mà còn giúp thiết lập luật chơi rõ ràng.

Khi phân tích sâu hơn, game đối kháng thường xác định va chạm theo từng khung hình (frame). Ví dụ: Ở khung hình thứ 15 của chiêu thức, hệ thống sẽ vẽ vùng sát thương (còn gọi là hurtbox - thường tô màu đỏ). Nếu lúc đó vùng này chồng lấp lên hitbox (vùng chịu đòn - tô màu xanh lá/xanh dương) của đối thủ, đòn đánh được xem là trúng mục tiêu. Ngoài ra, collisionbox (vùng va chạm) cũng được tích hợp để xử lý va chạm với vật cản hoặc ngăn 2 nhân vật xuyên thấu nhau.

Cách áp dụng trong game 3D hiện đại

Dù nhiều game đối kháng ngày nay dùng engine 3D, đa phần vẫn kế thừa logic 2D. Ví dụ: Street Fighter 5 vẫn giữ nguyên cách sử dụng AABB. Cộng đồng thậm chí còn phát triển phần mềm hiển thị các vùng hitbox/hurtbox để game thủ luyện tập.

Tuy nhiên, không phải tất cả đều dùng AABB. Series Super Smash Bros. của Nintendo lại áp dụng hình tròn và hình capsule - cấu trúc mô phỏng cơ thể người tốt hơn. Cách xử lý va chạm giữa vũ khí (clanging) hay phản đòn (rebound) cũng thú vị hơn, nhất là khi xét đến hiệu ứng “startup lag” (độ trễ khởi động chiêu) hay “hit lag” (cứng đờ khi trúng đòn). Các trận đấu dùng vũ khí thường phân cấp sát thương theo vị trí - ví dụ: lưỡi kiếm gây thiệt hại lớn hơn phần chuôi, thông qua việc xếp chồng nhiều hurtbox với độ ưu tiên khác nhau.

Đặc trưng của game bắn súng FPS

Thể loại này hoàn toàn khác biệt. Về bản chất, FPS vận hành trên nền tảng 3D logic, sử dụng cơ chế “đạn bay” để gây sát thương điểm. Do đó, hệ thống hitbox thường là các hình hộp chữ nhật (cuboid) gắn vào xương nhân vật trong hệ thống xương hoạt ảnh (skeletal animation).

Khi xử lý va chạm, quỹ đạo viên đạn được xấp xỉ thành đoạn thẳng giữa 2 khung hình liên tiếp. Bài toán quy về xác định giao điểm giữa đoạn thẳng này với các cuboid trên cơ thể kẻ địch. Trong các phiên bản đầu tiên như Quake 3, AABB vẫn được dùng để giảm tải tính toán - thời điểm đó game còn dùng frame animation thay skeletal animation.

Hiện nay, CS:GO đã nâng cấp lên capsule (hình trụ tròn 2 đầu) vì vừa ôm sát cơ thể nhân vật, vừa tối ưu tính toán. Ví dụ: vùng hitbox đầu được mô phỏng bằng quả cầu, trong khi chi dưới thì dùng capsule để bao quanh chân.

Bài toán đặc biệt trong Monster Hunter

Series này tạo nên sự kết hợp tinh tế giữa nhiều yếu tố. Về mặt hitbox, cách gắn vùng chịu đòn vào hệ thống xương quái vật tương tự như FPS. Tuy nhiên, hệ thống vũ khí lại có tính chất của game đối kháng. Điều này đặt ra thách thức với hệ thống phát hiện va chạm 3D.

Theo tôi nghiên cứu, giải pháp tối ưu là dùng hình tứ giác trong không gian 3 chiều để mô tả hurtbox. Ví dụ: với thanh đại đao, ở từng khung hình đòn đánh, lập trình viên sẽ xác định mặt phẳng cắt theo hướng chém (ngang, dọc hay chéo). Mặt phẳng này được tạo ra dựa trên vị trí vũ khí ở khung hình hiện tại và khung hình trước. Trên mặt phẳng này, designer sẽ vẽ 1-2 hình chữ nhật xác định vùng sát thương. Khi kiểm tra va chạm, hệ thống sẽ tính giao điểm giữa các tứ giác (hurtbox) với cuboid/capsule (hitbox) trên người quái vật.

Đối với vũ khí có thể tích như búa, có thể dùng 2-3 hình chữ nhật song song để mô phỏng độ dày. Điều này giải thích vì sao đòn búa trong Monster Hunter luôn cho cảm giác “phủ đầu” đối thủ.

Tại sao không dùng vật lý engine thuần túy?

Việc tích hợp engine vật lý (như PhysX hay Havok) dù chính xác nhưng sẽ gây lãng phí tài nguyên, đặc biệt với các chuyển động liên tục. Hơn nữa, game hành động cần quy tắc va chạm đơn giản, dễ hiểu để người chơi nắm bắt. Thay vào đó, studio nên đầu tư vào công cụ thiết kế chuyên dụng, cho phép designer trực quan hóa và điều chỉnh các vùng hurtbox trong từng animation. Đây sẽ là khâu chiếm nhiều thời gian nhất trong quá trình phát triển công cụ game.

0%