Oyunlarda araç programlama
(wassimulator.com)- Oyunlarda araç implementasyonu, gerçek bir fizik motorundan ziyade oyuncu deneyimini önceler
- Yarış ve simülasyon oyunlarının her birinde araç kontrolü ve sürükleyicilik hissi farklıdır
- Araç simülasyonu üç bileşenden oluşur: motor/şanzıman, lastikler, şasi
- Lastik modelleme ve slip kavramı, gerçekçi sürüş hissini oluşturmanın anahtarıdır
- Geliştirici, oyunun konseptine uygun sadeleştirme ve soyutlama düzeyini kendisi tanımlamalıdır
Araçların oyunlarda neden özel olduğu
Oyunlardaki araçlar, farklı türlerde önemli bir deneyim unsuru olarak kullanılır.
Gerçek dışı kontroller de gerçekçi sürüş simülasyonları da oyuncuya “araç kullanma hissini” aktarır.
Örneğin Mario Kart ile Assetto Corsa temelde çok farklı deneyimler hedeflese de, ikisinde de araç programlamanın özü aynıdır.
Buradaki odak, gerçek dünyanın fizik kurallarını birebir uygulamaktan çok, kullanıcının beklediği sürüş hissini nasıl aktaracağını belirlemektir.
Geliştiricinin amacı, ‘doğru simülasyon’dan ziyade hedeflenen deneyimi tasarlamaktır.
İlk denemeler ve çıkarılan dersler: AV Racer
AV Racer geliştirmesinin ilk aşamalarında araç, basit bir Newton mekaniği modeliyle hareket ettirildi; ancak bu yaklaşım gerçek bir araç hissi vermedi.
Dönüş, drift, açısal hız gibi unsurlar için tekrar tekrar hardcode çözümler ve parametre ayarlamaları yapıldı.
Deneysel bir “kayma” hissi üretilebildi, ancak bu ne uç durumlarda ne de gerçek sürücü beklentilerinde yeterli oldu.
Gerçek araç fiziği ile sürücü deneyimi yeterince anlaşılmadan, yaklaşım temel sınırlarına çarpar.
Sonunda bunu doğru yapmak için, gerçek dünyadaki araç dinamiği ilkelerini incelemek gerekti.
Oyun tipi araç simülasyonunun yapısı
Oyun içi bir araç, motor (ve şanzıman), tekerlek/lastik ve şasi olmak üzere üç kavramsal bileşene ayrılabilir.
Motor (şanzıman dahil)
- Gaz, vites değiştirme gibi girdileri alır
- Tork ve RPM üretir, bunları dişli oranına göre dönüştürür
- Tekerleklerle karşılıklı geri besleme ilişkisine girer (yani motor-tekerlek arasında çift yönlü senkronizasyon vardır)
Lastikler (tekerlekler dahil)
- Motor torku, fren, direksiyon, ağırlık, yol sürtünmesi gibi çeşitli girdileri alır
- Tüm kuvvetler lastik-yol temas noktasında oluşur
- Lastik modelleme (ör. Pacejka Magic Formula) ile gerçekçi kuvvetler elde edilir
Şasi
- Fizik motorundaki rijit gövde görevini görür
- Lastik kuvvetleri, hava direnci, yerçekimi, çarpışmalar gibi dış etkilerden etkilenir
- Aracın genel hareketini belirler ve lastik yükündeki değişimleri etkiler
| Bileşen | Başlıca girdiler | Başlıca çıktılar |
|---|---|---|
| Motor/şanzıman | Gaz, vites girdisi, tekerlek hızı | Dönme torku, RPM |
| Lastik | Motor torku, fren, direksiyon, yük, sürtünme | Şasi kuvveti, motor-tekerlek senkronizasyonu |
| Şasi | Lastik kuvvetleri, aerodinamik sonuçlar | Tekerlek yükü, genel hareket |
Gerçek bir araçtaki tüm ayrıntılı fiziği %100 doğrulukla uygulamak gerçekçi değildir.
Gerçek otomobil şirketlerinin araştırma laboratuvarları dışında, çoğu oyun ve simülasyon kara kutu modelleri, formüller ve sadeleştirilmiş yaklaşımlar kullanır.
Bu yüzden asıl mesele, neyin atlanacağına ve neyin öne çıkarılacağına tasarımcının karar vermesidir.
Motor ve aktarma sistemi tasarımı
Motor (tork üretiminin temeli)
- Gerçekte son derece karmaşık olsa da, kod tarafında girdi (RPM, gaz) → tork çıktısı veren basit bir kara kutu modeli olarak kurulabilir
- Tork/güç eğrileri sayısal değerler veya grafiklerle parametreleştirilerek, farklı karakterde motorlar simüle edilebilir
- Örnek: Desmos gibi araçlarla eğri doğrudan tasarlanabilir, böylece “motor karakteri” ayarlanabilir
Şanzıman
- Dişli oranı tablosu kullanılarak basitçe uygulanabilir
- Vites oranları, aracın ivmelenme karakteristiğini, azami hızını vb. belirler
- Basit görünse de oyuncu deneyimini güçlü biçimde etkiler
| Vites | Oran |
|---|---|
| R | -2.92 |
| N | 0 |
| 1 | 2.50 |
| 2 | 1.61 |
| 3 | 1.10 |
| 4 | 0.81 |
| 5 | 0.68 |
Motor ve tekerlek RPM senkronizasyonu
- Motor RPM’i ile çekiş tekerleklerinin açısal hızı birbirine bağlıdır
- İki durum değişkeni arasındaki farka dayanarak diferansiyel denklemlerle sayısal hesap yapılır
- Her karede “hedef değeri yakalama” mantığıyla kademeli eşleşme sağlanır
Böylece hem arcade tipi hem de simülatör tipi sistemlere genişletmek mümkün olur.
Oyuncu çeşitli motor parametrelerini (ör. kam profili, turbo vb.) ayarladığında, bunlar ses veya güç eğrisi değişimleriyle ilişkilendirilebilir.
Gerçek motordaki hareketi birebir taklit etmek gerekmese de, neden-sonuç ilişkisinin açıklığı aktarılır ve etkileşim deneyimi güçlenir.
Lastik modeli
Lastiğin rolü
- Aracın gerçek yolla temas eden tek parçasıdır
- İvmelenme, frenleme, viraj alma gibi tüm kuvvetler lastiğin temas yüzeyinde oluşur
- Kuvvet üretimi, elastik deformasyon ve sürtünme özellikleri etrafında şekillenir
Longitudinal (ivmelenme/frenleme) kuvvet ve Slip Ratio
- Lastik, statik sürtünme durumunda en yüksek yol tutuşu sağlar; sınır aşıldığında dinamik (slip) sürtünmeye geçer
- Slip Ratio, tekerleğin dönme hızı (çekiş/frenleme) ile zemindeki ilerleme hızı arasındaki farktan hesaplanır
- Slip Ratio = (tekerlek açısal hızı - serbest dönüş açısal hızı) / serbest dönüş açısal hızı
- Genel olarak ivmelenmede tekerlek zeminden hızlı döndüğünde, frenlemede ise daha yavaş döndüğünde slip oluşur
- Slip Ratio’ya bağlı yol tutuş değişimi bir eğri olarak gösterilebilir
- Belirli bir noktaya kadar tutuş artar, tepe noktasından sonra ise hızla düşer
Slip Ratio’yu kullanan kuvvet hesaplama formülleri (Pacejka Magic Formula vb.)
- Girdi olarak Slip Ratio’yu alıp karmaşık bir eğri üreten (parametreleştirilmiş sinüs/arktanjant) formüller kullanılır
- Her lastik için ayrı hesap yapılması gerekir
Lateral (viraj alma) kuvvet ve Slip Angle
- Viraj sırasında temas yüzeyi deformasyona uğradıkça Slip Angle oluşur
- Slip Angle = lastiğin gerçek ilerleme yönü ile tekerleğin gösterdiği yön arasındaki açı farkı
- Slip Angle büyüdükçe giderek daha fazla yol tutuş oluşur, ancak sınır aşıldığında kayma başlar
- Slip Angle ile yol tutuş arasındaki ilişki de kendine özgü bir eğri çizer
- Yük, sürtünme ve dinamik değişimler gibi birçok parametre bu ilişkiyi etkiler
Understeer / Oversteer gibi durumlar
- Understeer: Ön tekerleklerin Slip Angle değeri arka tekerleklerden büyük olduğunda araç niyet edilenden daha az döner
- Oversteer: Arka tekerleklerin Slip Angle değeri daha fazla olduğunda aracın arkası dışarı doğru kayar
- Doğru bir lastik modeli varsa, bu tür sürüş karakteristikleri doğal olarak ortaya çıkar
Longitudinal/lateral kuvvetlerin karşılıklı sınırı (Friction Circle)
- Lastik, ivmelenme/frenleme ve viraj alma yönlerinde aynı anda kuvvet üretirken, her yöndeki azami değer diğerini etkiler
- Friction Circle (çember/elips): İki kuvvet vektörünün toplamı sınırı aşamaz
- (F_{x}^2 + F_{y}^2 \le (\mu F_{z})^2)
- Örnek: sert fren + sert direksiyon durumunda kontrol kaybı daha kolay yaşanır
- Gerçek lastikler eğrisel ve doğrusal olmayan davranış gösterdiğinden, parametrelerin gerçek veriye göre ayarlanması gerekir
Kod içindeki uygulama
- Her lastikte longitudinal/lateral kuvvet ayrı ayrı hesaplanır
- Bu iki vektör toplanır ve varsayımsal bir friction circle içinde normalize edilir (scaling)
- Parametreler dinamik olarak ayarlanırsa, ileri düzey sürüş değişimleri de kolayca denenebilir
Genel araç fizik motoruna entegrasyon
- Lastik kuvvetleri + süspansiyon çıktısı + dış etkiler (yerçekimi, drag vb.) şasi üzerinde toplanır
- Newton’un hareket yasalarıyla her karede ivme ve hız güncellenir
Genişletilebilecek ek unsurlar
- Süspansiyon geometrisi: kamber, caster vb.
- Gelişmiş lastik dinamiği: sıcaklık, aşınma, genleşme, yük değişimi vb.
- Aerodinamik: downforce, drag, otomatik ayarlı spoiler
- Aktarma organları/diferansiyel, ABS, ESP, direksiyon sınırları vb.
- Gerekirse şu kitaplara başvurulabilir: Race Car Vehicle Dynamics (Milliken), Mechanics of Pneumatic Tires (S.K. Clark)
Sonuç
Yalnızca bu modellerle bile, gerçek araçlara benzer şekilde davranan oyun araçlarının temeli kurulabilir.
Ek ayrıntılar, geliştirme hedeflerine ve ihtiyaçlara göre genişletilebilir.
Kilit nokta, gerçek dünyadan alınan temel ilkelerin sadeleştirilmesi/soyutlanması ve oyuncu deneyimini merkez alan tasarım anlayışıdır.
Sorularınız veya görüş/düzeltme önerileriniz varsa iletişime geçin
2 yorum
'Araçta araç programlamak' diye yanlış okuyup bunun biraz tehlikeli bir şey olup olmadığını düşündüm.
Hacker News yorumu
İlginç olan şu ki, gerçekte en çok hareketli parçaya sahip olan şey motor olsa da, kod tarafında aslında tüm otomobil simülasyonunun en basit kısmı olabiliyor. Çünkü motorun temel görevi bir tork hesaplayıcısı olmak. Çeşitli girdileri alıp yalnızca dönme torku şeklinde tek bir çıktı veren bir kara kutu gibi. AngeTheGreat’in motor simülatörü video serisini özellikle tavsiye etmek isterim. Gerçek zamanlı çalışacak kadar optimize edilmiş olması ve hatta gerçekçi motor sesi üretmesi gerçekten hayranlık uyandırıyor. Bkz. AngeTheGreat motor simülatörü videosu
Automation oyunu, motor oluşturma/simülasyon tarafını oldukça derin işlemiş. Çeşitli motor deneyleri gerçekten çok eğlenceli ve ses simülasyonu kısmı da AngeTheGreat’in videosunda ele alınan bazı kavramları ödünç alıyor
Bu bana Houdini’de küp animasyonu yapılan klasik örneği hatırlattı. Gerçek zamanlı içten yanmalı motor simülasyonunda beklenmedik şeylerin ortaya çıkmasında ayrı bir keyif var. Houdini küp animasyonu örneği
Programlamaya başlamama vesile olan şey, babamın BASIC ile bir motor simülatörü yazmasıydı. Makine mühendisi olan babam, farklı motor tasarımlarının tork eğrilerini karşılaştırmak istiyordu. CIRCLE ve LINE komutlarıyla pistonların, krank grubunun ve krank milinin saniyeden kısa aralıklardaki karelerde hareket eden tel kafes çizimini yaptığında, bilgisayarla bir şeyler çizip hareket ettirmenin mümkün olması beni çok etkilemişti. Bu kişinin daha iyi yarış arabası sesleri üretmek için benzer bir iş yapmış olması gerçekten etkileyici
EV motorları aslında çok daha basit değil mi? Motor, küçük patlamaları kullanarak tork üretmenin pahalı ve karmaşık bir yolu. O yüzden oyunlardaki çoğu otomobilin aslında bir EV gibi davranıp davranmadığını merak ediyorum. Ya da ICE’yi daha doğru simüle etmiyorlarsa tabii
Army of Two’da tüm araç simülasyonundan ben sorumluydum. Bu yazı iyi bir giriş niteliğinde. Pacejka lastik modelini ve transmisyon diferansiyelini uygulamak çok yardımcı olmuştu. Bunun dışında, viraj denge çubuğu fiziği ve süspansiyonun “eğlenceli” bir sürüş hissi yaratmada ne kadar önemli olması da şaşırtıcı. Bunlar olmayınca sürüş kaygan ve içine girmesi zor hissettiriyor. Demo videoda da o his var. Viraj denge çubuğu ve süspansiyonu uygulamazsanız araç çok kolay devriliyor; bu da sizi sürekli lastik kayması ya da yüzey sürtünmesi ayarlarıyla oynamaya itiyor, ama aslında sürüş deneyimi daha kötü hale geliyor
Bu bilgi için gerçekten teşekkürler! Viraj denge çubuğunun temel modelde bu kadar önemli olduğunu bilmiyordum. Bu konuyu daha fazla inceleyip, iyi bir uygulama çıkarabilirsem yazıyı da güncellemeyi düşünüyorum
Son zamanlarda arabamın süspansiyonunda bir sorun çıktı ve “eğlenceli olmayan sürüşü” bizzat deneyimlemiş oldum. O yüzden buna daha da çok katılıyorum
Bu içerik, Flightle oyununu yaparken benim de doğrudan fark ettiğim şeylere çok benziyor. Mobil için yandan kaydırmalı bir uçuş simülatörü yapmıştım ama uçağın hareketi o kadar garip geliyordu ki sinirlenip “Bu ne kadar zor olabilir ki?” diye düşünerek kendim yapmaya başladım. Uçuş prensiplerini çalışırken doğru soyutlama seviyesinin önemli olduğunu anladım. Fazla gerçek dışı olursa eğlencesiz oluyor, fazla gerçekçi olursa da oynanış dengesini kurmak zorlaşıyor. Flightle bağlantısı
Yorumu düzenlemek için artık çok geçti ama deneyimlerimi daha ayrıntılı biçimde ayrıca yazıya döktüm. Yandan kaydırmalı uçuş simülatörü yapımı yazısına bakabilirsiniz. Bu arada, daha sonra uçağı bir nokta olmaktan çıkarıp iki kanadın bir çubukla bağlandığı bir yapıya dönüştürmeyi denedim; eğlenceli olacak şekilde ayarlamak ciddi uğraştırdı. Daha yetkin biri muhtemelen bunu daha iyi yapardı
Oyunu keyifle oynadım. Masaüstü kullanıcıları için fare tekerleğiyle slider’ları kontrol etme seçeneği eklemeyi önermek isterim
Eskiden iOS için araç ve drift simülasyonu içeren bir oyun yapmıştım. SpriteKit tabanlıydı ama herhangi bir 2D oyun motorunda da kolayca uygulanabilir. Temel fikir, önde duran iki tekerleği pin joint ile dikdörtgen gövdeye bağlamak ve tekerleklere kuvvet uygulamaktı. Kuvvetin açısı şöyle hesaplanıyordu: x = force * cos(bodyRotation + wheelRotation) y = force * sin(bodyRotation + wheelRotation) Buna skid particle da eklemiştim. Drift’i tekerlek ve gövde damping değerlerini ayarlayarak yaptım. Drift Mania Infinite Car Racer uygulaması
Oyunun gerçekten havası var! Anında başlaması hoşuma gitti. Skid particle kullanımı pratik olmuş. Görseller de güzel. Ama benim için fazla zordu. Duvara çarpınca reset atmayan bir “zen modu” gibi bir şey eklerseniz daha çok oynayabilirim gibi geliyor
Oyun gerçekten harika. Uygulama mağazası bu kadar rekabetçiyken 22 değerlendirme almış olmanız etkileyici. Tanıtımı nasıl yaptığınızı merak ettim
“Bu oyun muhteşem grafikler sunuyor...” şeklindeki kendini tiye alan mizah gerçekten çok tatlı. Hemen indiriyorum
Bu yazı samimi biçimde çok ilginçti. Sırf lastik modeli bölümü için bile birkaç kez okunur. Simülasyon ya da gerçekçilik falan hiç önemli değil, sadece eğlence amaçlıysa 1980’lerin arcade oyunu Super Sprint’in üstüne tanımam. Super Sprint oyun bilgisi
Notlarıma kaydettiğim ilgili sunumlardan bazılarını kopyalayıp yapıştırıyorum: Hamish Young, ‘Just Cause 4’ araç fiziği ve lastik dinamikleri Vehicle Physics and Tire Dynamics in 'Just Cause 4' Jan Erik Steel & Patrick Donnelly, ‘Skylanders’da süper şarjlı araç fiziği Supercharged! Vehicle Physics in 'Skylanders' Edward Pereira, off-road bilimi üzerine sunum The Science of Off-Roading Jared Cone, ‘Rocket League’in fiziği It IS Rocket Science! The Physics of 'Rocket League' Detailed
Yazının kendisi güzel ama giriş kısmı bana biraz kafa karıştırıcı geldi. Arabaların oyunlarda çok çeşitli gerçek dışı deneyimler sunduğunu söyleyip silahların böyle olmadığını iddia etmesine takıldım. Oysa oyunlarda son derece çeşitli gerçek dışı silahlar var. Ayrıca, araba kullanmaya dair beklentilerimizi doğrudan deneyimden değil medya ya da kültürel dolaylı deneyimlerden aldığımızı söylüyor ama bu bence silahlar için daha da geçerli değil mi? Zıplama gibi şeyler de oyunlarda çok farklı şekillerde ele alınıyor; ama benim zıplamaya dair beklentilerim, gerçek hayatta gerçekten zıplamış olmaktan çok daha güçlü biçimde geliyor
FPS oyunu geliştirme deneyiminiz pek yok gibi. Gerçek silahlar, oyunlardaki deneyimden farklıdır. Eğer oyunlar gerçek silahlarla tamamen aynı olsaydı çok daha sıkıcı ve hantal olurlardı. Yarış oyunlarında da aynı şekilde, eğlence için gerçeği biraz eğip bükmek gerekir
Bence bu konu “gerçekçilik” değil, “inandırıcılık” meselesi. Önemli olan oyuncunun inanabileceği bir deneyim yaratmak. Oyunlardaki silahlar gerçeklerinden farklıdır ama güçlü ve tehditkâr görünen bir fanteziyi önceler. Zıplama da aynı şekilde gerçekçi bir temele sahip olmak zorunda değildir; oyunun amacına en uygun biçimde tasarlanır. Buna karşılık, otomobiller gibi fiziksel doğruluğun ve sistematik modellemenin mümkün olduğu alanlarda daha gerçekçi tasvirler hedeflenir; hatta endüstriyel simülasyonlarla kıyaslanabilecek kadar. Ama insan hareketi, ekonomik sistemler, çatışma akışı gibi şeylerde aynı düzeyde gerçekçi yaklaşım çok daha zordur; bu yüzden çok daha karikatürize temsiller yaygındır. Oyun tasarımcısı, oyuncu beklentileriyle oyunun genel hedeflerine uyan uygun bir orta yol bulmalıdır. Aşırı ayrıntılı gerçekçiliğin peşine düşüp bütün yapıyı bozmak sık rastlanan bir tuzaktır
FPS örneği sahnede aceleyle aklıma gelmişti ama sonradan düşününce iyi bir örnek olmadığını fark ettim. Geri bildiriminiz için teşekkürler
Burada yokuş, rampa ve süspansiyon gibi unsurlar eksik gibi görünüyor. Unreal Engine’de çok basit bir araç demosu da var, gerçek süspansiyon modeli içeren demolar da
Sunumun ve yazının sonunda mevcut motor durumunu gösteren kısa bir video var; videoda yokuşlar, rampalar ve çeşitli arazi türleri yer alıyor. Sunumda ise basit düz bir grid kullanılıyor. Süspansiyon da uygulanmış durumda ama otomobillere özgü özel bir sorun olmaktan çok, sadece ağırlığı taşıyabilmeyi sağlayan genel bir özellik olduğu için sunumun süresi ve akışı açısından derinlemesine işlenmedi
Wassim’in soru-cevap kısmında söylediği gibi, süspansiyonu fizik motoru kendi hallediyor ve bunun etkisi lastik yüküne yansıyıp lastik kuvvetlerini de doğal olarak etkiliyor
Rocket League araç fiziği hakkında iyi bir GDC sunumu var. Bkz. Rocket League fizik sunumu. Bu arada, ben Rocket League’de oyun istemcisi tarafında değil başka bir alanda çalışan ekip üyelerinden biriydim
Bu yazıyı okurken yarış fiziği üzerine iyi bir sunum aklıma geldi. Andre Marziali - Physics of Racing