Saya telah mencoba beberapa fisika tali baru-baru ini, dan saya telah menemukan bahwa solusi "standar" - membuat tali dari serangkaian benda yang diikat bersama dengan pegas atau sambungan - tidak memuaskan. Terutama ketika tali ayun relevan dengan gameplay. Saya tidak terlalu peduli tentang kemampuan tali untuk membungkus atau melorot (ini bisa dipalsukan untuk visual).
Untuk gameplay, yang penting adalah kemampuan tali untuk membungkus lingkungan dan kemudian membuka bungkusnya. Bahkan tidak harus berperilaku seperti tali - sebuah "kawat" yang terdiri dari segmen garis lurus bisa digunakan. Inilah ilustrasi:
Ini sangat mirip dengan "Ninja Rope" dari game Worms.
Karena saya menggunakan mesin fisika 2D - lingkungan saya terdiri dari poligon cembung 2D. (Khususnya saya menggunakan SAT di Farseer.)
Jadi pertanyaan saya adalah ini: Bagaimana Anda menerapkan efek "pembungkus"?
Tampaknya cukup jelas bahwa kawat akan terdiri dari serangkaian segmen garis yang "terpecah" dan "bergabung". Dan segmen terakhir (aktif) dari garis itu, di mana objek bergerak menempel, akan menjadi sambungan dengan panjang tetap.
Tapi apa matematika / algoritma yang terlibat untuk menentukan kapan dan di mana segmen garis aktif perlu dibagi? Dan kapan harus bergabung dengan segmen sebelumnya?
(Sebelumnya pertanyaan ini juga bertanya tentang melakukan ini untuk lingkungan yang dinamis - Saya telah memutuskan untuk memecahnya menjadi pertanyaan lain.)
sumber
Sudah lama sejak saya bermain Worms, tetapi dari apa yang saya ingat - ketika tali membungkus sesuatu, hanya ada satu bagian (lurus) dari tali yang bergerak pada satu waktu. Sisa tali menjadi statis
Jadi sangat sedikit fisika aktual yang terlibat. Bagian aktif dapat dimodelkan sebagai pegas kaku tunggal dengan massa di ujungnya
Bit yang menarik adalah logika untuk memisahkan / menyambung bagian tali yang tidak aktif ke / dari bagian aktif.
Saya membayangkan akan ada 2 operasi utama:
'Split' - Tali telah memotong sesuatu. Membaginya di persimpangan menjadi bagian tidak aktif dan bagian baru, lebih pendek, aktif
'Bergabung' - Tali aktif telah pindah ke posisi di mana persimpangan terdekat tidak ada lagi (ini mungkin hanya tes produk sudut / titik sederhana?). Bergabung kembali 2 bagian, membuat bagian baru, lebih lama, aktif
Dalam adegan yang dibangun dari poligon 2D, semua titik perpecahan harus berada pada titik pada jala tabrakan. Deteksi tabrakan dapat disederhanakan menjadi sesuatu di sepanjang garis 'Jika tali melewati titik pada pembaruan ini, terbelah / bergabung dengan tali di titik itu?
sumber
Lihatlah bagaimana tali ninja di Gusanos diimplementasikan:
Kutipan yang relevan dari ninjarope.cpp :
sumber
Saya khawatir saya tidak bisa memberi Anda algoritma konkret dari atas kepala saya, tetapi terpikir oleh saya bahwa hanya ada dua hal yang penting untuk mendeteksi tabrakan untuk tali ninja: setiap dan semua berpotensi bertabrakan simpul pada hambatan dalam radius "split" terakhir yang sama dengan panjang segmen yang tersisa; dan arah ayunan saat ini (searah atau berlawanan arah jarum jam). Jika Anda membuat daftar sementara sudut dari "split" vertex ke masing-masing simpul terdekat, algoritma Anda hanya perlu peduli jika segmen Anda akan berayun melewati sudut itu untuk setiap titik yang diberikan. Jika ya, maka Anda perlu melakukan operasi split, yang mudah seperti pie - Ini hanya garis dari vertex split terakhir ke split baru, dan kemudian sisa baru dihitung.
Saya pikir hanya masalah simpul. Jika Anda dalam bahaya menabrak segmen antara simpul pada rintangan, maka deteksi tabrakan normal Anda untuk orang yang tergantung di ujung tali harus masuk. Dengan kata lain, tali Anda hanya akan "tersangkut" pada sudutnya, jadi segmen antara tidak akan masalah.
Maaf saya tidak punya sesuatu yang konkret, tapi mudah-mudahan itu membuat Anda di tempat yang Anda butuhkan, secara konseptual, untuk mewujudkan hal ini. :)
sumber
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.
sumber
Salah satu pendekatan untuk ini adalah memodelkan tali sebagai partikel yang dapat di collidable, dihubungkan oleh pegas. (Yang cukup kaku, bahkan mungkin hanya sebagai tulang saja). Partikel-partikel bertabrakan dengan lingkungan, memastikan tali membungkus barang-barang.
Berikut ini adalah demo dengan sumber: http://www.ewjordan.com/rgbDemo/
(Pindah ke kanan di tingkat pertama, ada tali merah yang dapat berinteraksi dengan Anda)
sumber