Saya tahu benar cara memeriksa tabrakan, tetapi saya tidak tahu cara menangani tabrakan dengan cara yang baik.
Sederhana, jika dua benda bertabrakan, saya menggunakan beberapa perhitungan untuk mengubah arah kecepatan. Jika saya tidak memindahkan dua objek, mereka masih akan tumpang tindih dan jika kecepatannya tidak cukup besar mereka masih akan bertabrakan setelah pembaruan berikutnya. Hal ini dapat menyebabkan benda saling macet.
Tetapi bagaimana jika saya mencoba memindahkan kedua benda tersebut agar tidak tumpang tindih. Ini kedengarannya ide yang bagus tetapi saya menyadari bahwa jika ada lebih dari dua objek ini menjadi sangat rumit. Bagaimana jika saya memindahkan dua benda dan salah satunya bertabrakan dengan benda lain jadi saya harus memindahkannya juga dan mereka mungkin bertabrakan dengan dinding dll.
Saya memiliki permainan 2D top-down dalam pikiran tetapi saya tidak berpikir itu banyak hubungannya dengan itu. Bagaimana biasanya tabrakan ditangani?
Pertanyaan ini diajukan atas nama Wooh
sumber
Jawaban:
Daniel Kodicek membahas topik ini dengan sangat rinci dalam bukunya, Matematika & Fisika untuk Programer .
Kodicek melakukan dua hal untuk mencapai resolusi tabrakan yang terlihat alami:
Saya mengunggah demo berdasarkan deteksi dan resolusi tabrakan Kodicek .
pembaruan: Berikut ini adalah algoritme deteksi & resolusi tabrakan yang sangat mirip dengan metode Kodicek. Dengan kode sumber . Saya masih merekomendasikan buku Kodicek, karena algoritmanya diimplementasikan sedikit berbeda dan jauh lebih dijelaskan.
sumber
Bagaimana jika Anda memeriksa tabrakan sebelum benda bergerak, bukan sesudahnya? Atau, dengan kata lain, Anda menolak posisi baru jika benda bertabrakan, menggunakan kembali yang lama dalam kasus itu?
Kodesemu:
Dengan cara ini objek akan bertabrakan satu sama lain ketika mereka akan bertabrakan , jika langkah pembaruan Anda cukup kecil pemain tidak akan melihat sesuatu yang aneh dalam representasi.
sumber
Setiap kali dua objek tumpang tindih, periksa apakah mereka bergerak ke arah atau menjauh dari satu sama lain. Lakukan tabrakan hanya jika mereka bergerak ke arah satu sama lain.
Cukup mudah dengan matematika vektor, cukup hitung:
dot_product (B.position - A.position, A.velocity - B.velocity)
Jika hasilnya positif, objek bergerak ke arah satu sama lain.
sumber
Saya bisa saja salah paham, tetapi sepertinya Anda mengajukan dua pertanyaan: 1. apa beberapa cara umum untuk menangani resolusi tabrakan istilah yang Anda cari adalah 'simulasi berbasis impuls', dan ada banyak makalah yang bisa melakukannya keadilan yang lebih baik daripada yang saya bisa.
Singkatnya Anda ingin euler langkah simulasi fisika Anda di ruang momentum, yang kecepatan massa kali (jangan melakukan hal-hal berdasarkan kekuatan, integrator Anda tidak melakukannya dengan benar).
Untuk respon sudut, untungnya momen inersia terbesar dan paling kecil dapat selalu direduksi menjadi dua sumbu ortogonal (dalam 2D), yang berarti matriks berlipat akan bekerja secara umum, dan jika Anda mengaitkannya dengan sumbu X dan Y, itu berubah menjadi vektor 2D.
Ketika Anda memiliki tabrakan, Anda mencari tahu respons berdasarkan momen linear dan sudut pada titik tabrakan, dan faktor fudge yang baik adalah, jika Anda memiliki interpenetrasi, untuk menerapkan beberapa kekuatan penalti (seperti yang disebutkan di atas) untuk memisahkan kedua badan.
Dari titik ini Anda akan berakhir menambahkan semakin banyak aturan untuk mengendalikan perilaku menyimpang, seperti membatasi momentum sudut maksimum sehingga hal-hal tidak berputar seperti gasing, dll., Tetapi ini adalah awal yang baik.
Sederhanakan jika Anda bisa.
Satu-satunya cara nyata untuk melakukan ini adalah dengan sistem persamaan linear dan banyak pemecahan. Cara praktis untuk melakukannya adalah memiliki sistem seperti yang di atas, dan memiliki fisika secara alami menyelesaikan dari waktu ke waktu.
Sebagian besar gim yang melakukan hal-hal seperti menggulung, atau berdiri di atas permukaan yang bergerak, memiliki model hibrida di mana kaki Anda melekat pada permukaan (atau roda ke jalan) untuk mengakomodasi loncatan waktu fisika (yang akan menghasilkan siklus respons antarpenetrasi dan tidak akan bekerja).
Semoga ini membantu. Jika Anda membutuhkan contoh matematika, beri tahu saya.
sumber
Cara ini biasanya diselesaikan dalam mesin fisika adalah dengan menerapkan kekuatan penalti. Memindahkan tubuh kaku setelah antar-penetrasi tidak akan terlihat bagus jika tubuh kaku Anda bergerak dengan kecepatan lebih tinggi (Anda akan melihat gerakan menyentak sesaat), meskipun sebagai langkah pertama, Anda harus mencobanya dan melihat apakah itu sesuai dengan kebutuhan Anda.
A
penalty force
diterapkan seperti peredam pegas, di mana gaya pinalti meningkat, semakin banyak Anda melakukan inter-penetrasi pada benda tegar dan berkurang pada bingkai berikutnya. Anggap saja sebagai mata air. Ketika dua benda kaku saling menembus, mereka masing-masing menghadapi pegas tak terlihat yang menghambat perkembangan mereka (yaitu, mencegah lebih banyak antar-penetrasi) dan menerapkan yang disebutkan sebelumnyapenalty force
sampai tubuh tidak lagi menembus.Ini adalah topik yang luas tetapi mudah-mudahan informasi di atas akan membantu Anda memulai.
sumber