Berikut adalah pos yang memiliki tautan ke makalah tentang jenis simulasi serupa (dalam konteks teknik / akademik alih-alih untuk game): https://gamedev.stackexchange.com/a/10350/6398
Saya telah mencoba setidaknya dua pendekatan berbeda untuk deteksi tumbukan + respons untuk simulasi "kawat" semacam ini (seperti yang terlihat dalam game Umihara Kawase); setidaknya, saya pikir inilah yang Anda cari - sepertinya tidak ada istilah khusus untuk simulasi semacam ini, saya hanya cenderung menyebutnya "kawat" daripada "tali" karena sepertinya kebanyakan orang anggap "tali" identik dengan "rantai partikel". Dan, jika Anda ingin perilaku tongkat-ish dari tali ninja (yaitu dapat mendorong DAN menarik), ini lebih seperti kawat kaku daripada tali. Bagaimanapun..
Jawaban Pekuja baik, Anda dapat menerapkan deteksi tabrakan berkelanjutan dengan memecahkan waktu ketika area yang ditandatangani dari tiga poin adalah 0.
(Saya tidak dapat sepenuhnya mengingat OTOH tetapi Anda dapat mendekatinya sebagai berikut: temukan waktu t ketika titik a terkandung dalam garis yang melewati b, c, (saya pikir saya melakukan ini dengan menyelesaikan ketika titik (ab, cb) = 0 untuk menemukan nilai t), dan kemudian diberi waktu yang valid 0 <= t <1, cari posisi parametrik s pada segmen bc, yaitu a = (1-s) b + s c dan jika a berada di antara b dan c (yaitu jika 0 <= s <= 1) itu adalah tabrakan yang valid.
AFAICR Anda juga dapat mendekatinya (mis. Selesaikan untuk s dan kemudian tancapkan ini untuk menemukan t) tetapi itu jauh kurang intuitif. (Maaf jika ini tidak masuk akal, saya tidak punya waktu untuk menggali catatan saya dan sudah beberapa tahun!))
Jadi, Anda sekarang dapat menghitung semua waktu di mana peristiwa terjadi (yaitu simpul tali harus dimasukkan atau dihapus); proses peristiwa paling awal (masukkan atau hapus simpul) dan kemudian ulangi / kambuh sampai tidak ada lagi peristiwa antara t = 0 dan t = 1.
Satu peringatan tentang pendekatan ini: jika benda yang dililitkan tali itu dinamis (terutama jika Anda mensimulasikannya DAN pengaruhnya pada tali, dan sebaliknya) maka akan ada masalah jika benda-benda tersebut menjepit / melewati masing-masing lainnya - kawat bisa kusut. Dan itu pasti akan menjadi tantangan untuk mencegah interaksi / gerakan semacam ini (sudut-sudut objek saling menyelinap) dalam simulasi fisika gaya box2d .. sejumlah kecil penetrasi antara objek adalah perilaku normal dalam konteks itu.
(Setidaknya .. ini adalah masalah dengan salah satu implementasi "kawat" saya.)
Solusi yang berbeda, yang jauh lebih stabil tetapi melewatkan beberapa tabrakan dalam kondisi tertentu adalah dengan hanya menggunakan tes statis (yaitu jangan khawatir tentang pemesanan berdasarkan waktu, hanya membagi secara membagi setiap segmen dalam tabrakan saat Anda menemukannya), yang dapat berupa jauh lebih kuat - kawat tidak akan kusut di sudut dan sedikit penetrasi akan baik-baik saja.
Saya pikir pendekatan Pekuja bekerja untuk ini juga, namun ada pendekatan alternatif. Salah satu pendekatan yang saya gunakan adalah menambahkan data tumbukan bantu: pada setiap titik cembung v di dunia (yaitu sudut-sudut bentuk yang dapat dililit tali), tambahkan titik u membentuk segmen garis diarahkan uv, di mana u adalah beberapa titik "di dalam sudut" (yaitu di dalam dunia, "di belakang" v; untuk menghitung Anda dapat melemparkan sinar ke dalam dari v sepanjang yang diinterpolasi normal dan berhenti agak jauh setelah v atau sebelum sinar berpotongan dengan tepi dunia dan keluar dari wilayah padat. Atau, Anda bisa secara manual mengecat segmen ke dunia menggunakan alat visual / editor level).
Lagi pula, Anda sekarang memiliki satu set "corner linesegs" uv; untuk setiap uv, dan setiap segmen ab dalam kawat, periksa apakah ab dan uv berpotongan (yaitu query persimpangan interseg-lineseg garis statis boolean); jika demikian, ulangi (pisahkan garis-garis ab ke dalam av dan vb, yaitu masukkan v), catat ke arah mana tali ditekuk pada v. Kemudian untuk setiap pasangan garis-garis tetangga ab, bc dalam kawat, uji apakah arah tikungan arus pada sama dengan ketika b dihasilkan (semua tes "arah belokan" ini hanya uji area yang ditandatangani); jika tidak, gabungkan kedua segmen menjadi ac (mis. hapus b).
Atau mungkin saya bergabung dan kemudian berpisah, saya lupa - tetapi itu pasti bekerja di setidaknya satu dari dua kemungkinan pesanan! :)
Mengingat semua segmen kawat yang dihitung untuk kerangka saat ini, Anda kemudian dapat mensimulasikan batasan jarak antara dua titik akhir kawat (dan Anda bahkan dapat melibatkan titik-titik interior, yaitu titik kontak antara kawat dan dunia, tetapi itu sedikit lebih terlibat) ).
Ngomong-ngomong, semoga ini akan bermanfaat ... makalah di posting yang saya tautkan juga harus memberi Anda beberapa ide.