Làm thế nào để giải quyết va chạm của các hình dạng ghép bằng SAT?


16

SAT là một cách tốt để xác định va chạm giữa các đa giác lồi tùy ý. Thậm chí bạn sẽ có được vector cần thiết để giải quyết va chạm.

Để giải quyết các va chạm giữa các hình dạng phức tạp (không lồi), tôi đã suy nghĩ về một loại hình dạng hợp chất bao gồm một số đa giác lồi. Nếu va chạm xảy ra trong pha rộng (ví dụ: vòng tròn so với vòng tròn hoặc AABB so với AABB), sự va chạm sẽ được giải quyết bằng cách kiểm tra từng đa giác trong hình dạng hỗn hợp so với từng đa giác trong hình dạng hợp chất khác.

Tôi tự hỏi cách tốt nhất để thực sự tách các đối tượng mặc dù? Một cách tiếp cận ngây thơ sẽ là chỉ cần lấy vectơ với cường độ cao nhất và sử dụng nó để phân tách. Trong hình sau, đây sẽ là V 2

Ví dụ SAT 1

Tuy nhiên, nếu các vectơ phân tách chỉ vào các hướng khác nhau, sự va chạm có thể được giải quyết ngay lập tức và có thể yêu cầu một số lần lặp. Vì vậy, trong bức ảnh tiếp theo, chúng tôi sẽ phân tách bằng V 1 và trong lần lặp khác của V 2 (hoặc một cái gì đó gần với V 2 , vì hình dạng sẽ di chuyển theo số lượng V 1 ).

Ví dụ SAT 2

Cách tiếp cận này sẽ thất bại với việc tách các vectơ chỉ vào hướng ngược lại với nhau hoặc trong trường hợp như trong hình sau:

Ví dụ SAT 3

Ở đây chúng ta sẽ lặp đi lặp lại vô tận giữa trạng thái bên trái và trạng thái bên phải.

Vì vậy, để đặt một câu hỏi thực tế ở đây: cách tiếp cận hợp lý cho vấn đề này là gì? Tôi đoán sử dụng đa giác hỗn hợp cho các hình dạng phức tạp là một ý tưởng hợp lý nhưng tôi thực sự tự hỏi làm thế nào để giải quyết va chạm trong trường hợp đó? Làm cách nào để phát hiện ngõ cụt như trong hình thứ ba?


Bạn có thể làm rõ những gì bạn muốn sử dụng vector cho?
Sẽ

@ Will Các vectơ nên được sử dụng để giải quyết va chạm, để các hình dạng không còn chồng chéo. Vì vậy, tôi có thể di chuyển đối tượng màu vàng bằng vectơ kết quả và hai đối tượng sẽ không còn va chạm.
bummzack

Câu trả lời:


7

Tôi nghĩ rằng bạn có thể đang cố gắn một phím vuông vào một lỗ tròn bằng cách áp dụng SAT theo cách của bạn, ở đây. Rõ ràng, nó không được thiết kế cho các va chạm lõm, và mặc dù tôi khen ngợi nỗ lực của bạn để điều chỉnh nó cho mục đích đó, có những cân nhắc khiến điều này khó có thể hoạt động.

Chủ nghĩa hiện thực

Góc xung và hiệu ứng kích thích là tên của trò chơi ở đây.

Thứ tự của các điểm tiếp xúc rất quan trọng đối với độ phân giải va chạm thực tế. Trong thế giới thực, một trong những điểm đó sẽ luôn tấn công trước một điểm khác. Và chỉ khi mô phỏng thứ tự liên hệ đó và kết quả của từng "phân nhóm" được đại diện bởi điều đó, bạn có thể mong đợi nhận được kết quả thực tế trong mô phỏng. Đây là một trong những lý do tại sao bạn phá vỡ phần lõm của mình thành lồi, ngay từ đầu - nó cho phép phát hiện từng phần của phần nào đã xảy ra trước. Tất nhiên, điều này cũng có thể được mô phỏng theo nhận xét của tôi dưới tiêu đề "Ít hiện thực".

Đồ đạc lồi của bạn kết hợp để cung cấp cho đối tượng cả phác thảo và tâm của nó (và tất nhiên trong các mô phỏng phức tạp hơn, mỗi vật cố cũng có thể ảnh hưởng đến mật độ khác nhau). Lý do tôi đề cập đến điều này là vì trong việc giải quyết các va chạm một cách thực tế, bạn sẽ phải tính toán không chỉ xung tuyến tính mà còn cả xung góc, sau mỗi "va chạm phụ" của các điểm tiếp xúc của bạn. Nó không đơn giản như "đẩy xa" cơ bản mà bạn áp dụng với SAT.

Điều này sau đó thay đổi hoàn toàn bản chất của vấn đề của bạn, bởi vì như bạn có thể thấy, việc sử dụng 2 điểm liên lạc trở lên là vô nghĩa , bởi vì thực sự đó chỉ là vấn đề đầu tiên. Khi bạn đã giải quyết được đầu tiên về xung lực tuyến tính và góc, bạn sẽ cần tính toán lại cho các va chạm tiếp theo, bởi vì các hướng của từng đối tượng sẽ thay đổi. Ngoài ra, việc phát hiện từng liên hệ riêng lẻ trong bước sau đó có thể hoặc không cần phải được thực hiện trong cùng bước đó - tùy thuộc vào thời gian giữa các liên hệ khi điểm tiếp xúc đầu tiên của đối tượng chạm vào, xung lực tuyến tính và góc tiếp theo được áp dụng, lần thứ hai điểm tiếp xúc chạm, và như vậy.

Ít hiện thực

Tất nhiên, giả sử bạn hoàn toàn không quan tâm đến việc giải quyết xung lực góc cạnh, thì điều tốt nhất bạn có thể làm với SAT về cơ bản chính xác là những gì bạn sẽ làm nếu bạn bọc các đa giác này bằng cách sử dụng một cái gì đó như Quét của Graham: Đẩy ra bằng cách tách rời vectơ. Nói cách khác, thật vô nghĩa khi cố gắng giải quyết ba vectơ song song, như bạn đã chứng minh. Đó là lớn nhất trong số đó.

EDIT để trả lời câu hỏi của bạn

Những gì bạn cần làm nếu bạn muốn một cách tiếp cận đơn giản như sau:

  • Xác định hướng dịch chuyển chính xác . Điều này được thực hiện dễ dàng nhất bằng cách lồi từng cái và xác định các giá trị chuẩn cho trục tách.

  • Bây giờ bạn cần xác định cường độ dịch chuyển . Tại sao chúng ta không thể sử dụng cường độ như được đưa ra bởi SAT? Bởi vì nếu bạn nghĩ về nó, độ sâu xen kẽ sẽ có khả năng lớn hơn đối với thân lồi, hơn là đối với thân tàu lõm phù hợp của chúng - hãy nghĩ về hai chữ E với răng của chúng! Như bạn đã làm ở trên, tìm tất cả các điểm tiếp xúc cho một bước nhất định, nhưng tìm chúng song song với các quy tắc trục, bởi vì đây là hướng dịch chuyển chính xác. Bây giờ xác định một trong những vectơ chồng chéo song song này là dài nhất. Từ bỏ cái đó, loại bỏ phần còn lại và chuyển sang bước vật lý tiếp theo.


Tôi nghĩ rằng tôi thấy những gì bạn có ý nghĩa. Vì vậy, trong kịch bản "ít hiện thực", tôi sẽ không đánh giá các vectơ (ngắn nhất) do SAT đưa ra cho các đa giác riêng lẻ nhưng tôi cũng sẽ phải xem xét các lớp phủ khác (lớn hơn) và trong trường hợp xấu nhất sử dụng vỏ lồi?
bummzack

Xem (mới nhất) chỉnh sửa.
Kỹ sư
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.