Làm cách nào để triển khai phát hiện va chạm 2D nhanh, chính xác?


11

Tôi nhận thức rõ về cách phát hiện nếu hai hoặc nhiều vật thể 2D va chạm nhưng tôi quan tâm đến cách quyết định có nên kiểm tra va chạm hay không. Trong các dự án trước đây, tôi chỉ có mọi đối tượng kiểm tra đối với mọi đối tượng khác (tôi biết, mức độ ngu ngốc của O (n ^ 2)) và nó tạo ra một trò chơi ít hơn chất lỏng.

Các diễn đàn khác nhau ca ngợi sự tuyệt vời của Quadtrees, B-Plants và bất kỳ loại cây hoặc cấu trúc nào khác mà bạn có thể nghĩ đến.

Cấu trúc hiệu quả nhất để xác định xem có nên kiểm tra va chạm không?


1
Một điều bạn có thể muốn xem xét là chỉ kiểm tra va chạm cho các đối tượng đã di chuyển và chỉ các đối tượng gần gũi với bạn. Hệ thống hiện tại của tôi hoạt động tốt (hàng trăm ngàn đối tượng) - và đó là tất cả những gì tôi đang làm.
ultifinitus

Tôi nghĩ gamedev.stackexchange.com/questions/14369/ mài có thể giúp bạn rất nhiều. ban đầu nó có nghĩa là và thuật toán để xử lý song song nhưng tôi nghĩ thuật toán tương tự cũng có thể cải thiện các ứng dụng luồng đơn.
Ali1S 232

1
@ultifinitus Đó chính là những gì tôi đang hỏi về. Làm cách nào để xác định đối tượng nào ở gần mà không lặp qua mọi đối tượng và kiểm tra vị trí của nó?
Mike Cluck

Mike, bạn có thể gửi email cho tôi một số mã cụ thể mà tôi đã sử dụng, đó là trong c ++ - hoặc tôi có thể cung cấp cho bạn cấu trúc cơ bản, mặc dù nó có thể trở nên khá mơ hồ và phức tạp vì điều đó.
ultifinitus

1
Nó không phải là một bản sao bởi vì tôi đã hỏi loại cấu trúc nào phù hợp nhất để xác định xem chúng ta có nên kiểm tra va chạm hay không. Đó là câu hỏi khác được hỏi về va chạm trong suốt so với không minh bạch. Chưa kể, câu hỏi này đã được hỏi khoảng một năm trước khi bạn liên kết.
Mike Cluck

Câu trả lời:


12

Đối với trò chơi 2ngày, trừ khi các đối tượng 2D có phân phối rất nặng cho một bên trên bản đồ của bạn, lưới đồng nhất hầu như luôn luôn là hướng đi. Độ phức tạp của bộ nhớ là thẳng về phía trước, (tỷ lệ với kích thước của bản đồ của bạn) và với phân phối hợp lý, có thời gian tra cứu O (1) và trung bình của nhật ký (numberOfObjects / (hàng * cột)) ^ 2 bài kiểm tra giao nhau thực hiện trên mỗi tế bào. Bạn có thể quyết định chỉ kiểm tra các ô có đối tượng di chuyển trong đó, điều này làm cho hình học tĩnh hiệu quả hơn nhiều. Thật dễ dàng để sửa đổi một lưới thống nhất khi đang bay, (ít đau hơn so với các giải pháp dựa trên cây) và việc thực hiện đơn giản hơn. Lần duy nhất tôi sẽ nói không sử dụng nó trong trò chơi 2D là khi các yêu cầu về bộ nhớ của lưới đồng nhất trở nên quá lớn, (giả sử một sim không gian nơi các cấp độ thưa thớt nhưng rất lớn).


Làm thế nào để giải pháp này đối phó với các đối tượng giáp 2 hoặc 4 ô lưới?
tro999

1
Bất kỳ ô nào đối tượng chồng lấp, nó được coi là nằm trong, vì vậy một đối tượng có thể nằm trong nhiều ô. Hầu hết các cấu trúc dữ liệu không gian sẽ giải quyết vấn đề chồng chéo theo cách tương tự.
Darcy Rayner

Wow, thật là thông minh. +1 Chúc mừng anh chàng.
tro999


1

Nếu thế giới của bạn có một chiều rất "dài" (gọi là X), so với các thế giới khác, bạn có thể giữ các đối tượng trong một danh sách theo thứ tự mà bạn có thể sắp xếp lại khi chúng di chuyển, và sau đó phát hiện va chạm có nghĩa là chỉ kiểm tra các đối tượng chồng chéo trong trục X.

Một khả năng khác là giữ danh sách các đối tượng chủ động / thụ động và không bận tâm đến các đối tượng thụ động (hoàn toàn không di chuyển).

Nếu chúng đều là những vật thể có kích thước trung bình mà người chơi có thể nhìn thấy trên màn hình, mọi thứ so với mọi thứ có lẽ không quá tệ.

Ngoài ra, tôi với Darcy, lưới đồng phục là tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.