गेम में वाहन प्रोग्राम करना
(wassimulator.com)- गेम में वाहन इम्प्लीमेंटेशन में असली physics engine से ज़्यादा player experience को महत्व दिया जाता है
- हर racing और simulator गेम में वाहन नियंत्रण का तरीका और immersion अलग होता है
- वाहन simulation तीन घटकों से बना होता है: engine/gearbox, tire, chassis
- tire modeling और slip की अवधारणा यथार्थवादी driving feel बनाने की कुंजी है
- डेवलपर को गेम कॉन्सेप्ट के हिसाब से simplification और abstraction का स्तर खुद तय करना चाहिए
गेम में वाहन खास क्यों हैं
गेम के भीतर वाहन कई शैलियों में एक महत्वपूर्ण अनुभवात्मक तत्व के रूप में इस्तेमाल होते हैं
अवास्तविक नियंत्रण और यथार्थवादी driving simulation, दोनों ही “चलाने का एहसास” देते हैं
उदाहरण के लिए Mario Kart और Assetto Corsa मूल रूप से अलग अनुभव देना चाहते हैं, लेकिन दोनों में vehicle programming का सार एक जैसा है
असल दुनिया के physics laws को बिल्कुल सटीक लागू करने के बजाय, ध्यान इस बात पर होता है कि यूज़र जिस driving feel की उम्मीद करता है उसे कैसे पहुँचाया जाए
डेवलपर का लक्ष्य ‘accurate simulation’ से ज़्यादा इच्छित अनुभव को डिज़ाइन करना होता है
शुरुआती कोशिशें और सीख: AV Racer
AV Racer के शुरुआती विकास में वाहन को सरल Newtonian mechanics model से चलाया गया, लेकिन उससे असली वाहन जैसा एहसास नहीं मिला
rotation, drift, angular velocity जैसी कई चीज़ों के लिए बार-बार hardcoding और parameter tuning की गई
अनुभव के स्तर पर “slide” का एहसास तो बनाया गया, लेकिन extreme situations या वास्तविक ड्राइवर की अपेक्षाओं तक बात नहीं पहुँची
अगर वास्तविक vehicle physics और driver experience की समझ कम हो, तो बुनियादी सीमाओं से टकराना पड़ता है
आखिरकार सही इम्प्लीमेंटेशन के लिए वास्तविक vehicle dynamics के सिद्धांतों का अध्ययन करना पड़ा
गेम के लिए vehicle simulation की संरचना
गेम के भीतर वाहन को तीन वैचारिक हिस्सों में बाँटा जा सकता है: engine (और gearbox), wheel/tire, chassis
engine (gearbox सहित)
- throttle, gear change जैसे inputs लेता है
- torque और RPM निकालता है और gear ratio के अनुसार उन्हें बदलता है
- wheels के साथ feedback interaction करता है (यानी engine और wheel के बीच two-way synchronization)
tire (wheel सहित)
- engine torque, brake, steering, भार और road friction जैसे कई inputs लेता है
- tire-road contact point पर सभी बल उत्पन्न होते हैं
- tire modeling (जैसे Pacejka Magic Formula) से यथार्थवादी forces मिलती हैं
chassis
- physics engine में rigid body की भूमिका निभाता है
- tire forces, air resistance, gravity, collision जैसे बाहरी प्रभावों पर प्रतिक्रिया देता है
- पूरे वाहन की movement तय करता है और tire load variation को प्रभावित करता है
| घटक | मुख्य input | मुख्य output |
|---|---|---|
| engine/gearbox | throttle, transmission input, wheel speed | rotational torque, RPM |
| tire | engine torque, brake, steering, load, friction | chassis force, engine-wheel synchronization |
| chassis | tire force, aerodynamics के परिणाम | wheel load, कुल movement |
वास्तविक वाहन की तरह हर सूक्ष्म physics को 100% सटीक इम्प्लीमेंट करना व्यावहारिक नहीं है
जब तक आप किसी वास्तविक ऑटोमोबाइल कंपनी की research lab में न हों, ज़्यादातर गेम और simulation black-box models, formulas और simplified approaches का उपयोग करते हैं
इसलिए असली सवाल यह है कि क्या छोड़ा जाए और किस पर ज़ोर दिया जाए
engine और drivetrain डिज़ाइन
engine (torque output का केंद्र)
- वास्तविकता में यह बहुत जटिल है, लेकिन code में इसे input (RPM, throttle) → torque output वाले एक सरल black-box model के रूप में बनाया जा सकता है
- torque/power curve को numbers या graph से parameterize करके अलग-अलग nature वाले engines को simulate किया जा सकता है
- उदाहरण: Desmos जैसी चीज़ों से curve को सीधे डिज़ाइन करके “engine character” को adjust किया जा सकता है
gearbox
- gear ratio table का उपयोग करके इसे आसानी से इम्प्लीमेंट किया जा सकता है
- gear shifting वाहन की acceleration characteristics, top speed आदि तय करती है
- यह सरल है, लेकिन player experience पर इसका असर बहुत बड़ा होता है
| gear | ratio |
|---|---|
| R | -2.92 |
| N | 0 |
| 1 | 2.50 |
| 2 | 1.61 |
| 3 | 1.10 |
| 4 | 0.81 |
| 5 | 0.68 |
engine और wheel RPM synchronization
- engine RPM और driven wheel angular velocity एक-दूसरे से जुड़े होते हैं
- इन दो state variables के अंतर के आधार पर differential equation से numerical calculation की जाती है
- हर frame में “target value तक पीछा करने” वाले तरीके से दोनों को धीरे-धीरे match कराया जाता है
इससे arcade-style और simulator-style दोनों तरह के सिस्टम तक विस्तार संभव है
जब player engine parameters (जैसे cam profile, turbo आदि) बदलता है, तो उसे sound या output curve के बदलाव से जोड़ा जा सकता है
भले ही असली engine motion को हूबहू न दोहराया जाए, फिर भी cause-effect की स्पष्टता दी जा सकती है और interaction experience बेहतर होता है
tire model
tire की भूमिका
- वाहन का वास्तविक सड़क से संपर्क सिर्फ इसी हिस्से से होता है
- acceleration, braking, cornering जैसी सारी forces tire contact patch पर बनती हैं
- force generation मुख्य रूप से elastic deformation और friction characteristics पर आधारित होती है
longitudinal (acceleration/braking) force और slip ratio
- tire static friction की स्थिति में अधिकतम grip देता है, और सीमा पार होने पर dynamic (slip) friction में बदल जाता है
- slip ratio wheel rotational speed (drive/brake) और जमीन पर vehicle speed के अंतर से निकाला जाता है
- slip ratio = (wheel angular velocity - free rolling angular velocity) / free rolling angular velocity
- सामान्यतः acceleration में जब wheel जमीन से तेज़ घूमता है, और braking में धीमा होता है, तब slip होता है
- slip ratio के अनुसार grip force में बदलाव को graph curve के रूप में दिखाया जा सकता है
- एक खास बिंदु तक grip बढ़ती है, फिर peak के बाद तेज़ी से घटती है
slip ratio को शामिल करने वाले force formulas (Pacejka Magic Formula आदि)
- slip ratio को input लेकर जटिल curve देने वाले formulas (parameterized sine/arctangent) इस्तेमाल किए जाते हैं
- हर tire के लिए अलग calculation करनी पड़ती है
lateral (cornering) force और slip angle
- cornering के दौरान contact patch deform होता है और slip angle बनता है
- slip angle = tire की वास्तविक movement direction और wheel जिस दिशा में इशारा कर रहा है, उनके बीच का angle difference
- slip angle बढ़ने पर grip भी बढ़ती है, लेकिन सीमा से आगे बढ़ने पर tire फिसलने लगता है
- slip angle और grip का संबंध भी अपनी खास curve बनाता है
- load, friction, dynamic changes जैसे कई parameters इसका असर बदलते हैं
understeer/oversteer जैसी घटनाएँ
- understeer: जब front wheel का slip angle rear wheel से बड़ा हो, तो गाड़ी इच्छित मात्रा से कम मुड़ती है
- oversteer: जब rear wheel का slip angle ज़्यादा हो, तो गाड़ी का पिछला हिस्सा बाहर की ओर फिसलता है
- अगर सही tire model हो, तो ये handling characteristics अपने-आप उभरते हैं
longitudinal/lateral forces की पारस्परिक सीमा (Friction Circle)
- जब tire acceleration/braking और cornering दोनों दिशाओं में एक साथ force इस्तेमाल करता है, तो दोनों दिशाओं की सीमा एक-दूसरे को प्रभावित करती है
- friction circle (circle/ellipse): दोनों force vectors का योग सीमा से ऊपर नहीं जा सकता
- (F_{x}^2 + F_{y}^2 \le (\mu F_{z})^2)
- उदाहरण: तेज़ braking + तेज़ steering के दौरान control खोना आसान हो जाता है
- वास्तविक tire curve और nonlinear behavior दिखाते हैं, इसलिए real-world data के अनुसार parameter tuning ज़रूरी होती है
code में इम्प्लीमेंटेशन
- हर tire के लिए longitudinal और lateral forces अलग-अलग निकाली जाती हैं
- दोनों vectors को जोड़कर एक virtual friction circle के भीतर normalize (scaling) किया जाता है
- parameters को dynamically adjust करके handling behavior में बड़े बदलावों का आसानी से प्रयोग किया जा सकता है
पूरे vehicle physics engine के साथ integration
- tire force + suspension output + external effects (gravity, drag आदि) को chassis पर aggregate किया जाता है
- Newton के motion laws के अनुसार हर frame में acceleration और velocity update होती है
आगे जोड़े जा सकने वाले अतिरिक्त तत्व
- suspension geometry: camber, caster आदि
- advanced tire dynamics: temperature, wear, expansion, load change आदि
- aerodynamics: downforce, drag, automatic spoiler control
- drivetrain/differential, ABS, ESP, steering limits आदि
- ज़रूरत पड़ने पर कई किताबों का संदर्भ लिया जा सकता है: Race Car Vehicle Dynamics(Milliken), Mechanics of Pneumatic Tires(S.K. Clark)
निष्कर्ष
इन मॉडलों के सहारे ही ऐसे गेम-वाहन की बुनियाद बनाई जा सकती है जो वास्तविक वाहन जैसा व्यवहार करे
अतिरिक्त detail को development goals और ज़रूरत के अनुसार आगे बढ़ाया जा सकता है
मुख्य बात है वास्तविक दुनिया से लिए गए मूल सिद्धांतों का simplification/abstraction और player experience-केंद्रित design philosophy
अगर कोई सवाल, राय या संशोधन सुझाव हो, तो संपर्क करें
2 टिप्पणियां
मैंने इसे गलती से 'वाहन से वाहन प्रोग्रामिंग करना' पढ़ लिया और सोचा, अरे यह तो थोड़ा खतरनाक नहीं है क्या?
Hacker News टिप्पणियाँ
एक दिलचस्प बात यह है कि असल में engine में सबसे ज़्यादा moving parts होते हैं, लेकिन code में वही पूरी car simulation का शायद सबसे सरल हिस्सा होता है। क्योंकि engine का मुख्य काम torque calculator होना है। यह कई inputs लेकर rotational torque नाम का सिर्फ़ एक output देने वाले black box जैसा लगता है। मैं AngeTheGreat की engine simulator video series ज़रूर recommend करना चाहूँगा। यह इतना optimized है कि real-time में चल सके, और इसमें असली जैसे engine sounds भी बनते हैं, जो सच में हैरान करता है। AngeTheGreat engine simulator video देखें
गेम Automation में engine builder/simulation बहुत गहराई से implement किया गया है। अलग-अलग engine experiments करना सच में मज़ेदार है, और sound simulation वाला हिस्सा भी AngeTheGreat के वीडियो में आने वाले कुछ concepts अपनाता है
इससे Houdini में cube animate करने वाला classic example याद आ गया। real-time internal combustion engine simulation में अनपेक्षित चीज़ें होने का अलग ही मज़ा है। Houdini cube animation example
मैंने programming शुरू ही इसलिए की थी क्योंकि मेरे पिता BASIC में engine simulator लिख रहे थे। वे mechanical engineering engineer थे और अलग-अलग engine designs के torque curves compare करना चाहते थे। जब वे CIRCLE और LINE commands से pistons, crank assembly, और crankshaft का wireframe बनाते थे, जो एक सेकंड से भी कम frame intervals पर हिलता-डुलता था, तब यह देखकर मैं चौंक गया था कि computer से चीज़ें बनाई और animate की जा सकती हैं। यह जानकर और भी प्रभावशाली लगता है कि इस व्यक्ति ने बेहतर racing car sounds बनाने के लिए वही काम किया
क्या EV motor असल में काफ़ी simple नहीं होती? Engine छोटे explosions का इस्तेमाल करके torque बनाता है, इसलिए वह महंगा और complex है। इसलिए मैं सोचता हूँ कि क्या गेम की ज़्यादातर cars EV की तरह behave नहीं करतीं, या फिर तब तक जब तक ICE को ज़्यादा सही तरीके से simulate न किया जाए
मैंने Army of Two में पूरी vehicle simulation पर काम किया था। यह लेख एक अच्छा introduction है। Pacejka tire model और transmission differential लगाने से बहुत मदद मिली थी। इसके अलावा, यह थोड़ा surprising है कि anti-rollbar physics simulation और suspension “मज़ेदार” driving feel बनाने में बेहद महत्वपूर्ण हैं। इनके बिना driving फिसलनभरी लगती है और immersion टूट जाता है। demo video में भी वही एहसास है। अगर anti-rollbar और suspension implement न करें, तो कार आसानी से पलट जाती है और फिर आप बार-बार tire slip या surface friction settings ही tweak करते रहते हैं, जबकि driving experience और खराब हो जाता है
इस जानकारी के लिए सच में धन्यवाद! मुझे नहीं पता था कि basic model में anti-rollbar इतना महत्वपूर्ण होता है। मैं इस पर और पढ़ने वाला हूँ, और अगर ठीक से implement कर पाया तो लेख भी update करूँगा
हाल ही में मेरी अपनी कार के suspension में समस्या आ गई, तो मुझे “unfun driving” का firsthand अनुभव हुआ। अब इस बात से और ज़्यादा सहमति है
यह बात बहुत हद तक वैसी ही है जैसी मुझे Flightle बनाते समय खुद समझ आई थी। मैंने mobile के लिए एक side-scrolling flight simulator बनाया था, लेकिन plane की movement इतनी अजीब लग रही थी कि ग़ुस्से में मैंने सोचा, “इसमें मुश्किल क्या है?” और खुद बनाना शुरू कर दिया। Flight के principles पढ़ते-पढ़ते समझ आया कि abstraction का सही level बहुत महत्वपूर्ण है। बहुत unreal हो तो मज़ा नहीं आता, और बहुत realistic हो तो play balancing मुश्किल हो जाती है। Flightle link
अब comment edit करने में देर हो चुकी है, लेकिन मैंने अपने detailed अनुभवों को अलग से एक पोस्ट में लिख दिया है। Making a side-scrolling flight simulator देखें। वैसे, बाद में मैंने plane को point representation से बदलकर दो wings को rod से जुड़े structure में किया था, और उसे मज़ेदार तरीके से tune करने में बहुत मशक्कत करनी पड़ी। कोई ज़्यादा skilled व्यक्ति शायद इसे बेहतर कर पाता
गेम मज़े से खेला। अगर desktop users के लिए mouse scroll wheel से slider control हो सके तो अच्छा होगा
मैंने पहले iOS के लिए एक ऐसा गेम बनाया था जो vehicle और drifting simulate करता था। यह SpriteKit पर आधारित था, लेकिन किसी भी 2D game engine में इसे आसानी से किया जा सकता है। मूल idea यह था कि सामने के दो wheels को pin joints से rectangular car body से जोड़ा जाए, और wheels पर force लगाया जाए। Force का angle इस तरह calculate किया जाता है: x = force * cos(bodyRotation + wheelRotation) y = force * sin(bodyRotation + wheelRotation) इसमें skid particles भी जोड़े थे। Drifting को wheel और body damping values adjust करके implement किया था। Drift Mania Infinite Car Racer app
गेम में सच में feel है! मुझे इसका तुरंत शुरू हो जाना पसंद आया। skid particles practical हैं। visuals भी अच्छे हैं। लेकिन मेरे लिए difficulty बहुत ज़्यादा थी। अगर कोई “zen mode” जोड़ दें जिसमें दीवार से टकराने पर reset न हो, तो शायद मैं इसे ज़्यादा खेलूँ
गेम बहुत बढ़िया है। App market में competition इतना ज़्यादा है, ऐसे में 22 reviews मिलना ही बड़ी बात है। जानना चाहूँगा कि आपने promotion कैसे किया
“This game offers stunning graphics...” वाला self-deprecating humor बहुत प्यारा है। मैं अभी download कर रहा हूँ
यह पोस्ट सच में बहुत दिलचस्प थी। सिर्फ़ tire model वाला हिस्सा ही मैं कई बार पढ़ूँगा। अगर simulation या reality जैसी किसी चीज़ की ज़रूरत न हो और सिर्फ़ fun चाहिए, तो 1980s arcade game Super Sprint जैसा शायद कुछ नहीं। Super Sprint game info
मैंने अपने notes में सेव किए हुए कुछ संबंधित talks को copy/paste किया है: Hamish Young, ‘Just Cause 4’ vehicle physics और tire dynamics Vehicle Physics and Tire Dynamics in 'Just Cause 4' Jan Erik Steel & Patrick Donnelly, ‘Skylanders’ में supercharged vehicle physics Supercharged! Vehicle Physics in 'Skylanders' Edward Pereira, off-roading science पर talk The Science of Off-Roading Jared Cone, ‘Rocket League’ की physics It IS Rocket Science! The Physics of 'Rocket League' Detailed
लेख खुद तो बढ़िया था, लेकिन शुरुआती हिस्सा थोड़ा confusing लगा। इसमें कहा गया है कि cars games में तरह-तरह के unrealistic experiences देती हैं, लेकिन guns ऐसा नहीं करतीं—यह बात मुझे अटपटी लगी। असल में games में तरह-तरह की unrealistic guns भरी पड़ी हैं। और यह कहना कि driving के बारे में हमारी expectations direct experience से नहीं बल्कि media या cultural indirect experience से आती हैं—क्या यह बात guns पर और भी ज़्यादा लागू नहीं होती? Jumping जैसी चीज़ें भी games में बहुत अलग-अलग तरह से handle होती हैं, लेकिन jumping के बारे में मेरी expectations तो असली “कूदने के अनुभव” से कहीं ज़्यादा बनती हैं
लगता है आपने FPS games ज़्यादा नहीं बनाए हैं। असली guns, games में उनके अनुभव से अलग होती हैं। अगर games बिल्कुल real guns जैसे होते, तो वे कहीं ज़्यादा कम मज़ेदार और ज़्यादा frustrating होते। Racing games में भी वही बात लागू होती है—fun के लिए reality को थोड़ा मोड़ना पड़ता है
मुझे लगता है यह विषय ‘realism’ नहीं बल्कि ‘verisimilitude’ का है। ज़रूरी यह है कि खिलाड़ी को एक ‘विश्वसनीय’ अनुभव मिले। Games की guns असल से अलग होती हैं, लेकिन वे power और threat की fantasy को प्राथमिकता देती हैं। Jumping भी किसी realistic आधार पर नहीं टिका होता, बल्कि game के उद्देश्य के हिसाब से सबसे सही रूप में design किया जाता है। दूसरी ओर, cars जैसे क्षेत्रों में physical fidelity और systemization संभव है, इसलिए वहाँ realistic depiction की ओर झुकाव रहता है, यहाँ तक कि industry simulations से तुलना की जा सके। लेकिन human movement, economic systems, combat flow जैसी चीज़ों में उस स्तर की realism approach कठिन है, इसलिए वहाँ कहीं ज़्यादा cartoonish expression मिलते हैं। Game designer को player expectations और पूरे game के goals के बीच सही compromise करना पड़ता है। सिर्फ़ बारीक realism के पीछे भागकर पूरी संरचना खराब कर देना एक आम जाल है
FPS वाला example मैंने मंच पर जल्दी में सोचकर दे दिया था, लेकिन बाद में विचार करने पर समझ आया कि वह अच्छा example नहीं था। बात बताने के लिए धन्यवाद
लगता है hills, ramps, suspension जैसी चीज़ें इसमें छूट गई हैं। Unreal Engine में एक बहुत simple vehicle demo भी है और एक ऐसा demo भी जिसमें असली suspension model है
presentation और लेख के अंत में एक छोटा video है जो actual engine की मौजूदा स्थिति दिखाता है, और उस video में hills और ramps समेत तरह-तरह का terrain implement किया गया है। Presentation में simple flat grid इस्तेमाल की गई थी। Suspension भी implement किया गया है, लेकिन वह car-specific विशेष समस्या कम और वजन संभालने वाली एक सामान्य सुविधा ज़्यादा है, इसलिए presentation की लंबाई और flow के हिसाब से उसे गहराई से नहीं लिया गया
जैसा Wassim ने QA में कहा, suspension को physics engine अपने आप संभाल लेता है, और उसका असर tire load में दिखाई देता है, जिससे tire forces पर भी स्वाभाविक रूप से प्रभाव पड़ता है
Rocket League की vehicle physics पर एक अच्छा GDC talk है। Rocket League physics talk देखें। वैसे, मैं Rocket League में game client पर नहीं बल्कि किसी और हिस्से पर काम करने वाली टीम का सदस्य था
यह पढ़ते हुए मुझे racing physics पर एक अच्छी talk याद आ गई। Andre Marziali - Physics of Racing