टक्कर इंजन और भौतिकी इंजन के बीच एक बड़ा अंतर है। वे एक ही काम नहीं करते हैं, हालांकि भौतिकी इंजन आमतौर पर टकराव इंजन पर निर्भर करता है।
टक्कर इंजन को दो भागों में विभाजित किया गया है: टक्कर का पता लगाने और टक्कर की प्रतिक्रिया। उत्तरार्द्ध आमतौर पर भौतिकी इंजन का हिस्सा होता है। यही कारण है कि टक्कर इंजन और भौतिकी इंजन आमतौर पर एक ही पुस्तकालय में लुढ़के होते हैं।
टकराव का पता लगाने के दो रूप हैं, असतत और निरंतर। उन्नत इंजन दोनों का समर्थन करते हैं, क्योंकि उनके पास अलग-अलग गुण हैं। सामान्य तौर पर, निरंतर टकराव का पता लगाना बहुत महंगा होता है और केवल इसका उपयोग किया जाता है जहां इसकी वास्तव में आवश्यकता होती है। टकराव और भौतिकी के बहुमत को असतत तरीकों का उपयोग करके नियंत्रित किया जाता है। असतत तरीकों में, ऑब्जेक्ट एक-दूसरे को भेदते हुए समाप्त हो जाएंगे, और भौतिकी इंजन फिर उन्हें अलग करने के लिए काम करता है। तो इंजन वास्तव में एक खिलाड़ी को दीवार या फर्श के माध्यम से आंशिक रूप से चलने से नहीं रोकता है, यह सिर्फ यह पता लगाने के बाद ठीक करता है कि खिलाड़ी आंशिक रूप से दीवार / मंजिल में है। मैं यहां असतत टकराव का पता लगाने पर ध्यान केंद्रित करने जा रहा हूं, क्योंकि मुझे स्क्रैच से लागू करने का सबसे अधिक अनुभव है।
टक्कर की पहचान हुई है
टकराव का पता लगाना अपेक्षाकृत आसान है। प्रत्येक वस्तु में एक परिवर्तन और एक आकार (संभवतः कई आकार) होते हैं। अगर कोई जोड़े के बीच ओवरलैप है तो नाइवी एप्रोच में सभी ऑब्जेक्ट जोड़ी और परीक्षणों के माध्यम से ओ (एन ^ 2) लूप होगा। होशियार दृष्टिकोणों में कई स्थानिक डेटा संरचनाएं होती हैं (जैसे, स्थिर बनाम गतिशील वस्तुओं के लिए), प्रत्येक ऑब्जेक्ट के लिए एक बाउंडिंग आकार और प्रत्येक ऑब्जेक्ट के लिए मल्टी-पार्ट उत्तल उप-आकृतियाँ।
स्थानिक डेटा संरचनाओं में केडी-ट्रीज़, डायनेमिक AABB ट्री, ऑक्ट्रीज़ / क्वाडट्रैस, बाइनरी स्पेस पार्टिशनिंग ट्री, आदि चीजें शामिल हैं। प्रत्येक के अपने फायदे और नुकसान हैं, यही वजह है कि कुछ उच्च अंत इंजन एक से अधिक का उपयोग करते हैं। उदाहरण के लिए डायनामिक AABB पेड़ वास्तव में बहुत तेज़ हैं और बहुत सी चलती वस्तुओं को संभालने के लिए अच्छे हैं जबकि केडी-ट्री स्थिर स्तर की ज्यामिति के लिए अधिक उपयुक्त हो सकता है जो ऑब्जेक्ट टकराते हैं। अन्य विकल्प भी हैं।
व्यापक चरण प्रत्येक वस्तु के लिए स्थानिक डेटा संरचनाओं और एक अमूर्त बाउंडिंग वॉल्यूम का उपयोग करता है। एक बाउंडिंग वॉल्यूम एक साधारण आकार है जो पूरे ऑब्जेक्ट को घेरता है, आम तौर पर इसे "कसकर" के रूप में संलग्न करने के लक्ष्य के साथ जबकि टक्कर परीक्षणों को करने के लिए सस्ते रहते हैं। सबसे आम बाउंडिंग आकार एक्सिस-संरेखित बाउंडिंग बॉक्स, ऑब्जेक्ट-संरेखित बाउंडिंग बॉक्स, गोलाकार और कैप्सूल हैं। AABB को आमतौर पर सबसे तेज़ और सबसे आसान माना जाता है (कुछ मामलों में Spheres आसान और तेज़ होते हैं, लेकिन उन स्थानिक डेटा संरचनाओं में से कई को वैसे भी AABB में गोले को परिवर्तित करने की आवश्यकता होती है), लेकिन वे भी कई वस्तुओं को खराब तरीके से फिट करते हैं। वर्ण-स्तरीय टकराव से निपटने के लिए 3 डी इंजन में कैप्सूल लोकप्रिय हैं। कुछ इंजन दो बाउंडिंग आकृतियों का उपयोग करेंगे,
टक्कर का पता लगाने का अंतिम चरण ठीक से पता लगाना है कि ज्यामिति कहाँ प्रतिच्छेद कर रही है। यह आमतौर पर एक जाली (या 2 डी में एक बहुभुज) का उपयोग करके निकलता है, हालांकि हमेशा नहीं। इस चरण का उद्देश्य यह पता लगाना है कि क्या वस्तुएं वास्तव में टकराती हैं, अगर विस्तार का एक अच्छा स्तर आवश्यक है (कहते हैं, एक शूटर में बुलेट टकराव, जहां आप उन शॉट्स को अनदेखा करना चाहते हैं जो बस मुश्किल से चूकते हैं), और यह भी पता लगाने के लिए कि वास्तव में ऑब्जेक्ट्स कहाँ टकराते हैं, जो प्रभावित करेगा कि ऑब्जेक्ट कैसे प्रतिक्रिया करते हैं। उदाहरण के लिए, यदि एक टेबल के किनारे पर एक बॉक्स बैठा है, तो इंजन को यह पता होना चाहिए कि टेबल बॉक्स के खिलाफ किन बिंदुओं पर जोर दे रही है; बॉक्स कितना दूर लटक रहा है, इसके आधार पर बॉक्स झुकना और गिरना शुरू हो सकता है।
मैनिफोल्ड जनरेशन से संपर्क करें
यहां उपयोग किए जाने वाले एल्गोरिदम में लोकप्रिय जीजेके और मिंकोव्स्की पोर्टल शोधन एल्गोरिदम शामिल हैं, साथ ही पृथक्करण अक्ष परीक्षण भी शामिल है। क्योंकि लोकप्रिय एल्गोरिदम आमतौर पर केवल उत्तल आकृतियों के लिए काम करते हैं, इसलिए कई जटिल वस्तुओं को उत्तल उप-वस्तुओं में तोड़ना आवश्यक है, और प्रत्येक के लिए टकराव परीक्षण करना आवश्यक है। यह एक कारण है कि सरलीकृत मेष का उपयोग अक्सर टकराव के लिए किया जाता है, साथ ही कम त्रिकोण का उपयोग करने के लिए प्रसंस्करण समय में कमी।
इनमें से कुछ एल्गोरिदम न केवल आपको बताते हैं कि ऑब्जेक्ट निश्चित रूप से टकरा गए हैं, लेकिन वे कहाँ टकराए हैं - वे कितनी दूर एक दूसरे को भेद रहे हैं और "संपर्क बिंदु" क्या हैं। इस जानकारी को प्राप्त करने के लिए कुछ एल्गोरिदम को अतिरिक्त चरणों की आवश्यकता होती है, जैसे बहुभुज कतरन।
शारीरिक प्रतिक्रिया
इस बिंदु पर, एक संपर्क की खोज की गई है, और संपर्क को संसाधित करने के लिए भौतिकी इंजन के लिए पर्याप्त जानकारी है। भौतिकी का संचालन बहुत जटिल हो सकता है। सरल एल्गोरिदम कुछ गेम के लिए काम करते हैं, लेकिन यहां तक कि कुछ के रूप में प्रतीत होता है सीधे-आगे के रूप में बक्से के ढेर को स्थिर रखने के लिए काफी मुश्किल हो जाता है और बहुत सारे काम और गैर-स्पष्ट हैक्स की आवश्यकता होती है।
सबसे बुनियादी स्तर पर, भौतिकी इंजन कुछ ऐसा करेगा: यह टकराती हुई वस्तुओं और उनके संपर्क को कई गुना लेगा और टकराई हुई वस्तुओं को अलग करने के लिए आवश्यक नए पदों की गणना करेगा। यह वस्तुओं को इन नए पदों पर ले जाएगा। यह इस परिवर्तन से उत्पन्न होने वाले वेग परिवर्तन की गणना भी करेगा, जो पुनर्स्थापना (बाउंसनेस) और घर्षण मूल्यों के साथ संयुक्त है। भौतिकी इंजन वस्तुओं पर अभिनय करने वाले किसी भी अन्य बल को भी लागू करेगा, जैसे कि गुरुत्वाकर्षण, वस्तुओं के नए वेगों की गणना करने के लिए, और फिर (अगले फ्रेम) उनके नए पदों पर।
अधिक उन्नत भौतिकी प्रतिक्रिया जल्दी से जटिल हो जाती है। ऊपर का दृष्टिकोण कई स्थितियों में टूट जाएगा, जिसमें दो अन्य के शीर्ष पर बैठे एक वस्तु भी शामिल है। प्रत्येक जोड़ी को खुद से निपटाने से "घबराहट" होगी और वस्तुएं बहुत अधिक उछलेंगी। सबसे बुनियादी तकनीक वस्तुओं के टकराने से अधिक वेग-सुधार पुनरावृत्तियों को करना है। उदाहरण के लिए, एक बॉक्स "ए" के साथ दो अन्य बॉक्स "बी" और "सी" के शीर्ष पर बैठे, टक्कर एबी को पहले संभाला जाएगा, जिससे बॉक्स ए को बॉक्स सी में आगे झुकाव होगा। फिर एसी टक्कर को संभाला जाएगा, शाम बक्से को कुछ हद तक, लेकिन ए को नीचे और बी में खींचकर फिर एक और पुनरावृत्ति की जाती है, इसलिए एसी सुधार के कारण होने वाली एबी त्रुटि को थोड़ा हल किया जाता है, जिससे एसी प्रतिक्रिया में थोड़ी अधिक त्रुटि पैदा होती है। जिसे तब पुनः संभाला जाता है जब एसी को फिर से संसाधित किया जाता है। किए गए पुनरावृत्तियों की संख्या निश्चित नहीं है, और ऐसा कोई बिंदु नहीं है जिस पर यह "पूर्ण" हो जाता है, बल्कि इसके बजाय जो भी पुनरावृत्तियों की संख्या सार्थक परिणाम देना बंद कर देती है। 10 पुनरावृत्तियों एक विशिष्ट पहली कोशिश है, लेकिन यह एक विशेष इंजन और एक विशेष खेल की जरूरतों के लिए सबसे अच्छी संख्या का पता लगाने के लिए tweaking लेता है।
कैशिंग से संपर्क करें
कई प्रकार के गेम से निपटने के दौरान अन्य ट्रिक्स हैं जो वास्तव में आसान (कम या ज्यादा आवश्यक) हैं। संपर्क कैशिंग अधिक उपयोगी लोगों में से एक है। संपर्क कैश के साथ, ऑब्जेक्ट्स को टकराने का प्रत्येक सेट लुकअप टेबल में सहेजा जाता है। प्रत्येक फ्रेम, जब एक टक्कर का पता लगाया जाता है, तो यह कैश यह देखने के लिए क्वेर होता है कि क्या ऑब्जेक्ट पहले संपर्क में थे। यदि ऑब्जेक्ट पहले से संपर्क में नहीं थे, तो एक "नई टक्कर" घटना उत्पन्न हो सकती है। यदि ऑब्जेक्ट पहले से संपर्क में थे, तो जानकारी का उपयोग अधिक स्थिर प्रतिक्रिया प्रदान करने के लिए किया जा सकता है। संपर्क कैश में कोई भी प्रविष्टि जो एक फ्रेम में अपडेट नहीं की गई थी, वह दो वस्तुओं को इंगित करती है जो अलग हो गईं, और "अलग करने वाली वस्तु" घटना उत्पन्न हो सकती है। खेल तर्क अक्सर इन घटनाओं के लिए उपयोग करता है।
गेम लॉजिक के लिए नई टक्कर की घटनाओं का जवाब देना और उन्हें नजरअंदाज करना संभव है। यह प्लेटफार्मों में कुछ सुविधाओं को लागू करने के लिए वास्तव में मददगार है, जैसे कि आप प्लेटफॉर्म पर कूद सकते हैं, लेकिन खड़े रह सकते हैं। Naive कार्यान्वयन सिर्फ उन टकरावों को अनदेखा कर सकता है जिनमें एक डाउनवर्ड प्लेटफ़ॉर्म होता है-> वर्ण टकराव सामान्य (प्लेटफॉर्म के नीचे खिलाड़ी के सिर पर चोट लगने का संकेत), लेकिन संपर्क कैशिंग के बिना, यह टूट जाएगा यदि खिलाड़ी का सिर प्लेटफ़ॉर्म के माध्यम से ऊपर उठाता है और फिर वह शुरू होता है गिरना। उस बिंदु पर, संपर्क सामान्य ऊपर की ओर इशारा करते हुए समाप्त हो सकता है, जिससे खिलाड़ी को मंच के माध्यम से पॉप अप करना चाहिए, जब उसे नहीं करना चाहिए। कॉन्टैक्ट कैशिंग के साथ, इंजन मज़बूती से शुरुआती टक्कर को सामान्य रूप से देख सकता है और आगे के सभी कॉन्टैक्ट इवेंट्स को तब तक अनदेखा कर सकता है जब तक कि प्लेटफ़ॉर्म और प्लेयर फिर से अलग न हो जाए।
सोया हुआ
एक अन्य बहुत ही उपयोगी तकनीक वस्तुओं को "सो" होने के रूप में चिह्नित करना है यदि उनके साथ बातचीत नहीं की जा रही है। सो रही वस्तुओं को भौतिकी के अद्यतन नहीं मिलते हैं, अन्य सोई हुई वस्तुओं से नहीं टकराते हैं, और मूल रूप से बस समय में जमे हुए बैठते हैं जब तक कि कोई अन्य गैर-नींद वाली वस्तु उनसे न टकराए।
इसका असर यह होता है कि सभी जोड़े टकराती हुई वस्तुएं जो सिर्फ वहीं बैठी रहती हैं, कुछ भी प्रसंस्करण समय नहीं लेती हैं। इसके अलावा, क्योंकि छोटे भौतिकी सुधारों की निरंतर मात्रा नहीं है, स्टैक स्थिर होंगे।
एक वस्तु सोने के लिए एक उम्मीदवार है जब उसके पास एक से अधिक फ्रेम के लिए लगभग शून्य वेग होता है। ध्यान दें कि इस निकट-शून्य वेग के परीक्षण के लिए आप जिस एप्सिलॉन का उपयोग करते हैं, वह संभवतः सामान्य फ्लोटिंग पॉइंट तुलना एप्सिलॉन से थोड़ा अधिक होगा, क्योंकि आपको स्टैक्ड ऑब्जेक्ट्स के साथ कुछ घबराहट की उम्मीद करनी चाहिए, और आप चाहते हैं कि वस्तुओं के पूरे ढेर सो जाएं। स्थिर रहने के लिए पर्याप्त रूप से बंद रहें। दहलीज को निश्चित रूप से ट्विकिंग और प्रयोग की आवश्यकता होगी।
प्रतिबन्ध
कई भौतिकी इंजनों में से अंतिम प्रमुख बाधा अवरोधक है। इस तरह की प्रणाली का उद्देश्य स्प्रिंग्स, मोटर्स, व्हील अक्ष, सिम्युलेटेड सॉफ्ट-बॉडी, कपड़ा, रस्सियों और जंजीरों जैसी चीजों के कार्यान्वयन की सुविधा है, और कभी-कभी तरल भी (हालांकि तरल पदार्थ को अक्सर एक पूरी तरह से अलग प्रणाली के रूप में लागू किया जाता है)।
यहां तक कि बाधा को सुलझाने की मूल बातें बहुत ही गहन हो सकती हैं और इस विषय में मेरी विशेषज्ञता से परे है। मैं विषय पर अधिक गहराई से व्याख्या के लिए भौतिकी पर रैंडी गॉल की उत्कृष्ट लेख श्रृंखला की जाँच करने की सलाह देता हूं ।