Đây là một bài đăng có liên kết đến các bài báo về các loại mô phỏng tương tự (trong bối cảnh kỹ thuật / học thuật thay vì cho các trò chơi): https://gamedev.stackexchange.com/a/10350/6398
Tôi đã thử ít nhất hai cách tiếp cận khác nhau để phát hiện va chạm + phản ứng cho loại mô phỏng "dây" này (như đã thấy trong trò chơi Umihara Kawase); ít nhất, tôi nghĩ rằng đây là những gì bạn đang theo đuổi - dường như không có một thuật ngữ cụ thể nào cho loại mô phỏng này, tôi chỉ có xu hướng gọi nó là "dây" chứ không phải là "dây" coi "sợi dây" đồng nghĩa với "một chuỗi hạt". Và, nếu bạn muốn hành vi dính của dây ninja (tức là nó có thể đẩy VÀ kéo), thì đây giống như một sợi dây cứng hơn là một sợi dây. Dù sao..
Câu trả lời của Pekuja là tốt, bạn có thể thực hiện phát hiện va chạm liên tục bằng cách giải quyết trong thời gian khi diện tích đã ký của ba điểm là 0.
(Tôi không thể nhớ lại hoàn toàn OTOH nhưng bạn có thể tiếp cận nó như sau: tìm thời điểm t khi điểm a được chứa trong dòng đi qua b, c, (Tôi nghĩ rằng tôi đã làm điều này bằng cách giải quyết khi dấu chấm (ab, cb) = 0 để tìm giá trị của t) và sau đó đưa ra thời gian hợp lệ 0 <= t <1, tìm vị trí tham số s của a trên đoạn bc, tức là a = (1-s) b + s c và nếu a nằm giữa b và c (tức là nếu 0 <= s <= 1) thì đó là một xung đột hợp lệ.
AFAICR bạn cũng có thể tiếp cận nó theo cách khác (nghĩa là giải quyết cho s và sau đó cắm cái này vào để tìm t) nhưng nó ít trực quan hơn nhiều. (Tôi xin lỗi nếu điều này không có ý nghĩa gì, tôi không có thời gian để tìm hiểu các ghi chú của mình và đã vài năm rồi!))
Vì vậy, bây giờ bạn có thể tính toán tất cả các lần xảy ra sự kiện (nghĩa là các nút dây phải được chèn hoặc loại bỏ); xử lý sự kiện sớm nhất (chèn hoặc loại bỏ một nút) và sau đó lặp lại / lặp lại cho đến khi không còn sự kiện nào nữa giữa t = 0 và t = 1.
Một cảnh báo về cách tiếp cận này: nếu các vật mà sợi dây có thể quấn quanh là động (đặc biệt là nếu bạn mô phỏng chúng VÀ tác động của chúng lên sợi dây và ngược lại) thì có thể có vấn đề nếu các vật đó kẹp / đi qua từng vật khác - dây có thể bị rối. Và chắc chắn sẽ rất khó khăn để ngăn chặn loại tương tác / chuyển động này (các góc của các vật thể trượt qua nhau) trong một mô phỏng vật lý kiểu box2d .. một lượng nhỏ sự xâm nhập giữa các vật thể là hành vi bình thường trong bối cảnh đó.
(Ít nhất .. đây là một vấn đề với một trong những triển khai "dây" của tôi.)
Một giải pháp khác, ổn định hơn nhiều nhưng lại bỏ lỡ một số va chạm trong một số điều kiện nhất định là chỉ sử dụng các thử nghiệm tĩnh (nghĩa là không lo lắng về việc đặt hàng theo thời gian, chỉ cần chia nhỏ đệ quy từng phân đoạn khi bạn tìm thấy chúng), có thể mạnh mẽ hơn nhiều - dây sẽ không bị rối ở các góc và một lượng nhỏ xuyên thấu sẽ ổn.
Tôi nghĩ cách tiếp cận của Pekuja cũng hiệu quả với điều này, tuy nhiên có những cách tiếp cận khác. Một cách tiếp cận tôi đã sử dụng là thêm dữ liệu va chạm phụ trợ: tại mỗi đỉnh lồi v trên thế giới (nghĩa là các góc của hình dạng mà sợi dây có thể quấn quanh), thêm một điểm u tạo thành đường thẳng uv hướng, trong đó bạn là một số điểm "bên trong góc" (tức là bên trong thế giới, "phía sau" v; để tính u bạn có thể chiếu một tia vào trong từ v dọc theo nội suy của nó và dừng một khoảng cách sau v hoặc trước khi tia giao nhau với một cạnh của thế giới và thoát khỏi vùng rắn. Hoặc, bạn chỉ có thể vẽ thủ công các phân đoạn vào thế giới bằng cách sử dụng công cụ trực quan / trình chỉnh sửa cấp độ).
Dù sao, bây giờ bạn có một bộ uv "góc đường"; đối với mỗi uv và từng đoạn ab trong dây, kiểm tra xem ab và uv có giao nhau không (ví dụ: truy vấn giao nhau đường tĩnh, boolean lineseg-lineseg); nếu vậy, hãy lặp lại (tách đường thẳng ab thành av và vb, tức là chèn v), ghi lại hướng nào của sợi dây uốn tại v. Sau đó, cho mỗi cặp đường lân cận ab, bc trong dây, kiểm tra xem hướng uốn hiện tại tại b giống như khi b được tạo ra (tất cả các bài kiểm tra "hướng uốn cong" này chỉ là các bài kiểm tra khu vực đã ký); nếu không, hợp nhất hai phân đoạn thành ac (tức là loại bỏ b).
Hoặc có thể tôi đã hợp nhất và sau đó chia tách, tôi quên - nhưng nó chắc chắn hoạt động trong ít nhất một trong hai đơn đặt hàng có thể! :)
Với tất cả các phân đoạn dây được tính cho khung hiện tại, sau đó bạn có thể mô phỏng giới hạn khoảng cách giữa hai điểm cuối dây (và thậm chí bạn có thể liên quan đến các điểm bên trong, tức là các điểm tiếp xúc giữa dây và thế giới, nhưng liên quan nhiều hơn một chút ).
Dù sao, hy vọng điều này sẽ được sử dụng ... các bài viết trong bài tôi liên kết cũng sẽ cung cấp cho bạn một số ý tưởng.