भौतिकी इंजन में एक साथ टकराव से निपटने का सबसे अच्छा तरीका क्या है?


13

मैं जावास्क्रिप्ट में 2d भौतिकी इंजन लिख रहा हूं ताकि मैं वीडियो गेम में भौतिकी के बारे में अधिक जान सकूं। मेरे पास कठोर शरीर के टकराव के लिए सही तरीके से काम कर रहा है, सिवाय इसके कि कोई भी शरीर एक ही समय में दो या अधिक अन्य शरीरों से टकराए।

वर्तमान में टकराने वाले निकायों की प्रत्येक जोड़ी के लिए (ए, बी) मैं टकराव आवेग के आधार पर उनके वेगों और कोणीय वेगों को संशोधित करता है, और उन्हें एक दूसरे से बाहर निकालता है ताकि वे मर्मज्ञ न हों। लेकिन फिर ए से जुड़े अन्य टकरावों के लिए टक्कर का पता लगाने और आवेग की गणना गलत होगी।

मैं अपने इंजन को एक-दूसरे से टकराते हुए 3+ ऑब्जेक्ट्स के लिए काम करने के लिए किस दृष्टिकोण का पता लगा सकता हूं?


2
संबंधित: gamedev.stackexchange.com/questions/15836/… और gamedev.stackexchange.com/questions/26181/… और मुझे यकीन है कि अभी और भी बहुत कुछ है, मैं अभी सही पता नहीं लगा सकता।
MichaelHouse

जवाबों:


11

मैं निम्नलिखित दृष्टिकोण का उपयोग करता हूं (Tonge http://www.richardtonge.com/ के सामूहिक विभाजन एल्गोरिथ्म के समान ):

  • अपने दृश्य / संदर्भ में सभी टकराते जोड़े का पता लगाएं। लेट (ए, बी) ऐसी जोड़ी हो। एक भूत / सामूहिक विभाजन विचार लागू करें: यदि A, M निकायों के संपर्क में है और B N अन्य निकायों के संपर्क में है, तो अस्थायी रूप से A के m_A/Mऔर B के द्रव्यमान को सेट करेंm_B/N
  • प्रत्येक जोड़ी (ए, बी) के लिए गणना प्रतिक्रिया / बहाली बल योगदान और इन योगदानों को ए और बी के अपने संचायक में संग्रहीत करें
  • आवेगों से पुनर्स्थापना वेगों की गणना करें (जैसा कि आपने कहा था) और उन्हें उसी फैशन में संग्रहीत करें ( प्रत्येक के लिए अपने स्वयं के संचयकों में डेल्टा वेग अवशेषों के रूप में (ए, बी) जोड़ी)
  • गणना दंड विस्थापन (फिर से, विस्थापन जमा, उन्हें तुरंत लागू न करें!)
    • टकराव जोड़े ( m_A = m_A * Mऔर m_B = m_B * N) में पार्टियों के रूप में पहले से नामित सभी निकायों के जनता को रीसेट करें

यह दृष्टिकोण समान है कि जैकोबी पुनरावृत्ति एल्गोरिदम समीकरणों के रैखिक युगपत प्रणालियों के साथ कैसे काम करता है। और यह अभिसरण करने की गारंटी नहीं है, लेकिन मेरे सिम्युलेटर में यह काम काफी सुचारू रूप से करता है .. 3 डी में (हाँ, एक अतिरिक्त आयाम दो बार कठिनाई!)।

कैविएट : आपकी टक्कर का पता लगाने / हैंडलिंग चरण समाप्त होने के बाद ही सही स्थिति और वेग! इस तरह आप एक साथ अपने टकराने वाले अभिनेताओं को अपडेट करते हैं। इसके अलावा, अगली बार जब आप पदों और वेग के लिए एकीकृत होते हैं, तो पुनर्स्थापन बलों को ध्यान में रखा जाना चाहिए।

संपादित करें: ठीक है, मुझे लगता है कि आप पहले से ही दुरुपयोग की गई वेरलेट एकीकरण विधि का उपयोग कर रहे हैं (यह एक घरेलू नाम बन गया है उत्साही लोगों के भीतर)। टकराव से निपटने और एकीकरण के इस दर्शक में, आप यहाँ एक नज़र रखना चाहते हैं

अद्यतन: टकराव से कैसे संपर्क करें (और उस मामले के लिए स्वयं टकराव) के बारे में कुछ जानकारी इन पत्रों में पाई जा सकती है:

मेरे द्वारा प्रस्तावित दृष्टिकोण एक लंबे शॉट द्वारा एक मूल योगदान नहीं है, कई गेम इसे प्रशंसनीय परिणामों के साथ उपयोग करते हैं और इसे जेकबसेन ने अपने हिटमैन गेम इंजन में सबसे अच्छा नियोजित किया था।

कुछ हद तक व्यावहारिक अनुभव से, पेनल्टी फोर्स (लीनियर या एक्सपोनेंशियल स्प्रिंग्स के समान, जो प्रवेश दूरी से अपना इनपुट प्राप्त कर रहे हैं) ठीक से पेनेट्रेशन को हल नहीं करते हैं, जब निकायों की अन्य सेनाएं टकराती हैं जो उनसे अधिक होने का प्रबंधन करती हैं। इसलिए मैंने तीन (लगभग निरर्थक) दृष्टिकोणों को चुना है: न्यूटोनियन प्रतिक्रिया बल (आप दीवार को धक्का देते हैं, दीवार पीछे धकेलती है), आवेग व्युत्पन्न वेग (स्नूकर बॉल टकराते हुए) और एक गैर-प्राकृतिक "शरीर को एक दूसरे से ज्यामितीय रूप से दूर ले जाते हैं। " समाधान। साथ में वे सब कुछ प्रदान करते हैं: अधिकांश से छुटकारा पाएंबदसूरत अंतर्विरोध कलाकृतियाँ, टकराने वाले शरीर लंबे समय तक एक दूसरे के साथ बातचीत करते हैं (पुनर्स्थापना वेगों और ताकतों के कारण - कम से कम बलों जो टकराव परिदृश्य में निकायों को खींचने के लिए गए थे, रद्द हो गए हैं और शव एक दूसरे से दूर हो गए हैं) । अंत में, इन सरल लेकिन आम अवधारणाओं की आगे की समझ के लिए, मैं इन स्लाइडों का विश्लेषण करने का सुझाव देता हूं ।

वेरलेट एकीकरण चरणों का वर्णन करने वाली मेरी "दुर्व्यवहार विधि" एपिथेट एक लोकप्रिय संस्कृति विश्वास पर लक्षित है कि यह एकीकरण विधियों का पवित्र कंघी बनानेवाले की रेती है। यह अपने सिम्पलेक्टिक यूलर (जिसे कुछ अर्ध-निहित यूलर भी कहा जाता है) चचेरे भाई से थोड़ा बेहतर है। जिस तरह से अधिक जटिल एकीकरण विधियाँ मौजूद हैं (और सभी उन में निहित नाम को सहन करते हैं)। शक्तिशाली खेल इंजन उनका उपयोग करते हैं, लेकिन इंडी डेवलपर्स के पास वेलेट के बाद से प्रयोग करने का समय नहीं है, जब एक विशिष्ट परिदृश्य से जुड़ा होता है, तो वास्तव में चमत्कार होता है। इसके अलावा, पूरी तरह से कोई एकीकरण विधि नहीं है, जिसमें थोड़ी सी भी धोखा दिए बिना कड़ी बाधाओं से निपटा जा सकता है (लिंक नहीं मिल सकता है, लेकिन मैं जिस पेपर का जिक्र कर रहा हूं, उसे "X.Provot -" विरूपण कहा जाना चाहिए) - कठोर कपड़े व्यवहार का वर्णन करने वाला मॉडल


धन्यवाद (+1)! Place पुनर्स्थापन वेग ’और dis दंड विस्थापन’ क्या हैं? इसके अलावा, आप यह क्यों कहते हैं कि 'एकीकरण' का दुरुपयोग होता है? क्या आपको लगता है कि यह उपयोग करने के लिए एक बुरा तरीका है?
कैम

पुनर्स्थापना वेग वे बिलकुल वेग हैं जिन्हें आप आवेगों से प्राप्त करते हैं, एकमात्र अंतर यह है कि मैं उन्हें अवशेषों के रूप में गणना करता हूं (यानी मैं उस आवेग आधारित वेग और वर्तमान वेग के बीच अंतर को संग्रहीत करता हूं जबकि वर्तमान वेग को आगे की गणना के लिए अछूता रखता है)। दंड विस्थापन एक लंबाई के साथ वैक्टर होते हैं जो निर्धारित करते हैं कि दो वस्तु इंटरपेंटरेट कितनी है और यह न्यूनतम लंबाई वेक्टर है जो एक वस्तु को दूसरे के बाहर पूरी तरह से अनुवाद कर सकती है। मैं आमतौर पर इस तरह के विस्थापन को 2 से लंबाई को विभाजित करने वाली प्रत्येक वस्तु में जोड़ता हूं)।
तेओद्रोन

1
शानदार जवाब! मेरा एक और सवाल है। कहो कि मैं पुनर्स्थापना वेगों को जमा करता हूं, क्या वे एक बहुत ही गैर-यथार्थवादी संख्या में नहीं जुड़ेंगे? अगर मैं प्रत्येक टकराव को वस्तु ए के साथ अलग से व्यवहार करता हूं और प्रत्येक वस्तु पर प्रभाव जोड़ देता हूं, तो क्या वस्तुओं के बीच इसका आवेग नहीं होगा? इसके बजाय पूर्ण आवेग प्रत्येक पर लागू होगा जो मुझे सहज रूप से गलत लगता है
कैम

यह एक बहुत अच्छा सवाल है .. एक दृष्टिकोण से, यह आवेगों के लिए प्रशंसनीय है जो परिणामस्वरूप वेग में योगदान देता है। यहाँ मेरा (शायद दोषपूर्ण है!) तर्क: तीन पूल / स्नूकर गेंदों को टकराने की कल्पना करें। उनमें से एक को इस योगात्मक शैली में अन्य दो से योगदान प्राप्त करना चाहिए। शुरू में, मैंने सोचा था कि इन योगदानों को तौलना और अंतिम वेग के लिए एक भारित औसत की गणना करना है, लेकिन जब से मैं त्वरित परिणाम चाहता था, मैंने इस विचार को छोड़ दिया। सभी में, टकराने वाली गेंद को शेष दो से वेग का योगदान मिलना चाहिए। शायद एक हाईस्कूल पाठ्य पुस्तक मदद कर सकती है।
तेओद्रोन

3
शायद मुझे समझ में नहीं आया कि आपने क्या समझाया है, क्योंकि निम्न उदाहरण अभी भी मुझे चिंतित करता है: क्षैतिज रूप से लंबे आयत को नीचे गिरने पर विचार करें, और मान लें कि मंजिल दांतेदार है (इसलिए कई साइड-बाय-साइड त्रिकोण से बना है)। यदि आपके संचय विधि का उपयोग करते हुए एन त्रिकोण हैं, तो आयत को उस गति से n गुना अधिक गति से वापस उछालना होगा! उस स्थिति को कैसे ठीक किया जा सकता है?
कैम

1

मेरा सुझाव है कि, वेग को बदलने के बजाय, आप किसी वस्तु पर कार्य करने वाली शक्तियों को बदलते हैं । उन्हें "नंगा" न करें, बल्कि, इसे सुचारू रूप से करें और पहले से मौजूद कोड का उपयोग करें। ऐसा करने से शरीर तुरंत (और तेज़ी से, मुझे लगता है) अपने वेगों को बदल देते हैं।

उदाहरण के लिए Box2DJS देखें: http://box2d-js.sourceforge.net/index2.html


-1

मैंने शरीर को टकराने वाले समूहों के लिए विश्लेषणात्मक रूप से आवेग समीकरण को हल किया है। एकमात्र समस्या जिसका मुझे सामना करना पड़ा, एक समूह में संपर्कों के बीच सापेक्ष संपर्क शक्ति खोजने के लिए चर की कमी थी, जिसे मैंने निकायों के चौराहे की गहराई से भरा है।

समूह संपर्कों के लिए समाधान बहुत कठिन नहीं है तो एकल संपर्क। दुर्भाग्य से मैंने गणना के साथ एक पेपर खो दिया, इस प्रकार इसे यहां साझा करने में असमर्थ हूं।

संपादित करें: संभवतः मैं कुछ इस तरह से आया हूं /physics/296767/multiple-colliding-balls

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.