Matematika apa yang harus diketahui semua programmer game? [Tutup]

163

Pertanyaan yang cukup sederhana: Matematika apa yang harus dipahami oleh semua programmer game agar bisa sukses?

Saya tidak secara khusus berbicara tentang merender matematika atau apa pun di bidang khusus pemrograman game, lebih khusus hanya hal-hal yang bahkan harus diketahui oleh programmer game, dan jika tidak, mereka mungkin akan menganggapnya berguna.

Catatan: karena tidak ada satu jawaban yang benar , pertanyaan ini (dan jawabannya) adalah wiki komunitas.

Juga, jika Anda ingin persamaan matematika lateks mewah, jangan ragu untuk menggunakan http://mathurl.com/ .

Tetrad
sumber
1
mmm saya pikir ada topik yang berbicara tentang buku matematika yang harus dibaca setiap programmer atau sesuatu seperti itu saya tidak benar-benar mengingatnya ... tapi ada beberapa hal yang bagus di atasnya .... tidak yakin apakah itu ada di sini atau stackoverflow juga lol
Prix
@Prix: maksud Anda yang ini: gamedev.stackexchange.com/questions/1210/… ;)
Michael Klement
15
Ditutup sebagai terlalu konstruktif oleh Tetrad ♦
Thomas Eding
1
@ Thomas Ya, terlalu luas mungkin lebih cocok, karena ini jelas pertanyaan daftar .
Anko

Jawaban:

137

Ada banyak bentuk matematika lain yang berguna, tetapi paling tidak Anda harus tahu ini:

  • Aljabar dan Aritmatika

Ini sangat mendasar, tetapi jika Anda tidak mengetahuinya, Anda tidak akan memiliki kesempatan untuk menjadi seorang programmer apalagi pengembang game.

Objek dalam dunia game diwakili dengan vektor. Vektor mewakili hal-hal seperti posisi objek, melihat arah, dan kecepatan. Perhitungan matematika vektor seperti Dot Product , Cross Product , dan normalisasi vektor sangat penting.

Bagaimana cara memindahkan objek game saya? Pemula mungkin berkata:

"Aku tahu! Aku hanya akan melakukan:" object.position.x++.

Tidak tidak Tidak. Anda harus menggunakan perhitungan vektor. Objek membutuhkan posisi, arah dan vektor percepatan yang dapat Anda gunakan untuk memindahkan objek. Jika Anda melakukan hal pemula, Anda akan terjebak dalam kekacauan yang tidak dapat dipelihara, dan bagaimana Anda membuatnya bergerak ke arah yang tidak selaras dengan sumbu XYZ dunia?

Alasan utama game menggunakan angka empat adalah karena mereka mewakili rotasi hampir seefisien ruang seperti sudut Euler, tanpa menderita kunci Gimbal . Gimbal Lock dimulai ketika sudut Euler mencapai rotasi 90 derajat di sekitar sumbu apa pun: Anda segera kehilangan derajat kebebasan. Kuartal mengatasi masalah ini dengan menambahkan dimensi keempat. Jika Anda terjebak dengan sudut Euler, Anda harus membatasi satu sumbu untuk tidak pernah memutar lebih dari ~ 89 derajat.

Jika Anda akan memprogram matematika untuk respons fisika dalam sebuah game, maka mengambil kelas fisika tidak akan menjadi ide yang buruk.

Alasan mengapa Anda perlu mengetahui persamaan fisika:

  1. Membuat bola memantul (lihat: co-efficiency of restitusi)
  2. Buat bola bergerak ke arah dengan gaya kekuatan 'x'
  3. Buat sesuatu memiliki gesekan lebih atau kurang sehingga akan meluncur pada kecepatan yang berbeda
  4. Respons tabrakan: Arah apa yang akan diputar objek ketika saya tekan 'di sini'?

Jika Anda menggunakan mesin fisika (atau mesin gim yang memiliki inbuilt mesin fisika) maka Anda dapat mengetahui sedikit tentang fisika. Tetap saja, cukup baik untuk mengetahui kapan Anda perlu membuat tangan Anda kotor karena mesin fisika tidak berkinerja baik.

Brock Woolf
sumber
1
Untuk fisika, artikel Chris Hecker tentang dinamika tubuh yang kaku, termasuk respons tabrakan dan restitusi, sangat mengagumkan: chrishecker.com/Rigid_Body_Dynamics
tenpn
25
Anda menyebutkan angka empat tetapi tidak matriks transformasi ??
Andrew Russell
8
"Gimble [sic] lock adalah efek di mana ketika Anda menggerakkan mouse Anda untuk melihat ke bawah, itu akan berhenti ketika Anda melihat langsung ke bawah ...." Sebenarnya itu biasanya dilakukan untuk kewarasan pemain, dan tidak ada hubungannya dengan kunci gimbal.
4
Itu mengherankan saya betapa seringnya angka empat dikaitkan dengan kunci gimble. Saya telah menulis game 3D tanpa angka empat dan tidak pernah memiliki masalah kunci gimble. Jika Anda benar-benar memahami matematika 3D dan tahu apa sebenarnya kunci gimble, maka Anda tidak akan memiliki masalah itu.
Skizz
7
Kunci Gimbal sebenarnya disebabkan oleh rotasi naif dengan sudut Euler (umumnya sudut Tait-Bryan: Yaw, Pitch, Roll). Representasi alternatif seperti Axis-Angle juga dapat digunakan untuk mencegah terjadinya. Namun kuota memiliki manfaat interpolasi yang mudah, dan umumnya disukai karena alasan itu.
Jason Kozak
51

Saya memimpikan hari ketika pengembangan game didorong data sebagai produksi seni. Saya tidak melihatnya di mana pun di cakrawala jadi untuk sekarang mengetahui beberapa matematika tampaknya menjadi kebutuhan.

Matematika itu seperti teknik, semakin banyak semakin baik, selama Anda bisa menerapkannya.

Inilah urutan kepentingan yang saya lihat.

  • Hitung
  • Aljabar Linier (dengan interpretasi geometris)
  • Kalkulus (fisika)
  • Combinatorics (level acak)
  • Probabilitas (penyeimbangan)
  • Statistik (Bayesian esp. For AI)

Saya bisa terus berjalan. Semakin Anda tahu lebih baik, tetapi belajar banyak matematika tidak berarti Anda akan membuat permainan yang hebat, tetapi itu bisa membantu.

Jonathan Fischoff
sumber
4
Kalkulus adalah bidang besar. Mungkin hanya sedikit yang dibutuhkan untuk pengembangan game.
Noldorin
2
@Noldorin ya. Dalam kebanyakan situasi, memahami hubungan antara turunan, akselerasi, kecepatan, dan posisi mungkin cukup ... tetapi kalkulus mengagumkan.
Jonathan Fischoff
Bayesian AIs cenderung tidak digunakan untuk game karena penggunaan memori yang relatif besar, debuggability dan predictability yang buruk, dan ruang masalah yang terdefinisi dengan baik. Implementasi yang baik dari pencarian klasik dengan heuristik yang pintar biasanya (tetapi tidak selalu) alat yang lebih baik.
1
Bagi saya ini bukan algoritma Bayesian tertentu yang saya anggap penting, tetapi memahami proses penalaran seperti yang didukung oleh ET Jaynes. Saya tidak berpikir ada sesuatu yang pada dasarnya lambat tentang alasan Bayesian.
Jonathan Fischoff
1
Statistik sangat bagus ketika Anda sedang mengembangkan AI, atau secara umum hanya mengembangkan permainan manajemen / taipan. Di sisi lain, saya sama sekali tidak mengenal kalkulus. Saya berpendapat statistik dan probabilitas pada dasarnya adalah hal yang sama untuk tujuan pembelajaran karena bidang statistik berasal dari pekerjaan pada probabilitas. Sangat subyektif.
Rushyo
25

Yang sangat mendasar adalah teorema Pythagoras. Juga dikenal sebagai rumus jarak.

a ^ 2 + b ^ 2 = c ^ 2di mana adan bmerupakan tepi segitiga siku-siku dan cmerupakan sisi miringnya. Ini berarti bahwa untuk menemukan panjang vektor, Anda melakukan ini:

distance = sqrt (a ^ 2 + b ^ 2)

Catatan lain yang menarik adalah bahwa jika Anda hanya membandingkan jarak, Anda tidak harus mengambil akar kuadrat (yang bisa relatif mahal). Itu sebabnya sebagian besar kerangka kerja memiliki fungsi "kuadrat jarak" atau "kuadrat panjang" untuk vektor mereka.

Tetrad
sumber
1
Saya cukup yakin saya pernah membaca ini di tempat lain di situs ini sebelumnya :)
Ricket
Tentu, posting ini terinspirasi oleh utas / komentar itu.
Tetrad 2-10
Saya mendapatkan beberapa déjà vu di sini ... :)
mmyers
2
Secara umum, panjang vektor adalah akar kuadrat dari produk titik itu sendiri. Jadi sqrt(V dot V)panjangnya. Jadi, jarak antara dua titik adalah:sqrt((A-B) dot (A-B))
greyfade
Juga hebat adalah memahaminya dalam konteks identitas trig² sin² (x) + cos² (x) = 1.
19
  • Vektor baik 3D dan 4D, dan untuk apa komponen W harus diatur
  • Sistem koordinat kiri dan kanan, dan yang mana gim Anda
  • Produk titik, dan apa manfaatnya
  • Produk silang, dan untuk apa manfaatnya
  • Matriks, bagaimana mereka mewakili orientasi dan posisi dan bagaimana Anda dapat menggabungkannya
  • Pertanyaan

Bahkan jika Anda bukan The Graphics Guy, Anda akan menggunakan vektor vektor dan matematika 80% dari waktu. Mereka adalah bawang dari bolognese kami yang menyenangkan.

tenpn
sumber
4
Ini bukan daftar yang buruk, tetapi saya berharap untuk jawaban yang lebih deskriptif. Yaitu apa rumus produk titik, apa artinya, dan bagaimana itu berguna.
Tetrad 2-10
3
@Tetrad Bukankah wikipedia memberi Anda itu? en.wikipedia.org/wiki/Dot_product#Definition .
Jonathan Fischoff
1
Bukan untuk game khusus, tidak.
Tetrad 2-10
5
Itu benar. Ini memberi tahu Anda produk titik adalah kosinus sudut. Hanya itu yang perlu Anda ketahui (dan dapat diketahui), karena aplikasi ini masih bergantung pada apa yang Anda inginkan. Mengorientasikan AI? Anda membutuhkan sudut, jadi titik adalah teman Anda. Merender cahaya? Anda butuh sudut. Semua yang dapat dikatakan adalah bahwa itu (titik produk dalam kasus ini) mendefinisikan kosinus dari sudut kali panjang vektor a, kali panjang vektor b. Itulah ilmu yang bisa diberikan. Bagian mana yang digunakan, dan bagaimana, tidak dapat dikatakan karena aplikasinya tidak terbatas.
Kaj
10

Sebuah pemahaman yang kuat tentang +, -, *, dan /. Tanpa mereka, Anda benar-benar kacau.

Bebek Komunis
sumber
12
Saya pikir kita semua bisa setuju ini bukan pertanyaannya. (juga Anda lupa%).
coderanger
2
Jawaban lain akan dipilih untuk ini (aritmatika dasar) ....
RCIX
7
Bukan hanya aritmatika dasar, tetapi memahami bagaimana operasi semua bekerja di dua-komplemen, titik tetap, dan lingkungan titik mengambang IEEE. Tanpa pemahaman yang kuat tentang mengapa 0,1 * 3! = 0,3, atau mengapa -x mungkin tidak seperti yang Anda harapkan, Anda kacau.
1
@ user744 Saya benar-benar kacau, sihir apa ini?
Neon Warge
9

Ya, pemrograman game cenderung sangat intensif matematika. Matematika apa yang Anda butuhkan tergantung pada apa yang sedang Anda kerjakan. Aritmatika dasar adalah suatu keharusan, tentu saja, sama seperti dalam semua pemrograman. Lebih dari itu:

Geometri sangat penting untuk setiap pekerjaan grafis. Jika Anda ingin menampilkan hal-hal di layar, Anda perlu memahami sistem koordinat. Dan jika Anda ingin memindahkan mereka dalam apa pun kecuali arah mata angin, Anda akan benar-benar hilang tanpa pemahaman yang kuat tentang sinus, cosinus dan vektor (trigonometri dasar). Dan jika Anda perlu bekerja dalam 3D, persyaratan geometri dan trigonometri menjadi jauh lebih rumit.

Jika Anda ingin memodelkan segala jenis fisika realistis jarak jauh, Anda perlu kalkulus untuk itu. (Itulah yang mendorong Newton untuk menciptakan kalkulus, setelah semua.)

Segala macam perhitungan probabilitas memerlukan pengetahuan statistik dan teori probabilitas untuk mendapatkan hasil yang waras tanpa jumlah trial and error yang gila.

Mungkin ada lebih banyak, tetapi itulah yang terlintas di benak saya.

Mason Wheeler
sumber
Saya ingat ketika adik lelaki saya mencoba membuat permainan Bang-Bang sebagai proyek untuk kelas VB SMA-nya. Dia memiliki segalanya yang berhasil, kecuali dia tidak tahu bagaimana membuat meriam terbang melengkung berdasarkan sudut dan kekuatan, karena dia belum mengambil Trig 1. Setelah saya menjelaskan dasar-dasarnya, itu bekerja dengan baik.
Mason Wheeler
Tidak perlu Trig untuk arc, cukup gunakan s=u.t + a.t.t/2. Anda perlu trigonometri untuk mendapatkan kecepatan awal (u).
Skizz
Mengapa ini tidak lebih tinggi? Setengah dari programmer yang pernah bekerja sama dengan saya tidak bisa menggunakan sinus dan cosinus seumur hidup mereka.
zaratustra
@ Skizz: Ya. Anda perlu trigonometri untuk mengubah sudut dan kekuatan menjadi vektor awal. Setelah itu Anda hanya perlu loop animasi dan konstanta gravitasi.
Mason Wheeler
9

Paling tidak Anda butuhkan.

  • Aljabar
  • Geometri Dasar
  • Trigonometri dasar

Anda juga ingin memiliki setidaknya pengetahuan operasional vektor, dan Anda ingin tahu apa itu Matrix dan apa yang bisa digunakan untuk itu, walaupun detailnya tidak perlu benar-benar diperlukan.

Jika Anda ingin masuk ke pemrograman grafik, Anda akan membutuhkan lebih banyak pengetahuan matematika, tetapi melakukan pemrograman gameplay umum tidak harus terlalu intensif matematika.

jessecurry
sumber
9

Sistem penomoran biner dan heksadesimal , dan bagaimana mengubahnya menjadi / dari angka desimal.

Meskipun Anda umumnya tidak perlu bekerja dengan angka-angka Biner mentah , mereka sering digunakan untuk variabel Bendera, yang memerlukan logika boolean dan bit-shifting.

Hex tidak begitu penting (kecuali jika Anda ingin memproses 0xDEADBEEF ), tetapi minimal, Anda ingin mengenali kapan mereka digunakan, dan mengapa.

Cyclops
sumber
1
Jika Anda tidak dapat membaca hex, Anda tidak dapat memprogram dengan efektif. Kebanyakan konstanta bitwise dalam C dan C ++ akan ditentukan sebagai nilai hex.
Saya pikir Anda punya Booleandan binarybercampur. Tidak yakin itu mutlak diperlukan untuk pemrograman game.
Skizz
@ Skizz, poin bagus - diperbaiki. (Dan poin kecil lainnya, ini adalah wiki - tidak ada yang menghentikan Anda untuk mengubahnya. :)
Cyclops
Jika Anda tidak dapat membaca hex, maka gunakan alat untuk mengubahnya untuk Anda.
Thomas Eding
6

Tidak menyebutkan matematika dasar pemrograman komputer? Teori grafik, teori bilangan, teori himpunan, dan matematika konkret, biasanya semua disatukan menjadi kelas yang menyakitkan dan kurang diajarkan yang disebut "matematika diskrit" di universitas.

"Trik bit bodoh" menghemat setiap jenis waktu program (dan biasanya juga setara dengan beberapa trik string dan trik set), tipe grafik dan traversal digunakan di semua tempat (bahkan jika Anda hanya memilih wadah STL), dan kompleksitas algoritmik adalah kunci untuk optimasi ketika bahasa mencapai tingkat yang lebih tinggi.

pengguna744
sumber
5

Saya pikir matriks hasil adalah alat yang sangat penting. Permainan seringkali lebih menyenangkan ketika mereka mendekati keseimbangan jumlah wajar yang sama, dan matriks imbalan membantu Anda menghitungnya dalam kasus rumit. Saya kira artikel wikipedia ini sebagus apapun, dan mendapatkan konsep dasar yang diperlukan di: http://en.wikipedia.org/wiki/Normal-form_game

Kzqai
sumber
Ini tampak sangat tidak praktis bagi saya. Apakah Anda pikir Starcraft atau Warcraft 3 seimbang menggunakan metode seperti ini? Saya rasa tidak, saya percaya itu iterasi dan playtesting, dan patching konstan.
bobobobo
Eh, mereka hampir pasti, pasukan perang awal diubah duplikat satu sama lain yang mungkin dibuat dengan matriks hasil yang dirancang untuk membuat mereka seimbang secara keseluruhan. Setelah itu mereka mungkin hanya membangun di atas apa yang mereka pelajari untuk menyetel sesuatu, tetapi mereka mungkin harus melakukannya lagi dengan starcraft untuk mendapatkan tingkat keseimbangan yang wajar sekarang karena tiga pasukan yang berbeda terlibat, dan lagi ketika unit starcraft II ditambahkan. Jelas Anda tidak hanya berhenti pada model, playtesting sering menunjukkan sifat yang muncul, tetapi matriks hasil adalah bagaimana Anda awalnya memodelkan kompleksitas.
Kzqai
[rujukan?]?
bobobobo
1
Itu adalah ini: amazon.com/Game-Architecture-Design-New-Edition/dp/0735713634/... Saya berharap bahwa versi amazon memungkinkan pencarian di dalam buku ini, karena mungkin merupakan hal yang bagus untuk referensi dalam bit untuk situs ini. Meskipun mungkin pencarian di buku amazon tidak bekerja seperti itu. Ngomong-ngomong, di situlah mereka membahas matriks hasil, menggunakan warcraft sebagai contoh, dan keuntungan untuk mengelola kompleksitas begitu jelas sehingga membuat saya menjadi mualaf instan. Itu bukan jaminan bahwa Blizzard benar-benar menggunakan pendekatan itu, tetapi mereka adalah orang-orang pintar, jadi mereka mungkin punya solusi matematika ...
Kzqai
... setidaknya untuk cara bisa memahami keseimbangan dalam sekejap. Tentunya Anda ingin menambahkan pengujian juga. Saya benar-benar membeli buku itu dengan kekuatan pamflet kecil yang mengurangi konten terkait permainan yang mengagumkan, termasuk diskusi tentang matriks hasil dan hubungan rock-paper-scissors dan segala macam hal hebat, dan kecewa menemukan bahwa final buku adalah buku tebal, dan banyak berurusan dengan pemrograman C ++ (yang bukan hal saya), serta masalah manajemen judul AAA. Namun, semua yang ada dalam pamflet tebang sangat bagus.
Kzqai
4

Memahami produk titik: Jika dua vektor memiliki arah yang sama, (theta <90 deg), maka produk titik adalah positif, atau yang lain, negatif. Ini dapat digunakan untuk menguji setiap kali pemain terlihat (dengan asumsi FOV adalah 90 derajat)

Dan menggeneralisasi game 2D Anda ke dimensi yang lebih tinggi. (gunakan perhitungan vektor)

Jika Anda dapat menerapkan mesin 3D sendiri, Anda siap melakukannya.

Ming-Tang
sumber
4

Itu tergantung pada apa yang Anda lakukan .

Semua programmer game harus tahu setidaknya aljabar sekolah menengah. Itu berarti:

  • Rasa angka yang bagus
  • Nyaman dengan matematika dasar (tambah, sub, mult, bagikan)
  • Trigonometri (dosa dan cos)
  • Vektor, sudut antara vektor, titik produk, produk silang

Pemrogram grafik Anda harus tahu:

  • Semua yang di atas, dan
  • Aljabar matriks (untuk matriks transformasi)
  • Metode persimpangan poligon / ray-poligon (lihat buku seperti deteksi tabrakan waktu-nyata

Pemrogram fisika Anda harus tahu:

  • Semua hal di atas dan
  • Persamaan diferensial
  • Metode numerik
bobobobo
sumber
3

Selain sinus dan cosinus (yang 50-75% programmer yang saya temui tidak tahu cara menggunakannya), pelajari fungsi arc-tan ajaib dan bagaimana bisa digunakan untuk mendapatkan sudut vektor apa pun.

zaratustra
sumber
5
dalam banyak kasus Anda inginkan atan2karena ini menangani kuadran dengan sendirinya.
CodesInChaos
0

Saya terkejut bahwa tidak ada yang menyebutkan Quaternions . Saya tidak punya banyak pengalaman dengan mesin yang berbeda tetapi setidaknya JME menggunakannya di mana-mana dan saya mendapat kesan bahwa mereka adalah konsep yang cukup penting.

Raoul
sumber
2
eh saya menyebutkan angka empat.
tenpn
Ahh, maaf, aku melewatkannya.
Raoul
3
Untuk 1% programmer game yang menulis kode animasi level rendah di mesin rendering, angka empat adalah alat yang berguna. Untuk 99% programmer game lainnya, mereka tidak terlalu dibutuhkan.
Skizz
-1

Membuat game berarti membawa kehidupan "nyata" ke realitas virtual. Lebih baik tahu lebih banyak tentang dunia nyata / alam semesta daripada lebih sedikit :) .. Matematika hanyalah alat. Dan jika Anda membuat rencana, Anda harus meluangkan waktu untuk belajar dalam rencana juga.

Diedit: Saya melihat beberapa kesalahpahaman :) .. Saya berpikir bahwa serangkaian perolehan matematika apa yang Anda perlu atur, tergantung pada hal-hal konkret yang ingin Anda gambarkan. Tidak ada yang tahu segalanya. Dan cara yang lebih baik untuk melakukannya adalah. Bukan untuk mempelajari segala sesuatu di awal, tetapi belajar sepotong kecil, gunakan, pelajari, gunakan dll. Kemudian Anda dapat melakukannya selama pengembangan, jika Anda memiliki rencana yang baik.

samboush
sumber
1
Berapa banyak kehidupan nyata yang ada di tetris?
tenpn
Banyak :). Tetris adalah tentang pemikiran logis di bawah tekanan. Seperti game logis lainnya. Ini tentang berlatih. Lebih banyak berlatih, lebih banyak tekanan yang bisa Anda tangani dan masih bersenang-senang darinya. Sepertinya kehidupan nyata bagi saya
:)
3
Anda tidak masuk akal ketika Anda gagal menjawab pertanyaan dengan adil.
Heath Hunnicutt
@Heath Hunnicutt, Anda benar.
samboush
3
Saya sangat menghargai tanggapan itu.
Heath Hunnicutt
-2

Jawaban sederhana: BANYAK!

Jawaban terinci:

Aljabar Aritmatika, Dasar & Linier, dalam kebanyakan kasus Trig, jika Anda membuat game 3D, Kalkulus PASTI, dan Fisika (Fisika membutuhkan Kalkulus)!

Darius Goad
sumber
3
Bisakah Anda menjelaskan sedikit daftar? Apakah Anda mengatakan "Trig jika Anda membuat game 3D" atau "Jika Anda membuat game 3D, PASTI Kalkulus"?
yoozer8