Xác định xem có nên gửi hai đối tượng chuyển động nhanh để kiểm tra va chạm không


8

Tôi có một công cụ vật lý 2D cơ bản đang chạy. Nó khá giống một động cơ hạt, chỉ sử dụng các hình dạng cơ bản như AABB và vòng tròn, do đó không thể quay được. Tôi đã triển khai CCD có thể cung cấp TOI chính xác cho hai đối tượng chuyển động nhanh và mọi thứ đều hoạt động trơn tru.

Vấn đề của tôi bây giờ là tôi không thể tìm ra cách xác định liệu hai vật thể chuyển động nhanh thậm chí có nên được kiểm tra với nhau ngay từ đầu không. Tôi đang sử dụng một cây quad để phân vùng không gian và cho mỗi đối tượng chuyển động nhanh, tôi kiểm tra nó dựa vào các đối tượng trong mỗi ô mà nó đi qua. Điều này hoạt động tốt để xác định va chạm với hình học tĩnh, nhưng điều đó có nghĩa là bất kỳ đối tượng chuyển động nhanh nào khác có thể va chạm với nó, nhưng không có trong bất kỳ ô nào được kiểm tra, sẽ không bao giờ được xem xét.

Giải pháp duy nhất cho vấn đề này tôi có thể nghĩ đến là hoặc có các ô đủ lớn và bắt chéo ngón tay là đủ, hoặc thực hiện một số loại thuật toán vũ phu. Có một cách thích hợp để đối phó với điều này, có thể ai đó đã giải quyết vấn đề này một cách hiệu quả. Hoặc có thể có một cách tốt hơn để phân vùng không gian chiếm tài khoản này?

Đây là một sơ đồ:

nhập mô tả hình ảnh ở đây

"Khu vực ảnh hưởng" của đối tượng A và B, chúng nên được kiểm tra với nhau. Nhưng với cách tôi hiện đang kiểm tra va chạm không tính đến điều này. Một lần nữa, tôi có thể nghĩ ra một vài giải pháp cho vấn đề này như thực sự kiểm tra xem đường đi của các đối tượng có vượt qua một khi vận tốc của chúng cao hơn x, hoặc một cái gì đó, nhưng cảm giác đó giống như một vụ hack và đó là một mớ hỗn độn để thử và thực hiện.


Bạn có thể đưa ra một kịch bản ví dụ trong đó phương pháp của bạn thất bại?
Anko

1
Tôi nghĩ nó sẽ như thế này: đối tượng A và B nằm trong cấu hình này: [A] [] [B]. A đang đi phải và B trái. Họ đi nhanh. Việc kiểm tra va chạm diễn ra như sau: ô tiếp theo có trống cho A không? Vâng, bcs không có gì trong tế bào giữa. Là ô tiếp theo trống cho B? Đúng. Vì vậy, không có va chạm. Nhưng vật lý thực tế sẽ chỉ ra rằng A và B có khả năng va chạm (đặc biệt là trong trò chơi một chiều này tôi giải mã;)
Cystack

@Cystack Tôi đã thực hiện CCD. Tình huống bạn mô tả không phải là một vấn đề. Hai đối tượng đang đi thẳng vào nhau, việc thực hiện mà tôi mô tả sẽ chọn điều đó và giải quyết nó.
dreta

Các vật lý của tình hình là rõ ràng. Hãy để chúng tôi nói rằng bạn có thể xác định một đối tượng là 'di chuyển nhanh' trước thời hạn. Sau đó, khi bạn thực hiện kiểm tra va chạm, bạn cần kiểm tra không chỉ đối với ô mà đối tượng hiện đang ở, mà tất cả các ô mà nó đã chuyển qua ở bước cuối cùng. Vì vậy, mỗi đối tượng chuyển động nhanh thực sự có nhiều vị trí, giống như toàn bộ dải màu xanh lá cây bạn đã vẽ trong hình trên.
theJollySin

@theJollySin tôi đã mô tả giải pháp bạn đưa ra, đó là một vụ hack, một trường hợp đặc biệt, tôi đang tìm kiếm một giải pháp chung nếu có.
dreta

Câu trả lời:


5

Vấn đề bạn đang nói đến thường được gọi là 'phát hiện va chạm broadphase' và giải pháp của bạn là 'âm lượng quét', không thực sự là hack, chỉ là cách thực hiện (chỉ cần lấy AABB của đối tượng bao gồm cả bắt đầu và kết thúc chuyển động và sử dụng điều đó cho va chạm - mặc dù mọi thứ có một chút khó khăn với các vòng quay).

Sau đó, thuật toán phát hiện va chạm broadphase giúp thực hiện nhanh này được gọi là 'Quét và Prune'.


Tôi đã loại bỏ SAP trước khi vấn đề này phát sinh. Tôi đang làm điều này trong JavaScript, điều này làm cho chi phí cho các danh sách đáng chú ý, các mảng cũng có thể không đáng tin cậy khi nói đến hiệu suất. Đoán tôi sẽ phải xem xét lại mọi thứ. Cảm ơn, thuật toán thực sự giải quyết vấn đề.
dreta
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.