बलों के साथ टकराव को हल करना


14

मेरे 2 डी भौतिकी इंजन में, मैं एएबीबी बनाम एएबीबी टक्करों का पता लगा सकता हूं, और उन्हें सबसे कम पैठ वाले वेक्टर को खोजने और एएबीबी की स्थिति में जोड़कर हल कर सकता हूं।

ऐसा करने से दूसरा AABB के बाहर पहला AABB "धक्का" देता है, लेकिन वेग / त्वरण परिवर्तन से बिल्कुल भी नहीं निपटता है।

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

मैंने संकल्प के बाद वेग को शून्य पर सेट करने की कोशिश की, लेकिन यह स्पष्ट रूप से अच्छी तरह से काम नहीं करता था, और अवास्तविक सिमुलेशन बनाता था।

मैंने ऑनलाइन पढ़ा कि स्थिति या वेग पर मैन्युअल रूप से काम करके टकरावों को हल करना सही नहीं है। मैंने बलों को लागू करने की कोशिश की (अब के लिए द्रव्यमान एक "हार्डकोड" है):

void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }

void Body::integrate(float mFrameTime)
{
    velocity += acceleration * mFrameTime;
    position += velocity * mFrameTime;

    acceleration = {0, 0};
}

यदि मैं टक्कर रिज़ॉल्यूशन के दौरान एक बल के रूप में सबसे छोटी पैठ वेक्टर लागू करता हूं, तो गतिशील एएबीबी को स्थिर से "धक्का दिया" मिलेगा, लेकिन गुरुत्वाकर्षण के बिना सिमुलेशन में इसका वेग कभी भी कम नहीं होगा और यह हमेशा आगे बढ़ता रहेगा।

क्या "अस्थायी" बल लागू करने का कोई तरीका है? एक ऐसा बल जो पहले AABB को दूसरे AABB से बाहर धकेलने से संबंधित है, फिर AABB से टकराने पर नहीं रुकता है?

संपूर्ण स्रोत कोड यहां उपलब्ध है: https://github.com/SuperV1234/SSVSCollision


1
मुझे इसमें दिलचस्पी है। क्या आप अभी तक एक समाधान के साथ आए हैं?
ट्रैविसग

@TravisG: अभी तक, दुर्भाग्य से नहीं। अगर मुझे कोई जवाब नहीं मिला तो मैं कल एक इनाम दूंगा।
विटोरियो रोमियो

बल पहले समान नहीं है। त्वरण की गणना करने के लिए आपको द्रव्यमान की आवश्यकता होती है। यदि आप दोनों निकायों को घुसने से रोकने के लिए स्थिति को संशोधित कर रहे हैं, तो आपको द्रव्यमान का उपयोग करना चाहिए और इसके आधार पर दोनों निकायों को स्थानांतरित करना चाहिए। प्रवेश वेक्टर के बराबर बल लागू करने में कोई योग्यता नहीं है। Box2D आवेग आधारित है, यह सीधे वेग पर काम करता है, यह "सही" नहीं हो सकता है, लेकिन यह काफी अच्छा है। आवेग आधारित इंजन में वेग परिवर्तन से निपटना बहुत सरल है, इसलिए आप निर्दिष्ट कर सकते हैं कि क्या आप निश्चित रूप से एक बल आधारित समाधान चाहते हैं, या बहुत सरल आवेग आधारित समाधान काफी अच्छा है।
15

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

@ दत्ता उनकी धारणाएँ ठीक हैं। उन्होंने बताया कि सभी वस्तुओं के लिए उनका द्रव्यमान अभी के लिए "1" है, जो उनके कोड सेक्शन को वैध बनाता है। वैसे, भले ही Box2D सीधे वेग के साथ सौदा कर सकता है, यह किसी भी तरह एक ही समस्या से निपटना चाहिए। यदि बल लागू करने के बजाय, Box2D एक आवेग को लागू करता है, तो यह किसी भी तरह से इस तथ्य से निपटना चाहिए कि आवेग केवल वस्तुओं के अलग होने के बाद दूर नहीं जाते हैं। हालांकि, यह संभव है कि यह वास्तव में इससे बिल्कुल भी नहीं निपटता है और वस्तुओं को अपनी ऊर्जा बनाए रखने देता है (यह वास्तविक दुनिया में ऐसा ही होगा)
ट्रैविस

जवाबों:


13

सबसे पहले, मैं Box2D की तरह एक मुक्त, ओपन-सोर्स भौतिकी पुस्तकालय का उपयोग करने की सलाह देता हूं और बस अपने खेल के पहलुओं पर ध्यान केंद्रित करता हूं जो इसे अद्वितीय बनाते हैं! यदि आप पहिया को फिर से आविष्कार करने पर जोर देते हैं, तो पढ़ें ... ध्यान दें कि सभी भौतिकी इंजन सन्निकटन हैं, और जबकि नीचे दी गई विधि आपके वर्तमान मॉडल की तुलना में अधिक सटीक होगी, Box2D के परिणाम कहीं अधिक यथार्थवादी होंगे।


दो वस्तुओं ए और बी के अधिक सटीक टक्कर संकल्प को मॉडल करने के त्वरित तरीके के लिए:

  1. टक्कर से ठीक पहले की स्थिति का पता लगाएं। आप पहले से ही इसका अनुमान लगा रहे हैं: "सबसे छोटी पैठ वेक्टर को खोजकर एएबीबी की स्थिति में जोड़ें।"
  2. न्यूटनियन भौतिकी का उपयोग करके टक्कर के ठीक बाद के वेगों को खोजें :
    • उस मामले के लिए जहां द्रव्यमान को 1 के रूप में हार्ड-कोड किया गया है, बस वेग को स्वैप करें (यह स्थिर वस्तुओं पर लागू नहीं होता है जिसमें अनंत द्रव्यमान होना चाहिए):
      • अव = बू
      • बीवी = एयू
    • यदि ऑब्जेक्ट A और B में अलग-अलग द्रव्यमान हैं:
      • Av = (Au * (Am - Bm) + (2 * Bm * Bu)) / (Am + Bm)
      • बीवी = (बू * (बीएम - एम) + (2 * एम * एयू)) / (एम + बीएम)
    • कहाँ पे:
      • v: टक्कर के बाद वेग
      • यू: टक्कर से पहले वेग
      • m: द्रव्यमान (स्थिर, स्थिर वस्तु के द्रव्यमान के लिए संभव सबसे बड़ी संख्या का उपयोग करें)
  3. त्वरण को 0 पर सेट करें: टकराव से त्वरण चरण संख्या 2 में वेग गणना द्वारा ऊपर के लिए जिम्मेदार था।

कृपया मेरे नमूना क्षुद्रग्रह कार्यक्रम पर एक नज़र डालें जो इन अवधारणाओं को प्रदर्शित करता है।


अगला, स्टैक्ड ऑब्जेक्ट के लिए खाता:

जैसा कि आपने नोट किया है, स्टैक्ड / रेस्टिंग वस्तुओं का अनुकरण करने के लिए वेग का उपयोग करना अच्छी तरह से काम नहीं करता है: वेग वह गति है जो एक वस्तु घूम रही है, इसलिए यदि यह स्थिर वस्तु पर टिकी हुई है, तो वेग 0. के पास होना चाहिए। यह बढ़ने का कोई मतलब नहीं है किसी वस्तु का वेग उसे आराम पर दिखाई देता है:

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

वास्तव में क्या होना चाहिए एक त्वरण बल है जो विपरीत दिशा में जा रहा है क्योंकि गुरुत्वाकर्षण को गुरुत्वाकर्षण को रद्द करना चाहिए। (इसे सामान्य संपर्क बल कहा जाता है)। एक शॉर्टकट केवल उन निकायों को गुरुत्वाकर्षण लागू नहीं करना है जो हवा में नहीं हैं:

  • ऐसा करने की एक विधि "ज़मीनी स्थिति" रख रही है:
    • ग्राउंडेड अवस्था में वस्तुओं पर गुरुत्वाकर्षण लागू न करें।
    • यदि कोई वस्तु नीचे से किसी वस्तु से टकराती है और उसका वेग बहुत कम होता है तो वह जमीनी अवस्था में प्रवेश करती है।
    • एक वस्तु जमीनी अवस्था से बाहर निकलती है जब उसका ऊर्ध्वाधर वेग एक निश्चित सकारात्मक मान से अधिक हो जाता है।

अपडेट करें:

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

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

@Vee: अच्छे सवाल! तीन + निकाय और स्थिर निकाय दो अलग-अलग मुद्दे हैं। मैंने एक अद्यतन में दोनों को संबोधित किया। सारांश: एक समय में दो वस्तुओं को टकराता है; स्थैतिक निकायों में बहुत बड़ा, अनंत द्रव्यमान होता है।
वामपन्थी

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

16

इस समस्या को हल करने के लिए समायोजन की स्थिति और संभवतः वेग की आवश्यकता होती है। कठोर शरीर भौतिकी इंजन में एक सॉल्वर होता है जो समय के साथ न्यूटन के गति के नियमों का उपयोग करते हुए वस्तुओं को आगे बढ़ाता है और गैर-प्रवेश बाधाओं और घर्षण को हल करता है। ये इंजन प्रशंसनीय प्रक्षेपवक्र बनाने के लिए रैखिक और कोणीय गति के सही संयोजन की गणना कर सकते हैं।

यदि आप केवल ओवरलैप को हल करना चाहते हैं, तो आप छद्म वेगों का उपयोग कर सकते हैं जो गति को जोड़ने के बिना पृथक प्रक्षेपवक्र उत्पन्न करते हैं। यह बॉक्स 2 डी की स्थिति सॉल्वर में किया जाता है।

मैं 2006 और 2007 से अपनी GDC प्रस्तुतियाँ यहाँ प्राप्त करने की सलाह देता हूँ:

http://code.google.com/p/box2d/downloads/list

इसके अलावा, आप एक सरल कार्यान्वयन के लिए Box2D Lite को देख सकते हैं।


+1 की स्थिति को समायोजित करने के लिए आवश्यक होने की टिप्पणी के लिए भी। कुछ लोग इसे लिप्त करते हैं, लेकिन सिमुलेशन स्थिरता में जोड़ने के लिए, अधिकांश इंजन सीधे पदों को समायोजित करके धोखा देते हैं। सभी के सभी, अगर यह प्रशंसनीय है, तो यह खेलों के लिए काम करता है।
तियोड्रोन

जवाब के लिए धन्यवाद। मैं कुछ जानना चाहता था, जो शायद मैं प्रस्तुति में चूक गया: क्या स्थिर निकायों को बॉक्स 2 डी में एक विशेष तरीके से नियंत्रित किया जाता है? मेरा मतलब है - जब एक गतिशील शरीर एक स्थिर शरीर से टकराता है तो क्या होता है?
विटोरियो रोमियो

2

यहाँ छवि विवरण दर्ज करें

वास्तविक दुनिया में, कोई ऐसा बल नहीं है जो एक शरीर को दूसरे शरीर के बाहर "धकेलता" हो क्योंकि वस्तुएं कभी एक-दूसरे में प्रवेश नहीं करती हैं। निकटतम चीज सामान्य बल है : वास्तविक-विश्व टकरावों में संपर्क के क्षण में निर्मित, यह पहली जगह में प्रवेश को रोकता है।

इस सामान्य बल का कोण दो टकराने वाली वस्तुओं की संपर्क सतह के लंबवत है। परिमाण इस बात पर निर्भर करता है कि प्रवेश को रोकने के लिए कितना बल आवश्यक है। (ध्यान दें कि सामान्य बल के केवल y घटक का उपयोग तब तक किया जाना चाहिए जब तक कि अन्य बल जैसे घर्षण बल को भी मॉडल नहीं किया जाता है)।

जबकि सामान्य बल को स्पष्ट रूप से मॉडल करना संभव है, केवल इसके प्रभावों को मॉडल करना सरल है:

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

मैंने अपने दूसरे उत्तर में इसे थोड़ा अलग तरीके से वर्णित किया जो सामान्य रूप से टकरावों के बारे में अधिक है

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