Buku ini merupakan panduan komprehensif tentang aljabar linier dan permainan deteksi tumbukan yang umum digunakan, namun hanya menyentuh secara singkat topik resolusi tumbukan (Fisika). Buku ini disusun sebagai berikut:
Semua topik yang dibahas dalam buku ini digunakan untuk secara progresif membangun mesin fisika benda tegar. Tiga bab terakhir (14, 15 dan 16) menerapkan fisika partikel, fisika benda tegar, dan fisika benda lunak (kain). Sebuah lampiran disediakan yang secara singkat mencakup topik-topik lanjutan, sumber daya untuk menjelajahi topik-topik ini serta sumber daya tambahan untuk menjelajahi fisika permainan.
Beberapa gambar yang dibuat untuk buku tersebut tidak dapat diterjemahkan dengan baik untuk dicetak. Untuk mengatasi hal ini saya telah memasukkan semua gambar buku dalam repositori ini dan menerbitkan gambar tersebut secara online di: https://github.com/gamephysicscookbook/Figurs
Tiga bab pertama buku ini didedikasikan untuk mengajarkan aljabar linier dasar yang diperlukan untuk pengembangan game. Setiap konsep dijelaskan dalam konteks matematika, kode sumber disediakan untuk setiap konsep dan juga disediakan gambar ketika sesuatu dapat dieksplorasi secara visual. Sepanjang tiga bab pertama, struktur data berikut dibuat:
vec2
)vec3
)mat2
)mat3
)mat4
)Jika memungkinkan, operasi matriks diimplementasikan dengan cara yang umum. Misalnya, kode disediakan untuk mengalikan dua matriks dengan ukuran sembarang.
Persimpangan berikut dibahas dalam buku ini:
Titik | Garis | Sinar | Bola | AABB | OBB | Pesawat | Segi tiga | frustrasi | |
---|---|---|---|---|---|---|---|---|---|
Titik | |||||||||
Garis | |||||||||
Sinar | |||||||||
Bola | |||||||||
AABB | |||||||||
OBB | |||||||||
Pesawat | |||||||||
Segi tiga | |||||||||
frustrasi |
Bab 14 membahas fisika partikel naif, bab ini dimaksudkan sebagai pengantar untuk menyiapkan perulangan fisika dan mempertimbangkan format umum perulangan fisika. Bab 15 adalah bab yang paling menarik, bab ini mengimplementasikan dasar mesin fisika benda tegar. Mesin dasar memiliki dukungan untuk kotak dan bola yang berorientasi, penumpukan dapat dibuat berfungsi tetapi tidak didukung secara langsung. Bab 16 membahas pegas dan bagaimana pegas dapat digunakan untuk mengimplementasikan fisika benda lunak. Demo terakhir buku ini adalah demo fisika kain dengan bodi lembut.
Ini adalah buku pertama saya, saya belajar banyak tentang proses menulis; mungkin lebih banyak lagi tentang perencanaan. Berikut ini adalah daftar hal-hal yang saya temukan saat menulis buku ini yang tidak saya rencanakan dengan baik:
Quaternion : Memiliki angka empat adalah suatu keharusan! Saya berencana menulis buku menggunakan rotasi euler dan matriks rotasi. Meskipun ini berhasil, memiliki akses ke angka empat akan membuat hidup lebih mudah.
Bidang : Persimpangan bidang tidak boleh menghasilkan nilai boolean, melainkan harus mengklasifikasikan persimpangan menjadi: di belakang, berpotongan, di depan. Sebaiknya, jika persimpangan berada di depan atau belakang, Anda ingin mengembalikan indikasi jarak. Ini menjadi sangat berguna saat melakukan pemusnahan Frustum. Saya tidak tahu seberapa mendalam saya akan menulis tentang frustum, jadi saya memutuskan untuk melakukan perpotongan boolean sederhana.
Raycasting : Saya seharusnya menulis raycast untuk mengembalikan hasil raycast dari awal. Harus kembali lagi dan menulis ulang API raycasting ternyata lebih rumit untuk diungkapkan dalam teks daripada yang saya perkirakan. Tujuan dibalik hal ini adalah untuk menjaga segala sesuatunya tetap sederhana pada awalnya, dan memperumitnya hanya jika diperlukan.
Ada berbagai masalah dalam implementasi fisika kode sumber. Permasalahan ini muncul karena bagian fisika dalam buku ini harus diringkas menjadi tiga bab. Tidak ada cukup waktu untuk membahas semua yang diperlukan untuk membuat sistem fisika benda tegar yang kokoh. Masalah terbesar dengan mesinnya adalah tidak adanya Arbiter .
Tanpa seorang arbiter, kita tidak dapat membangun pemecah impuls yang berurutan. Hal ini membuat kita memiliki pemecah impuls yang naif dan sederhana. Masalahnya adalah, impuls diselesaikan per kontak per frame. Hal ini menyebabkan pergeseran yang berlebihan. Saya telah mengkompensasi kurangnya impuls sekuensial dengan proyeksi linier dan bias gesekan yang agresif. Mesin fisika lama melakukan hal serupa, dengan mengandalkan tidur yang kuat untuk menutupi masalah. Tak perlu dikatakan lagi, tidur tidak dilaksanakan.
Jika saya mempunyai kesempatan untuk menulis edisi kedua buku ini, saya akan menghapus bab tentang tabrakan dua dimensi (bab 4, 5 dan 6) dan mengurangi jumlah halaman bab manajemen adegan. Saya berencana menggunakan halaman tambahan untuk membahas topik-topik berikut: