Tüm oyun programcılarının bilmeleri gereken matematik nedir? [kapalı]


163

Yeterince basit bir soru: Tüm oyun programcılarının başarılı olabilmeleri için sağlam bir kavrama sahip olmaları gereken matematik nedir?

Oyun programlamacılığının niş alanlarında matematik veya herhangi bir şey yapmaktan bahsetmiyorum, daha özel olarak sadece oyun programcılarının bile bilmesi gereken şeyler ve yapmazlarsa muhtemelen faydalı buluyorlar.

Not: orada olarak hiç kimse doğru yanıt , bu soru (ve cevapları) bir topluluk wiki olduğunu.

Ayrıca, fantezi lateks matematik denklemlerini isterseniz, http://mathurl.com/ adresini kullanmaktan çekinmeyin .


1
mmm, her programcının okuması gereken matematik kitaplarından bahseden bir konu olduğunu veya gerçekten hatırlayamadığım bir şey olduğunu düşünüyorum ... ama üzerinde güzel şeyler vardı .... burada olup olmadığından emin değil ya da lol lol
Prix



15
Tetrad ♦
Thomas Eding

1
@ThomasEding Evet, çok açık olabilir, çünkü bu açıkça bir liste sorusudur .
Anko

Yanıtlar:


137

Yararlı olan birçok matematik formu daha var, fakat bunları en azından bilmeniz gerekiyor:

  • Cebir ve Aritmetik

Bunlar oldukça basit, ancak bunları bilmiyorsanız, bir oyun geliştirici yerine, bir programcı olma şansınız bile olmayacak.

Oyun dünyasındaki nesneler vektörlerle temsil edilir. Vektör, bir nesnenin konumu, bakış yönü ve hızı gibi şeyleri temsil eder. Nokta çarpımı , Çapraz çarpım ve Vektör normalizasyonu gibi vektör matematik hesaplamaları esastır.

Oyun nesnemi nasıl hareket ettiririm? Acemi şöyle diyebilir:

"Biliyorum! Sadece yapacağım:" object.position.x++.

Hayır hayır hayır. Bir vektör hesaplama kullanmanız gerekir. Nesne, nesneyi taşımak için kullanabileceğiniz bir konum, yön ve ivme vektörüne ihtiyaç duyar. Acemi bir şey yaparsanız, sürdürülemez bir karmaşa içinde sıkışıp kalacaksınız ve dünyanın XYZ ekseni ile hizalı olmayan bir yönde nasıl hareket ettireceksiniz?

Oyunların kuaterniyonlar kullanmasının temel nedeni, Gimbal kilidi sıkıntısı çekmeden, neredeyse Euler açıları kadar uzayda etkili rotasyonları temsil etmeleridir . Gimbal Kilidi herhangi bir Euler açısı herhangi bir eksen etrafında 90 derecelik bir dönüşe ulaştığında başlar: hemen bir serbestlik derecesini kaybedersiniz. Kuaterniyonlar bu sorunu dördüncü bir boyut ekleyerek ele almaktadır. Euler açılarıyla sıkışırsanız, bir ekseni asla ~ 89 dereceden fazla dönmeyecek şekilde sınırlamanız gerekir.

Bir oyunda fizik tepkileri için matematiği programlayacaksanız, bir fizik dersi almak kötü bir fikir olmazdı.

Fizik denklemlerini bilmenizin nedenleri:

  1. Top zıplaması yapma (bkz: restitüsyonun kooperatifi)
  2. Bir topun 'x' kuvvet Newtonu ile hareket etmesini sağlayın
  3. Bir şey daha fazla veya daha az sürtünme olun, böylece farklı bir hızda kayar
  4. Çarpışma tepkileri: 'Buraya' bastığımda nesne hangi yöne dönecek?

Bir fizik motoru (veya fizik motoru yerleşik olan bir oyun motoru) kullanıyorsanız, o zaman fizik hakkında çok az şey bilmekten kurtulabilirsiniz. Yine de, ne zaman ellerini kirletmeniz gerektiğine karar vermek iyi çünkü fizik motoru düzgün çalışmıyor.


1
Fizik için, Chris Hecker'in
tenpn

25
Kuaterniyonlardan bahsettiniz ama dönüşüm matrislerinden bahsetmediniz ??
Andrew Russell,

8
“Gimble [sic] kilidi, farenizi aşağıya doğru hareket ettirdiğinizde, doğrudan aşağıya baktığınızda duracağınız etkidir…” Aslında bu genellikle oyuncu sağlığı için yapılır ve gimbal kilidi ile ilgisi yoktur.

4
Kuaternyonların ne kadar sıklıkla topuzlu kilitle bağlandığı beni şaşırtıyor. Hiçbir şekilde dörtlü olmayan 3D oyunlar yazdım ve hiçbir zaman taklit kilitlemeyle ilgili bir sorun yaşamadım. Eğer 3D matematiği gerçekten anlıyorsanız ve bir topuzlu kilidinin gerçekte ne olduğunu biliyorsanız, o zaman bu problemle karşılaşmazsınız.
Skizz

7
Gimbal kilidi aslında Euler açılarıyla saf dönüşlerden kaynaklanır (genellikle Tait-Bryan açıları: Yaw, Pitch, Roll). Eksen Açısı gibi alternatif gösterimler de oluşmasını engellemek için kullanılabilir. Ancak kuaterniyonlar, kolay enterpolasyon avantajına sahiptir ve bu nedenle genellikle tercih edilir.
Jason Kozak

51

Oyun geliştirmenin sanat üretimi kadar veri toplamasının olduğu günü hayal ediyorum. Ufukta hiçbir yerde göremiyorum, o yüzden şimdilik bir matematik bilmek bir zorunluluk gibi görünüyor.

Matematik, teknik gibidir, ne kadar çok olursa, uygulayabildiğiniz sürece.

İşte gördüğüm önem sırası.

  • Aritmetik
  • Lineer Cebir (geometrik yorumlarla)
  • Matematik (fizik)
  • Kombinatorik (randomize seviyeler)
  • Olasılık (dengeleme)
  • İstatistikler (AI için Bayesian esp.)

Devam edebilirim. Ne kadar çok şey bilirseniz, bir grup matematik öğrenmek, iyi bir oyun yapacağınız anlamına gelmez, ama yardımcı olabilir.


4
Matematik, büyük bir alandır. Oyun gelişimi için muhtemelen sadece küçük bir miktar gereklidir.
Noldorin

2
@Noldorin evet. Çoğu durumda türev, ivme, hız ve konum arasındaki ilişkiyi anlamak yeterli olabilir ... ancak hesap harika.
Jonathan Fischoff

Bayesian AI'lar, nispeten büyük bellek kullanımı, zayıf hata ayıklama ve tahmin edilebilirlik ve iyi tanımlanmış bir sorun alanı nedeniyle oyunlarda kullanılma eğilimindedir. Akıllı sezgisel tarama ile klasik aramanın iyi bir uygulaması genellikle (ancak her zaman değil) daha iyi bir araçtır.

1
Bana göre, önemli bulduğum belirli bir Bayesian algoritması değil, ET Jaynes tarafından benimsenen mantık yürütme sürecini anlamak. Bayesian muhakemesinde doğal olarak yavaş bir şey olduğunu sanmıyorum.
Jonathan Fischoff

1
Bir AI geliştirirken veya sadece genel olarak bir yönetim / tycoon oyunu geliştirirken istatistikler harikadır. Öte yandan, matematik hakkında hiçbir bilgim yok. İstatistiklerin ve olasılıkların, öğrenme alanlarındaki temel olasılıkla, istatistik alanının olasılık üzerindeki çalışmalardan kaynaklandığı gibi olduğunu savunuyorum. Bu çok öznel.
Rushyo

25

Çok temel olanı Pisagor teoremidir. Uzaklık formülü olarak da bilinir.

a ^ 2 + b ^ 2 = C ^ 2nerede ave bbir dik üçgenin kenarları ve chipotenüsüdür. Bu, bir vektörün uzunluğunu bulmak için şunu yapmanız anlamına gelir:

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

İlgilenilen bir başka not, eğer sadece mesafeleri karşılaştırıyorsanız , karekök almak zorunda kalmayacağınızdır (nispeten pahalı olabilir). Bu nedenle çoğu çerçevenin vektörleri için bir "mesafe kare" veya "uzunluk kare" işlevi vardır.


1
Bunu daha önce bu sitede başka bir yerde okudum eminim :)
Ricket

Elbette, bu yazı o konudan / yorumdan ilham aldı.
Tetrad

Burada bazı deja vu alıyorum ... :)
mmyers

2
Daha genel olarak, bir vektörün uzunluğu, nokta ürününün kendisinin kareköküdür. Yani, sqrt(V dot V)uzunluğu. Yani, iki nokta arasındaki mesafe:sqrt((A-B) dot (A-B))
greyfade

Aynı zamanda onu, sin² (x) + cos² (x) = 1

19
  • Hem 3B hem de 4D'yi içeren vektörler ve W bileşeninin neye ayarlanması gerektiği
  • Sol ve sağ koordinat sistemleri ve oyununuz hangisi?
  • Nokta ürün ve bunun ne için yararlı olduğu
  • Çapraz ürün ve bunun ne için yararlı olduğu
  • Matrisler, oryantasyonu ve pozisyonu nasıl temsil ettikleri ve onları nasıl birleştirebileceğiniz
  • Kuaterniyonlar

The Graphics Guy olmasanız bile, zamanın% 80'ini vektörler ve vektörel matematik kullanacaksınız. Onlar bizim eğlenceli bolognese soğanı.


4
Bu kötü bir liste değil, ama daha açıklayıcı bir cevap bekliyordum. Yani nokta ürünü formülünün ne olduğu, ne anlama geldiği ve ne kadar yararlı olduğu.
Tetrad

3
@Tetrad wikipedia size bunu vermiyor mu? en.wikipedia.org/wiki/Dot_product#Definition .
Jonathan Fischoff

1
Özellikle oyunlar için değil, hayır.
Tetrad

5
Öyle. Size nokta ürününün açının kosinüsü olduğunu söyler. Bilmeniz gereken tek şey budur (ve bilebilir), çünkü uygulama hala kullanmak istediğiniz şeye bağlı. AI yönlendirmek? Açıya ihtiyacın var, yani nokta senin arkadaşın. Render ışık? Açıya ihtiyacın var. Söylenebilecek tek şey, (bu durumda nokta ürün) vektörün a uzunluğunun zaman kosinüsünü, vektörün b uzunluğunun kosinüsünü tanımlamasıdır. Verilebilecek bilgi budur. Hangi kısmının kullanılacağı ve uygulamaların sonsuz olduğu söylenemez.
Kaj


10

Bir firma kavramak +, -, *, ve /. Onlarsız tamamen bittin.


12
Sanırım hepimiz sorunun sorduğu şey bu olmadığını kabul edebiliriz. (ayrıca% unuttum).
kodlayıcı

2
Diğer cevaplar bunun için oy aldı (temel aritmetik) ....
RCIX

7
Yalnızca temel aritmetik değil, aynı zamanda tüm işlemlerin iki tamamlayıcı, sabit nokta ve IEEE kayan nokta ortamlarında nasıl çalıştığını anlamak. Neden 0,1 * 3! = 0,3 veya neden -x'in beklediğiniz gibi olamayacağına dair kesin bir fikir sahibi olmazsanız, mahvolursunuz.

1
@ user744 Aslında mahvoldum, bu büyücülük nedir?
Neon Warge,

9

Evet, oyun programlaması oldukça matematik yoğundur. İhtiyacınız olan matematik ne üzerinde çalıştığınıza bağlıdır. Temel aritmetik, elbette, tüm programlamadaki gibi bir zorunluluktur. Onun ötesinde:

Geometri, herhangi bir grafik çalışması için çok önemlidir. Bir şeyi ekranda görüntülemek istiyorsanız, koordinat sistemlerini anlamanız gerekir. Ve onları kardinal yönlerden başka herhangi bir yerde hareket ettirmek istiyorsanız, sağlam bir sinüs, kosinüs ve vektör kavraması olmadan tamamen kaybolacaksınız (temel trig). Ve eğer 3D olarak çalışmanız gerekiyorsa, geometri ve trig gereksinimleri çok daha karmaşık hale gelir.

Herhangi bir uzaktan gerçekçi fizik modellemek istiyorsanız, bunun için hesap gerekir. (Bu, Newton'u matematiği icat etmeye iten şeydi.)

Her türlü olasılık hesaplaması, ciddi miktarda deneme yanılma olmadan akılcı sonuçlar elde etmek için istatistik bilgisi ve olasılık teorisi gerektirir.

Muhtemelen çok daha fazlası var, ama aklımdan en çok aklıma gelen şey bu.


Küçük kardeşimin lise VB dersi için bir proje olarak Bang-Bang oyunu yapmaya çalıştığını hatırlıyorum. Her şeyi halletmişti, ancak topların nasıl açı ve kuvvete dayalı bir yayda uçmasını sağlayacağı hakkında hiçbir fikri yoktu, çünkü henüz Trig 1'i almadı. Temel bilgileri açıkladıktan sonra gayet iyi çalıştı.
Mason Wheeler,

Yay için gerekli Trig, sadece kullanın s=u.t + a.t.t/2. Gerçi başlangıç ​​hızını elde etmek için trig (u) gerekir.
Skizz

Bu neden daha yüksek değil? Çalıştığım programcıların yarısı, yaşamları için sinüs ve kosinüs kullanamıyor.
zaratustra

@Skizz: Evet. Bir açıyı ve gücü ilk vektöre dönüştürmek için trig'e ihtiyacınız var. Bundan sonra sadece bir animasyon döngüsüne ve yerçekimi sabitine ihtiyacınız var.
Mason Wheeler

9

En azından ihtiyacınız olacak.

  • Cebir
  • Temel Geometri
  • Temel Trigonometri

Ayrıca, en azından Vector işlemleri hakkında bir çalışma bilgisine sahip olmak isteyeceksiniz ve bir Matrix'in ne olduğunu ve ne için kullanılabileceğini bilmek isteyeceksiniz, ancak ayrıntılar kesinlikle gerekli olmayacak.

Grafik programlamaya girmek istiyorsanız çok fazla matematik bilgisine ihtiyacınız olacak, ancak genel oyun programlaması yapmak çok matematik yoğun olmak zorunda değil.


9

İkili ve Onaltılık sayı sistemleri ve bunların ondalık sayılara nasıl dönüştürüleceği.

Genellikle ham İkili sayılarla çalışmak zorunda kalmamanıza rağmen, bunlar genellikle mantıksal ve bit kaydırmalı gerektiren Bayrak değişkenleri için kullanılır .

Hex kadar önemli değil ( 0xDEADBEEF'i işlemek istemiyorsanız ), ancak en azından ne zaman ve ne zaman kullanıldıklarını tanımak istersiniz .


1
Onaltılık okuyamıyorsanız, etkin bir şekilde programlayamazsınız. C ve C ++ 'daki çoğu bit yönünde sabit, onaltılık değerler olarak belirtilecektir.

Bence sen karıştın Booleanve binarykarıştı. Oyun programlaması için kesinlikle gerekli olduklarından emin değilim.
Skizz

@Skizz, iyi nokta - sabit. (Ve başka bir küçük nokta, bu bir wikidir - sizi değiştirmekten alıkoyan hiçbir şey değil. :)
Cyclops

Onaltılık okuyamıyorsanız, sizin için dönüştürmek için bir araç kullanın.
Thomas Eding

6

Bilgisayar programlamanın temel matematiğinden söz edilmiyor mu? Grafik teorisi, sayı teorisi, küme teorisi ve somut matematik, genellikle hepsi üniversitede "ayrık matematik" olarak adlandırılan acı verici ve zayıf öğretilmiş bir sınıfa dağılmıştır.

"Aptalca hileler" her tür program zamanından tasarruf sağlar (ve aynı zamanda genellikle bazı ip hilelerine ve ayar hilelerine eşdeğerdirler), grafik türleri ve hareketler her yerde kullanılır (sadece STL kaplarını seçseniz bile), ve algoritmik karmaşıklık, diller yükseldikçe, optimizasyonun anahtarıdır.


5

Kazanç matrisi oldukça önemli bir araç. Oyunlar, bazı ilginç sıfır toplamlı adil oyun dengesine yaklaştıklarında daha eğlencelidir ve ödeme matrisleri, karmaşık durumlarda bunu ölçmenize yardımcı olur. Sanırım bu wikipedia makalesi, herkes kadar iyi ve temel bir kavramın karşısına çıkıyor: http://en.wikipedia.org/wiki/Normal-form_game


Bu benim için son derece pratik görünmüyor. Starcraft veya Warcraft 3'ün böyle bir yöntemle dengelendiğini düşünüyor musunuz? Sanmıyorum, yineleme ve oynatma testi ve sürekli yama olduğuna inanıyorum.
bobobobo

Neredeyse kesinlikle öyleydiler, ilk savaş uçakları orduları, muhtemelen kendilerini dengede tutmak için tasarlanan ödeme matrisleriyle oluşturulan birbirlerinin kopyalarını değiştirdiler. Ondan sonra işleri ayarlamak için öğrendiklerini basit bir şekilde inşa etmiş olabilirler, ancak şimdi üç farklı ordunun katıldığı ve yine de II. Açıkça görülüyor ki, sadece modelde durmuyorsunuz, oyun testi sıklıkla yeni ortaya çıkan özellikler gösteriyor, ancak bir getiri matrisi başlangıçta karmaşıklığı nasıl modellediğinizdir.
Kzqai

[kaynak belirtilmeli]?
bobobobo

1
Bu: amazon.com/Game-Architecture-Design-New-Edition/dp/0735713634/… Ben amazon sürümünün kitabın içinde arama yapmasını sağladım, çünkü bu site için bitlerde referans almak harika bir şey olabilir. Belki de Amazon'daki kitap içi arama bu şekilde çalışmaz. Her neyse, kazanma matrislerinin üzerinden geçtikleri, örnek olarak warcraft kullandıkları ve karmaşıklığı yönetme avantajı o kadar açıktı ki beni anında dönüştürmüştü. Bu, Blizzard'ın bu yaklaşımı kullandığının garantisi değil, ama akıllı insanlar, bu yüzden muhtemelen matematiksel bir çözümü var ...
Kzqai

... en azından dengeyi bir bakışta anlayabilmek için. Belli ki buna da test eklemek istiyorsun. Aslında, kazanma matrisi ve taş-kağıt-makas ilişkileri ve her türlü harika şeyler tartışması da dahil olmak üzere, oyunla ilgili harika içeriğe sahip daha küçük, kesilmiş bir broşürün gücü hakkında kitabı satın aldım ve finalde hayal kırıklığına uğradım. Kitap bir yazıdır ve C ++ programlaması (ki benim işim değil) ve ayrıca AAA başlık yönetimi ile ilgili çok şey yapar. Kesilmiş broşürdeki her şey yine de harikaydı.
Kzqai

4

Nokta ürününü anlama: Eğer iki vektör yaklaşık aynı yöndeyse (teta <90 °), o zaman nokta ürün pozitif veya başka bir negatiftir. Ne zaman oyuncu görünce test etmek için kullanılabilir (FOV'un 90 derece olduğu varsayılarak).

Ve 2D oyununuzu daha yüksek boyutlara genişletin. (vektör hesaplamaları kullanın)

3B motoru kendiniz uygulayabilirsiniz, gitmek iyidir.


4

Bu ne yaptığınıza bağlı .

Tüm oyun programcıları en az lise cebirini bilmelidir. Bunun anlamı:

  • İyi bir sayı anlayışı
  • Temel matematikle konfor (ekleme, alt, çoklu, bölme)
  • Trigonometri (günah ve cos)
  • Vektörler, vektörler arasındaki açı, nokta çarpım, çarpım çarpım

Grafik programcılarınızın bilmesi gerekenler:

Fizik programcılarınızın bilmesi gerekenler:

  • Yukarıdakilerin tümü ve
  • Diferansiyel denklemler
  • Sayısal yöntemler

3

Sinüs ve kosinüslerin yanı sıra (tanıştığım programcıların% 50-75'i nasıl kullanılacağını bilmiyordu), büyülü ark-tan fonksiyonunu ve herhangi bir vektörün açısını elde etmede nasıl kullanılabileceğini öğrendi.


5
Çoğu durumda bu istediğiniz atan2gibi, kadranların elleçlenmesini halleder.
CodesInChaos

0

Hiç kimsenin Quaternions'tan bahsetmemesine şaşırdım . Farklı motorlarla ilgili çok fazla tecrübem yok ama en azından JME her yerde kullanıyor ve oldukça önemli bir konsept olduğu izlenimini edindim.


2
dördüncüllerden bahsetmiştim.
tenpn

Ahh, özür dilerim, özledim.
Raoul

3
Render motoruna düşük seviye animasyon kodu yazan oyun programcılarının% 1'i için kuaterniyonlar kullanışlı bir araçtır. Oyun programcılarının diğer% 99'unda gerçekten gerekli değil.
Skizz

-1

Oyun yapmak “gerçek” hayatı sanal gerçekliğe getirmekle ilgilidir. Gerçek dünya / evren hakkında daha az şey bilmek daha iyidir :) .. Matematik sadece bir araçtır. Ve eğer bir plan yapıyorsanız, planlarda çalışmak için zaman ayırmalısınız.

EDİT EDİLDİ: Bazı yanlış anlaşılmalar gördüm :) .. Sanırım yönetmen gereken şeylerin matematik kazanımlarının tanımlamak istediğinin somut şeylere bağlı olduğunu düşünüyorum. Kimse her şeyi bilmiyor. Ve nasıl yapılacağı daha iyi bir yoldur. Başlangıçta her şeyi öğrenmek değil, küçük bir parça öğrenmek, kullanmak, öğrenmek, kullanmak vb. Sonra iyi bir planınız varsa, geliştirme sırasında bunu yapabilirsiniz.


1
Tetris'te ne kadar gerçek hayat var?
tenpn

Bir çok :). Tetris, baskı altında mantıklı düşünme hakkında. Diğer mantıksal oyunlar gibi. Pratik yapmakla ilgili. Daha fazla pratik, daha fazla zorla başa çıkabiliyor ve hala eğlenebiliyorsunuz. Bana gerçek hayat gibi geliyor
:)

3
Soruyu dürüstçe ele almayı başaramadığınızda anlam ifade etmezsiniz.
Heath Hunnicutt

@ Hunnicutt, Haklısın.
Samboush

3
Bu cevaba gerçekten saygı duyuyorum.
Heath Hunnicutt

-2

Basit cevap: ÇOK!

Detaylı cevap:

Aritmetik, İlköğretim ve Lineer Cebir, çoğu durumda Trig, eğer bir 3D oyun yapıyorsanız, KESİNLİKLE Matematik ve Fizik (Fizik Matematik gerektirir)!


3
Listeyi biraz açıklayabilir misiniz? "3D oyun yapıyorsanız tetikleyin" mi yoksa "3D oyun yapıyorsanız KESİNLİKLE HATIRLATMA" mı diyorsunuz?
yoozer8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.