प्रगत भौतिकशास्त्र सोल्व्हरसह सिम्युलेशन आणि कार्यक्षमतेत सुधारणा


२०१६ मध्ये, आम्ही विविध नवीन भौतिकशास्त्र बंधनांसाठी समर्थन जोडले, ज्यामुळे विकासकांना नवीन सोल्व्हरकडे स्थलांतर करण्यास प्रोत्साहन मिळाले आणि भौतिकशास्त्र इंजिनच्या सर्जनशील क्षमता वाढवल्या. कोणत्याही नवीन प्रकल्पात डीफॉल्टनुसार PGS सोल्व्हर वापरला जात होता, तर क्लासिक सोल्व्हरकडे परत जाण्याची पर्यायी सोय होती.
२०१८ च्या मध्यात हायब्रिड LDL-PGS सॉल्व्हर सादर करून आम्ही उच्च द्रव्यमान फरक आणि जटिल यंत्रणांशी संबंधित काही स्थिरता समस्या दूर केल्या. यामुळे जुना सॉल्व्हर अप्रचलित झाला आणि २०१९ मध्ये तो पूर्णपणे अक्षम करण्यात आला, ज्यामुळे सर्व ठिकाणे आपोआप PGS कडे स्थलांतरित झाली.
२०१९ मध्ये, सिम्युलेशनला जोडलेल्या बेटांच्या गटांमध्ये विभाजित करणाऱ्या मल्टी-थ्रेडिंगचा वापर करून कामगिरी आणखी सुधारण्यात आली. आम्हाला अद्यापही LDL शी संबंधित कामगिरीच्या समस्या होत्या, ज्या आम्ही अखेरीस २०२० च्या सुरुवातीला सोडवल्या.
फिजिक्स इंजिनचे कामगिरीसाठी सुधारणा व ऑप्टिमायझेशन अद्याप सुरू आहे, आणि आम्ही येत्या काळात नवीन वैशिष्ट्ये जोडण्याचे नियोजन करत आहोत.
भौतिकशास्त्राच्या नियमांची अंमलबजावणी

भौतिकी इंजिनचे मुख्य उद्दिष्ट म्हणजे आभासी वातावरणात वस्तूंच्या हालचालींचे अनुकरण करणे. आमच्या भौतिकी इंजिनमध्ये आम्ही अशा वस्तूंवर लक्ष केंद्रित करतो ज्या कठोर आहेत, एकमेकांशी धडकतात आणि एकमेकांवर बंधने असतात.
फिजिक्स इंजिन दोन टप्प्यांमध्ये विभागलेले असते: टक्कर शोधणे आणि समस्या सोडवणे. टक्कर शोधण्याच्या टप्प्यात, कठोर वस्तूंशी संबंधित भूमितींमध्ये आंतरछेद शोधले जातात आणि टक्कर बिंदू, सामान्य दिशानिर्देश व प्रवेशाची खोली यांसारखी योग्य टक्कर माहिती तयार केली जाते. नंतर, वापरकर्त्याने दिलेल्या बंधनांनुसार आणि शोधलेल्या टक्करानुसार सॉल्व्हर कठोर वस्तूंच्या हालचालीत बदल करतो.

ही हालचाल सॉल्व्हरद्वारे ऊर्जा आणि संवेग संरक्षण यांसारख्या भौतिकशास्त्राच्या नियमांचे अर्थ लावण्याचा परिणाम आहे. परंतु हे १००% अचूकपणे करणे अत्यंत महाग आहे, आणि वास्तविक वेळेत सिम्युलेट करण्याची युक्ती म्हणजे कार्यक्षमता वाढवण्यासाठी अंदाजे गणना करणे, जोपर्यंत निकाल भौतिकदृष्ट्या वास्तववादी राहतो. जोपर्यंत हालचालीचे मूलभूत नियम योग्य सहिष्णुतेत राखले जातात, तोपर्यंत संगणक गेम सिम्युलेशनसाठी हा समतोल पूर्णपणे स्वीकारार्ह आहे.
लहान पावले उचलणे
फिजिक्स इंजिनची मुख्य कल्पना म्हणजे टाइम-स्टेपिंग वापरून हालचालीचे डिस्क्रेटाइझेशन करणे. बंधित आणि अविबंधित कठोर वस्तूंच्या हालचालीचे समीकरणे थेट आणि अचूकपणे समाकलित करणे खूपच अवघड असते. डिस्क्रेटाइझेशन हालचालीचे लहान वेळेच्या टप्प्यांमध्ये विभाजन करते, जिथे समीकरणे सुलभ आणि रेखीय केली जातात, ज्यामुळे ती अंदाजे सोडवणे शक्य होते. याचा अर्थ असा की प्रत्येक वेळेच्या टप्प्यात बंधनात सामील असलेल्या कठोर वस्तूंच्या संबंधित भागांच्या हालचालीचे रेखीय अंदाजे केले जाते.

जरी रेखीय समस्या सोडवणे सोपे असले तरी, ती घूर्णन गतीसारख्या गैर-रेखीय वर्तनांचा समावेश असलेल्या सिम्युलेशनमध्ये विचलन निर्माण करते. पुढे आपण विचलन कमी करण्यासाठी आणि सिम्युलेशन अधिक विश्वासार्ह बनवण्यासाठी उपाय पाहू.
समाधान


हे अॅनिमेशन दाखवते की PGS सॉल्व्हर पुनरावृत्ती प्रक्रियेच्या प्रत्येक टप्प्यावर शरीरांच्या स्थिती कशा बदलतो, ज्याचा उद्देश प्रत्येक टप्प्यावर द्रव्याच्या केंद्रबिंदूचे संरक्षण करत बॉल आणि सॉकेट बंधने पाळणाऱ्या स्थिती शोधणे आहे (ही IK ड्रॅगरद्वारे वापरली जाणारी एक प्रकारची स्थिती सॉल्व्हर आहे). जरी या उदाहरणाचे सोपे विश्लेषणात्मक समाधान असले तरी, हे PGS च्या मागील संकल्पनेचे चांगले प्रदर्शन आहे. प्रत्येक टप्प्यावर, सोल्व्हर एका बंधनाला स्थिर ठेवतो आणि दुसऱ्या बंधनाचे उल्लंघन होऊ देतो. काही पुनरावृत्तीनंतर, घन खूपच त्यांच्या योग्य स्थानांच्या जवळ येतात. या पद्धतीचे एक वैशिष्ट्य म्हणजे काही कठीण घन त्यांच्या अंतिम स्थानाभोवती कंपित होतात, विशेषतः जड घनांशी संवाद जोडताना. जर आपण पुरेशी पुनरावृत्ती केली नाही, तर पिवळा भाग स्पष्टपणे अवैध अवस्थेत राहू शकतो जिथे त्याच्या दोन बंधनांपैकी एक गंभीरपणे भंग होतो. याला उच्च द्रव्यमान गुणोत्तर समस्या म्हणतात, आणि ही भौतिकशास्त्र इंजिनांसाठी एक मोठा त्रासदायक विषय ठरली आहे कारण यामुळे अस्थिरता आणि स्फोट होतात. जर आपण खूप पुनरावृत्ती केली तर सोल्व्हर खूप मंद होतो, आणि जर केली नाही तर तो अस्थिर होतो. या दोन्ही बाजूंचे संतुलन साधणे ही एक वेदनादायक आणि दीर्घ प्रक्रिया राहिली आहे.
उपाययोजना
सोल्व्हरमध्ये अचूकतेच्या त्रुटीचे दोन मुख्य स्रोत आहेत: टाइम-स्टेपिंग आणि पुनरावृत्तीद्वारे सोल्व्हिंग (फ्लोटिंग पॉइंट ड्रिफ्ट देखील आहे, परंतु पहिल्या दोनच्या तुलनेत तो किरकोळ आहे). या त्रुटींमुळे सिम्युलेशनमध्ये चुका येतात आणि ते योग्य मार्गापासून विचलित होते. या विचलनातील काही भाग सहन करण्याजोगे असतात, जसे किंचित वेगळे वेग किंवा ऊर्जा गमावणे, परंतु काही असह्य असतात, जसे अस्थिरता, मोठी ऊर्जा वाढ किंवा विस्थापित बंधने.

म्हणून सोल्व्हरमधील बरीच जटिलता संगणकीय अचूकतेतील त्रुटींचा परिणाम कमी करण्यासाठीच्या पद्धतींच्या अंमलबजावणीमुळे येते. आमच्या अंतिम अंमलबजावणीत काही पारंपारिक आणि काही नवीन शमन धोरणे वापरली आहेत:
- वॉर्म स्टार्टिंग: पुनरावृत्ती करणाऱ्या सोल्व्हरच्या अभिसरण दराला वाढवण्यासाठी मागील टाइम-स्टेपमधील उपायापासून सुरूवात करणे
- पोस्ट-स्टेबिलायझेशन: सिस्टमला पुन्हा बंधन मॅनिफोल्डवर प्रोजेक्ट करून बंधन ड्रिफ्ट टाळणे
- नियमितीकरण: बंधनांचे पालन सुनिश्चित करून उपाय अस्तित्वात आहे आणि तो अद्वितीय आहे हे सुनिश्चित करणे
- पूर्व-अटनिर्धारण: रेखीय उपप्रणालीच्या अचूक उपायाचा वापर करून जटिल यंत्रणांची स्थिरता सुधारणे
रणनीती 1, 2 आणि 3 खूप पारंपारिक आहेत, परंतु 3 मध्ये आम्ही सुधारणा करून परिपूर्णता साधली आहे. तसेच, जरी 4 अनोळखी नसली तरी त्याची कोणतीही व्यावहारिक अंमलबजावणी आम्ही पाहिली नाही. आम्ही मोठ्या विरळ बंधन मॅट्रिक्ससाठी मूळ घटकविभाजन पद्धत आणि PGS सोबत त्याचे संयोजन करण्याचा एक नवीन कार्यक्षम मार्ग वापरतो. परिणामी अंमलबजावणी शुद्ध PGS पेक्षा फक्त किंचित मंद आहे, परंतु ती समानतेच्या बंधनांमधून येणारी रैखिक प्रणाली अचूकपणे सोडवते याची खात्री देते. परिणामी, समानतेच्या बंधनांना फक्त वेळ विखंडनातून येणाऱ्या ड्रिफ्टचा सामना करावा लागतो. आमच्या पद्धतींविषयी तपशील माझ्या GDC 2020 सादरीकरणात आहेत. सध्या, आम्ही असमानतेच्या बंधनांवर आणि टक्करंवर लागू होणाऱ्या थेट पद्धतींचा अभ्यास करत आहोत.
अधिक तपशील मिळवा
परंपरेनुसार जोडलेल्या यंत्रणांसाठी दोन गणितीय मॉडेल्स आहेत: एक म्हणजे फेदरस्टोन यांनी मांडलेली कमी समन्वय पद्धती, जी प्रत्येक सांध्यावरील स्वातंत्र्याच्या अंशांचे मापदवीकरण करते, आणि दुसरी म्हणजे पूर्ण समन्वय पद्धती जी लाग्रांजियन सूत्रीकरण वापरते.
आम्ही दुसरा सूत्रीकरण वापरतो कारण तो कमी प्रतिबंधात्मक आहे आणि त्यासाठी खूप सोपी गणित आणि अंमलबजावणी आवश्यक असते.
Roblox इंजिन पूर्वी वापरल्या जाणाऱ्या दंड पद्धतींच्या (penalty methods) विपरीत, बंधनांच्या गतिशील प्रतिसादाची (dynamic response) गणना करण्यासाठी विश्लेषणात्मक पद्धती (analytical methods) वापरते. विश्लेषणात्मक पद्धती प्रथम Baraff 1989 मध्ये सादर करण्यात आल्या, जिथे त्या समानता आणि असमानता अशा दोन्ही बंधनांना सुसंगत पद्धतीने हाताळण्यासाठी वापरल्या जातात. Baraff यांनी निरीक्षण केले की संपर्क मॉडेल (contact model) द्विघात कार्यक्रमन (quadratic programming) वापरून तयार करता येऊ शकतो, आणि त्यांनी एक अनुभवाधारित उपाय पद्धत (heuristic solution method) प्रदान केली (जी पद्धत आम्ही आमच्या सॉल्व्हरमध्ये वापरत नाही).
बल-आधारित सूत्रीकरणाऐवजी, आम्ही वेग अवकाशात आवेग-आधारित सूत्रीकरण वापरतो, जे मूळतः मिरटिच-कॅनी 1995 मध्ये सादर केले गेले आणि नंतर स्टुअर्ट-ट्रिंकल 1996 मध्ये सुधारित केले गेले, जे विविध संपर्क प्रकारांच्या हाताळणीचे एकीकरण करते आणि घर्षण असलेल्या संपर्कांसाठी उपायाच्या अस्तित्वाची हमी देते. प्रत्येक टाइमस्टेपवर, बंधनांच्या आवेगांमुळे वेगात तात्काळ बदल करून बंधने आणि धडक नियंत्रित केल्या जातात. आवेग-आधारित सिम्युलेशन का श्रेष्ठ आहे याचे उत्कृष्ट स्पष्टीकरण कॅटो २०१४ च्या GDC सादरीकरणात दिले आहे.
घर्षणरहित संपर्कांचे मॉडेलिंग Baraff 1994 मध्ये वर्णन केलेल्या रेखीय पूरकता समस्या (LCP) वापरून केले जाते. घर्षण हे Projected Gauss-Seidel च्या पुनरावृत्तींमध्ये घर्षण शंकूवर नॉन-रेखीय प्रक्षेपण म्हणून समाविष्ट केले जाते.
बांधणींमध्ये स्थितीजन्य त्रुटी निर्माण करणारी संख्यात्मक विचलन Cline-Pai 2003 यांनी मांडलेल्या छद्म-वेगांचा वापर करून पोस्ट-स्टेबिलायझेशन तंत्राद्वारे निराकरण केले जाते. यामध्ये स्थिती अवकाशात दुसरे LCP सोडवणे समाविष्ट असते, जे प्रणालीला पुन्हा बांधणी बहुपृष्ठावर प्रक्षेपित करते.
LCPs Catto 2005 (तसेच Catto 2009) यांनी लोकप्रिय केलेल्या PGS / Impulse Solver वापरून सोडवले जातात. ही पद्धत पुनरावृत्तीत्मक असून प्रत्येक बंध स्वतंत्रपणे अनुक्रमे विचारात घेऊन तो स्वतंत्रपणे सोडवते. अनेक पुनरावृत्तीनंतर आणि आदर्श परिस्थितीत, प्रणाली जागतिक उपायाकडे अभिसरित होते.
याव्यतिरिक्त, समानतेच्या बंधनांमधील उच्च द्रव्यमान गुणोत्तराच्या समस्या समानतेच्या बंधनांच्या बंधन मॅट्रिक्सच्या विरळ LDL विघटनाचा वापर करून PGS चे पूर्वअटनिर्धारण करून दूर केल्या जातात. बंधन मॅट्रिक्सच्या घन उपमॅट्रिक्सेस आम्ही बॉडी स्प्लिटिंग म्हणणार्या पद्धतीचा वापर करून विरळ केल्या जातात. ही पद्धत Baraff 1996 मध्ये वापरलेल्या LDL विघटनासारखीच आहे, परंतु ती अधिक सामान्य यांत्रिक प्रणालींना परवानगी देते, आणि बंधन अवकाशात प्रणालीचे निराकरण करते. अधिक माहितीसाठी, आपण माझे GDC 2020 सादरीकरण पाहू शकता.
आमच्या सोल्व्हरची रचना गुएन्डेलमन-ब्रिडसन-फेडकीव यांच्या संकल्पनेवर आधारित आहे, ज्यात वेग आणि स्थानाचे स्टेपिंग कंट्रेन्ट रिझोल्यूशनद्वारे वेगळे केले जाते. आमची वेळ क्रमांकन अशी आहे:
- गती क्षेत्र आणि स्थान क्षेत्रातील अडचण निराकरण
- वेग अवकाशात आणि स्थान अवकाशात बंधन निराकरण
- पुढील स्थिती
या योजनेचा फायदा असा आहे की ती फक्त वैध वेगांचा समावेश करते आणि बाह्य शक्तीच्या अंमलबजावणीतील विलंब मर्यादित करते, परंतु संख्यात्मक विचलनामुळे थोडीशी दिसणारी बंधनभंग होऊ देते.
कठोर शरीर सिम्युलेशनसाठी एक उत्कृष्ट संदर्भ म्हणजे Erleben 2005 हे पुस्तक, जे अलीकडेच मोफत उपलब्ध करून देण्यात आले आहे. तुम्हाला भौतिकशास्त्र-आधारित अॅनिमेशनवरील ऑनलाइन व्याख्याने, फिजिक्स इंजिन तयार करण्याबाबत Nilson Souto यांचा ब्लॉग, आधुनिक सॉल्व्हर पद्धतींवर Erin Catto यांचे एक उत्कृष्ट GDC सादरीकरण, आणि Bullet Physics Forum व GameDev सारख्या फोरम्सवर प्रश्न विचारण्यासाठी उत्तम ठिकाणे मिळतील.
निष्कर्ष
गेम फिजिक्स सिम्युलेशनच्या क्षेत्रात अनेक मनोरंजक समस्या आहेत ज्या रोमांचक आणि आव्हानात्मक दोन्ही आहेत. येथे उत्कृष्ट गणित आणि भौतिकशास्त्र शिकण्याची तसेच आधुनिक ऑप्टिमायझेशन तंत्रे वापरण्याची संधी आहे. हे गेम विकासाचे एक असे क्षेत्र आहे जे गणित, भौतिकशास्त्र आणि सॉफ्टवेअर अभियांत्रिकी यांना घट्ट जोडते.
जरी Roblox कडे चांगले रिजिड बॉडी फिजिक्स इंजिन असले, तरीही असे क्षेत्र आहेत जिथे त्यात सुधारणा आणि ऑप्टिमायझेशन करता येऊ शकते. तसेच, आम्ही फ्रॅक्चरिंग, विकृती, सॉफ्टबॉडी, कापड, एरोडायनॅमिक्स आणि पाण्याच्या सिम्युलेशनसारख्या रोमांचक नवीन प्रकल्पांवर काम करत आहोत.
Roblox कॉर्पोरेशन किंवा हा ब्लॉग कोणतीही कंपनी किंवा सेवा समर्थन किंवा अनुमोदन करत नाहीत. तसेच, या ब्लॉगमध्ये दिलेल्या माहितीच्या अचूकता, विश्वसनीयता किंवा पूर्णतेबाबत कोणतीही हमी किंवा वचन दिले जात नाही.
हा ब्लॉग पोस्ट मूळतः Roblox टेक ब्लॉगवर प्रकाशित झाला होता.


