Mendapatkan deteksi tabrakan bekerja adalah tujuan pertama yang bagus untuk mesin fisika 2D Anda. Ada baiknya Anda memutuskan bahwa untuk saat ini Anda secara khusus bekerja dalam 2D, karena tidak setiap aturan dalam 2D bekerja dalam 3D, terlepas dari jumlah algoritma terkait n-dimensi, pada titik tertentu Anda harus mengkhususkannya (lakukan lebih varian spesifik seperti bagaimana produk silang hanya memenuhi identitas Jacobi dalam 3D).
Pertanyaan Anda secara inheren tentang arsitektur dan desain kerangka kerja bukan tentang fisika 2D, jadi kekhawatiran tentang apa yang harus dipisahkan oleh bangunan Anda dalam pikiran Anda tentang bagaimana potongan-potongan itu digunakan. Pada dasarnya, Anda perlu memisahkan mentalitas membangun mesin / perpustakaan / kerangka kerja dari penggunaannya di proyek lain.
Menyusun mesin pemecahan:
Dengan mesin matematika apa pun, kami pada dasarnya ingin memasukkan nilai ke dalam beberapa fungsi, dan kami berharap nilai yang keluar akan berguna untuk membuat simulasi yang menarik.
Elemen inti dari proses ini harus seabstrak mungkin, sedangkan elemen atom (bagian / data terkecil yang berguna) harus spesifik untuk keperluan individu dan berguna untuk menyusun bersama. Dalam kasus kami, hampir satu-satunya atom yang berguna adalah vektor 2D, yang seharusnya berupa kelas objek tunggal yang memungkinkan ekspresi struktur (x, y), dan memiliki metode untuk semua operasi matematika dasar yang berguna untuk perhitungan vektor dalam 2D. Penambahan, pengurangan, normalisasi, normal (tegak lurus), produk silang, produk titik, besaran / panjang, dan apa pun yang Anda temui yang secara khusus melekat pada vektor -> operasi vektor atau vektor -> operasi bilangan real. Jika Anda menggunakan bahasa berbasis kelas, sederhana class Vector
dengan masing-masing sebagai fungsi anggota atau kelebihan operator akan sangat baik.
Setelah semua jenis atom dikonstruksi, maka Anda akan menyusun algoritme mereka menjadi lapisan lain di atas jenis atom kami Vector
. Tujuan saya adalah a Line
dan a Curve
. Kami akan memutuskan di sini bahwa a Curve
berada di luar cakupan untuk ini dan memerlukan banyak spesialisasi (konsep yang Anda rujuk di atas sebagai menciptakan banyak fungsi kasus khusus). Dari Vector
saya juga akan menulis Rectangle
sebagai 4 Vector
primitif, menulis Circle
dari vektor menggunakan a Vector
dan a radius
, dan kemudian saya akan menulis Polygon
dari Vector
juga. Polygon
harus dibuat dari Vector
dan bukan di Line
sini karena setiap baris akan berbagi titik duplikat dengan baris terakhir dalam poligon.
Sekarang Anda memiliki bentuk, tetapi kami tidak tahu apa yang harus dilakukan dengan mereka.
Deteksi Tumbukan Deteksi
tumbukan bukan ilmu pasti dan tidak ada satu algoritma sempurna tunggal (atau apa pun). Ada banyak metode yang dapat digunakan untuk mencapai berbagai kualitas efek atau bahkan memiliki akurasi lebih dari yang lain. Pada dasarnya, ini dapat dipisahkan menjadi beberapa tingkat perhatian yang berbeda dan dengan demikian beberapa proses yang berbeda.
Deteksi tabrakan fase luas adalah tindakan membagi area tempat kita peduli tentang apa yang mungkin / bisa / tidak bertabrakan, dan memisahkannya untuk proses fase sempit. Dalam 2D saya biasanya akan merekomendasikan menggunakan pohon quad untuk ini. Untuk itu kita akan membutuhkan yang Rectangle
kita bangun sebelumnya dan untuk menyediakannya dengan deteksi tabrakan AABB. Ini adalah singkatan dari Axis Aligned Bounding Box dan kami akan menggunakannya untuk menentukan bahwa untuk kotak non-rotasi A
yang tidak ada bagian dari kotak B
ada di dalamnya A
. Ini mengikuti dari asumsi bahwa tidak ada bagian dari yang B
bisa ada dalam A
tabrakan itu ada jika mereka berpotongan.
Quad tree adalah proses rekursif di mana Anda menentukan kedalaman maksimum, atau membiarkan kuantitas objek Anda untuk mencegah kedalaman rekursi yang tak terbatas. Ini mengelompokkan benda-benda fisika menjadi 4 wilayah (karena itu namanya) dan harus memungkinkan Anda untuk mengakses setiap quad secara terpisah. Anda kemudian akan masuk ke dalam masing-masing empat paha depan, dan melakukan proses yang sama yang saya tidak akan gariskan di sini untuk singkatnya tetapi tersedia di sini: https://gamedevelopment.tutsplus.com/tutorials/quick-tip-use-quadtrees- untuk mendeteksi kemungkinan tabrakan-di-ruang 2d - gamedev-374
Tabrakan fase sempitadalah proses melalui kelompok bentuk Anda yang telah kami tentukan akan / mungkin / lakukan bertabrakan dan melakukan pemeriksaan tabrakan yang lebih diskrit, pada saat ini, kami mulai peduli apakah benda-benda itu berputar atau tidak (saya menang ' cover tutupi ini, ketika Anda melewati fase-fase tabrakan ini, Anda akan melihat pendeteksian tabrakan dengan momentum sudut) dan apa bentuk tubuh tabrakan mereka sebenarnya. Untuk melakukan bagian tabrakan ini, Anda akan mengkhususkan metode Anda seperti yang telah Anda jelaskan di atas (membuat fungsi spesifik untuk AABBvsCircle, OBBvsCircle, CirclevsCircle, PolygonvsCircle, PolygonvsCircle, PointvsCircle, dll.) Namun, metode ini sendiri juga dapat dilakukan dengan cara berlapis seperti di atas.
Cek pemisahan primitif Anda adalah diskrit, metode deteksi tabrakan khusus atau yang umum seperti SAT tergantung pada kasus penggunaan dan harus semua hanya kembali baik true / false, atau kembali objek relasional seperti Manifold
, Joint
, CollisionObject
dll, yang akan memiliki sambungan dengan dua bentuk yang ditemukan bertabrakan, dan informasi apa pun tentang mereka yang diperlukan untuk menyelesaikan tabrakan, seperti seberapa dalam mereka bertabrakan atau pada kecepatan berapa (data apa yang Anda butuhkan dalam manifold Anda bergantung pada metode resolusi yang Anda gunakan). Objek yang kemudian Anda lewati ke suatu Solver
yang seharusnya menghilangkan perbedaan antara semua bentuk berbeda yang dapat bertabrakan, dengan hanya menerima Manifold
dan tidak menerima informasi tertentu tentang bentuk.
Ringkasan
The Solver
akan mengambil Manifold
diproduksi dengan bertabrakan beberapa primitif A
dengan beberapa primitif B
, menggunakan pengelompokan fase luas pertama (semua vs dunia) dan kemudian deteksi fase sempit (A vs B) dan jika bentuk non-poligon harus khusus, Solver
maka menghasilkan baik baru Vector
s untuk posisi bertabrakan bentuk dan kecepatan, atau benda yang PhysicsEnvironment
atau World
kemudian dapat digunakan untuk tabrakan tekad pada anak-anak itu, lalu akhirnya memperbarui QuadTree
dan ulangi proses ini pada frame berikutnya. Jika kedua bentuk bertabrakan adalah poligon maka spesialisasi hanya boleh dilakukan dengan memperhatikan peningkatan kinerja, jika tidak cukup menggunakan Teorema Sumbu Pemisah