“Acemi” Oyun Projelerinin Ötesinde


22

Bu cevabı bir oyun geliştiricisinin bilmesi gereken matematik türü üzerine okuyordum ve bu kısım gerçekten bana dikkat çekti:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

Bu şekilde yapmayı düşünürdüm, bu yüzden beceri seviyemi gösterir. En azından geçmişte yaptığım 2B yandan kaydırma, arcade tarzı oyunlar için gerekli olan tek şey bu. Bu ve biraz trigonometri.

Aslında, o yazıyı okumadan önce çok fazla lineer cebir kullanmadım, hatta kuaterniyonları bile duymadım. Bu matematik, siz 3B ile çalışana kadar ortaya çıkmadığı için mi yoksa 2B oyunlarımın saf uygulamalar ile kaçmam için oldukça basit olduğu için mi?

Takip eden soru: Eğer bu matematik türünü tanımak istersem, ne tür projeler üstlenmeliyim? IE: bir oyun motoru yazın, bir 3D oyun üzerinde çalışın, vb.


1
khanacademy.org acemi ve ileri matematik öğrenmek için mükemmeldir. Ayrıca başarılar var! Sıkıcı bir akademiyi canlandırmak için oyun teorisi gibisi yoktur.
yavaşladı

Yanıtlar:


16

Bununla ilgili gerçek numara, lise düzeyinde bilimdir; hangi gerekir yaptık. Yaptığın durumunda hızlı bir Google arama alacak değil başlamıştır . 'Acemi' zihniyetten nasıl uzak durduğunuzu açıklamak için ay arazi örneğini alın.

Bir kere okuduğunuzda [change in position] = [velocity] * [time passed], bu değişkenleri takip etmenin gerekli olacağı netleşti:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Bundan sonra, hızı her karenin konumuna uygularsınız:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Şimdi her karenin hızını değiştirmek istiyoruz ki yerçekimi ekleyebilelim. Tam olarak aynı kaynağa göre [change in velocity] = [acceleration] * [time passed]. Bu nedenle aynı prensibi uygulayabiliriz:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Şimdi oyuncunun uzay aracını kontrol etmesi için bir yola ihtiyacınız var. Temel fizik hakkında daha fazla okumaktan hareketin kuvvetin sonucu olduğunu öğreneceksiniz - bir kaynak bulamıyorum ama [change in acceleration] = ([force] / [mass]) * time(hatırladığım kadarıyla). Böylece oyuncu bir tuşa bastığında, basitçe fxve fydeğişkenlerini bir şeye ayarlayacak ve denkleminizi güncelleme sırasında uygulayacaksınız.

Sonuçta oyununuzdaki nesnelerin etrafındaki fiziği düşünmeniz gerekir - ve onları düşündüğünüz gibi hareket ettirmeye çalışmak yerine , denklemi arayın .

Gelecek Not: Bunun kesinlikle fizik yapmanın en iyi yolu olmadığını unutmayın (buna Euler Entegrasyonu denir ve düşük kare hızında bazı garip senaryolara yol açabilir) - başka şeyler yapmanın yollarını aramanız gerekir (Bu makalede oldukça çıplak temelleri de güzel yazma). Ancak, Euler Integration ile bağlantıda kalın, çünkü bir şeyi daha az öğrenmeye çalışıyorsunuz demektir.

Hangi oyunlar size doğru zihniyette düşünmeyi öğretir?

İşleri doğru yaptığınızı ve doğru zihniyetle yaptığınızı nasıl test edersiniz? Sleep(10 milliseconds)Oyun döngünüze bir a ekleyin ve her şey hala tam kare hızıyla aynı şekilde hareket etmeli ve tepki vermelidir.

Son olarak, 2D oyunların çalışmasını sağlama konusunda iyi bir deneyime sahip oluncaya kadar lütfen 3D'den (ve dolayısıyla Quaternions ve Matrices'ten) uzak tutun. Oldukça az sayıda oyun geliştiricisinin Quaternions veya Matrices'in nasıl çalıştığını gerçekten bilmediğini - ancak yalnızca nasıl kullanılacağını bilmediğini - onlara daha sonra yaklaşmalarını (ya da asla, 2D oyunların çok eğlenceli olduğunu ve oldukça eğlenceli olabileceğini söylemeye teşebbüs etmek istiyorum] diyeceğim. başarılı). Bunu temel düzeyde yapmak için gerçekten lineer cebiri bilmeniz ve bunun gibi bir şey yapmanıza gerek yoktur (ancak gerçekten yardımcı olur, eğer yapabilirseniz bazı gece sınıflarına gidin).

Nihai Bonus: my resim öğretmeni hep bana bir şey "ne çizmiyorsun olduğunu düşünüyorum Gördükleriniz çizmek, bkz." Aynı şey burada da geçerlidir "ne düşündüğünü modelleme ( object.position++), ne olacağını modelleme (` object.position + = velocity * time) "- en azından makul sınırlar için (tamamen doğru bir sistemi modellemiyorsun, ama iyi bir taklit olan şey).


Test için yapay gecikme ekleme fikrini seviyorum. Ayrıca, Dünya'nın yerçekimi 9, 9,1 değil
Steve

Gerçek bir simülasyon yazmadığınız sürece “ne olduğunu modelleme, ne olduğunu modelleme” konusunda dikkatli olun. Projeniz için gerektiği gibi ölçeklendirin. Bazen "ne olduğunu düşünüyorsun" tasarımınız için iyi bir cevaptır.
kaosTechnician

@chaosTechnician bu seviyede "ne olduğunu sanıyorsun" object.position++. Cevabı açıklığa kavuşturacağım.
Jonathan Dickinson

-1 instead of trying to make them move in the way you would think, rather look up the equation. Yaklaşık var anlamak onları aramıyorum, denklemler. En önemlisi oyunu eğlenceli kılmak ve kim bilir, belki biraz değişken ivmelenmeyi bulabilirsin, yerçekimini daha eğlenceli hale getirir. Fakat denklemleri anlamıyorsanız , bunun nasıl yapılacağına karar vermek çok zor olacak .
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft, ona tam olarak açıkladığım şeydi: denklemi ilk etapta tanımamak, onu asla anlayamayacağınız anlamına gelir - ve onları anlamanın tek yolu, onları gerçek bir durumda kullanmaktır.
Jonathan Dickinson

3

Bağlandığınız cevabın kısımlarının sunumlarında biraz elitist olduğunu düşünüyorum. Vektör matematiğinin erdemlerini vurgulamak, sonra bir nesnenin bir pozisyona, yöne ihtiyaç duyduğunu söylemek ve ivme tutarsızca spesifiktir, çünkü bu aslında sadece bir şeyden aşağı object.position.x += (object.velocity.x + object.acceleration.x) * deltaTimekaymaya başlayacaktır - temelde, bundan farklı değildir object.position.x++. Kuaterniyonlar, rotasyonları temsil etmenin birçok yolundan biridir; Onları seviyorum ama 3D dönüşleri anlamak için gerekli değiller. Birçok Quaternion kullanıcısı ne ima ederse de, onlar dönme matematiğinin Kutsal Kaseği değildir.

Doğrusal cebirin ilkeleri basit 2B hareket, döndürme, vb. Şeklinde mevcuttur, fakat matematik daha basittir çünkü sadece iki boyut vardır. İşte bir örnek .

Doğrusal cebir bilginizi öğrenmek / geliştirmek için birçok yol vardır:

  1. Doğrusal cebir içerisinde bir kursa gitmeyi düşündüm, fakat benim yüküm zaten oldukça ağırdı, bu yüzden fazladan çalışmayı haklı çıkaramadım.
  2. Doğrusal cebir anlayışım bir dizi oyun motoru programlama dersi aldığım için çok daha önemli bir şekilde büyüdü. Benim için, Vektörlerin, Matrislerin vb. Kullanımı (genellikle konuşur), şeylerin motor tarafında, oyun tarafında olduğundan daha yaygındı. Tabii ki, bu oyun kodunda matris kullanmadığım anlamına gelmiyor - sadece motor kodlamada kullandığım sıklıkta kullanmıyorum. YMMV
  3. Ayrıca, bilmeniz gereken matematiği anlamanıza yardımcı olabilecek birçok kitap vardır. "Oyunlar için 3D Matematik" başlıklı bir bölümü olan bu kitabı seviyorum .

Son olarak, oyunlarınızın tasarımı karmaşık matematik gerektirmiyorsa, onu kullanmayın. :) Ama elbette, bunun bir oyun tasarlamaya başlamanızı engellemesine izin vermeyin.


0

2B için kuaterniyonlar, hesaplama yolunda çok pahalı olduğundan bahsetmemek yerine, tamamen eksiktir. Bitmap döndürme (2D), birçok platform / kitaplık tarafından örtük olarak ele alınır, çünkü herhangi bir uygulamanın yazılması çok önemlidir ve olmasa bile 2D bitmaplerin döndürülmesi, basit bir trig işaretinden başka bir şey değildir. 3B'de, elbette, insan bisiklet sürmek zorunda kaldıklarında 3B kod yazarak büyüdüklerini söylemedikçe, insanlar ortalama bir insan için çok daha az sezgisel hale geliyor.

Doğrusal cebir, 2B'ye olduğu gibi 2B'ye de uygulanabilir ve yalnızca lise matematiği yapmış olsanız bile aşina olduğunuz bir şey olmalıdır. Hiç çizgi kavşakları yaptıysanız veya bir çizgiye periyodik olarak komplo oluşturduysanız (entegrasyon), doğrusal cebir kullandınız.

3B matematiği öğrenmek, genellikle 3B uzaya basit bir nesneyi (bir küp gibi) yerleştirmekle ve o nesneyi farklı açılardan görebilen hareketli bir kamera uygulamakla başlar ve bu bakış açısı işleri daha da basitleştirmek için dik açılabilir. Bu, ekranınızı temsil eden 3B düzlem üzerine noktaları yansıtmakla ilgilidir ( buradaki formül , bunu y'ye ek olarak x ve z eksenine genişletirsiniz). Gerçekten, bu sizin deneyim seviyenizden bağımsız olarak, herhangi bir 3B motoru yazmaya başladı. Flash ve Processing.js, bunun gibi bir şeyi kolayca prototip yapmak için iki harika yoldur.


0

Doğrusal cebirin ve daha karmaşık matematiğin genellikle 3B grafikleri ve 3B alanı içerdiği yolundasınız. Fakat 2D oyunlarda yapılabilecek daha fazla matematik var. Fizik matematiği oldukça sertleşebilir ve yumuşak vücut fiziği ve B-spline dinamiklerini göz önünde bulundurursanız daha karmaşık hale gelir (ve hala 2B olarak aklınızda bulundurun)

Genel 2D şekiller için çarpışma ele almayı ve yanıtı kapsayacak bir fizik kütüphanesi oluşturmayı veya incelemeyi deneyin. Doğrusal cebir, çarpışmalar için yörünge vektörlerini hesaplamakta oldukça faydalıdır. Nokta ürün, trigonometride kullanılan birim çember ile oldukça ilgilidir. Ancak, katı cisim fiziğinin karmaşıklığı, 3D olarak uygulandığında katlanarak artmaktadır.

3B grafikler, matris hesaplamaları, kuaterniyonlar, doğrusal cebir ve bazı uygulamalı matematiğin daha iyi anlaşılmasını sağlar. Muhtemelen alacağınız ilk şey, 3B alanda nesneleri taşımak ve işlemek için matris kullanmaktır.


0

2D oyunlar yazıyorsanız, muhtemelen zaten lineer cebir kullanıyorsunuzdur. Resmen en azından vektörlerle ilgili temel bilgileri öğrenmek oldukça kolaydır, ancak aksi takdirde karmaşık hareketler hakkında düşünmeyi basitleştirmede uzun bir yol vardır.

Örneğin, burada, bir topdan atılan bir top mermisi veya homing-füzesi gibi kavisli hareketi simüle etmek için hangi denklemlerin kullanılacağı hakkında birçok soru alıyoruz. Fakat vektörleri anlarsanız, ihtiyacınız olan tek "denklem", iki vektörü bir araya getirmek içindir. Sadece bu değil, aynı zamanda hava sürtünmesi veya sürtünme gibi şeyler eklemek inanılmaz derecede basit hale gelir - sadece sürükle-vektörünü hesaplayın ve hıza ekleyin. Presto!

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.