टकराव का संकल्प


23

मैं अच्छी तरह से जानता हूं कि टक्करों की जांच कैसे की जाती है, लेकिन मुझे नहीं पता कि टक्कर को अच्छे तरीके से कैसे संभालना है।

सरलीकृत, अगर दो ऑब्जेक्ट टकराते हैं तो मैं वेग की दिशा बदलने के लिए कुछ गणनाओं का उपयोग करता हूं। अगर मैं दो वस्तुओं को स्थानांतरित नहीं करता हूं, तो वे अभी भी ओवरलैप करेंगे और यदि वेग बहुत बड़ा नहीं है, तो वे अगले अद्यतन के बाद भी टकराएंगे। इससे ऑब्जेक्ट एक-दूसरे में फंस सकते हैं।

लेकिन क्या होगा अगर मैं दो वस्तुओं को स्थानांतरित करने की कोशिश करता हूं ताकि वे ओवरलैप न हों। यह एक अच्छे विचार की तरह लगता है लेकिन मैंने महसूस किया है कि अगर दो से अधिक ऑब्जेक्ट हैं तो यह बहुत जटिल हो जाता है। क्या होगा अगर मैं दो वस्तुओं को स्थानांतरित करता हूं और उनमें से एक अन्य वस्तुओं से टकराता है तो मुझे उन्हें भी स्थानांतरित करना होगा और वे दीवारों आदि से टकरा सकते हैं।

मेरे मन में 2 डी गेम का टॉप डाउन है, लेकिन मुझे नहीं लगता कि इससे ज्यादा कोई लेना-देना है। आमतौर पर टकराव कैसे होते हैं?

वोह की ओर से यह प्रश्न पूछा जाता है


1
क्या आप खेल के प्रकार को स्पष्ट कर सकते हैं? "टॉप डाउन 2 डी" का मतलब बहुत सारी चीजें हो सकती हैं: एक ज़ेल्डा-स्टाइल एक्शन-एडवेंचर गेम, वर्टिकल-स्क्रॉलिंग शूटर या पॉकेट बिलियर्ड्स गेम। इन सभी में टकराव से निपटने की बहुत अलग मानक शैली होगी!
इयान स्क्रैबर

2
मैं यह स्पष्ट नहीं कर सकता। सवाल यह नहीं है कि टकराव के परिणामस्वरूप क्या होगा, यह कई ओवरलैप समस्या से निपटने के बारे में है। मुझे लगता है कि यह जानना काफी है कि मैं वस्तुओं को एक दूसरे से दूर कर रहा हूं और मैं चाहता हूं कि वे इस प्रश्न का उत्तर देने के लिए वास्तविक व्यवहार करें।
CiscoIPPhone

जवाबों:


16

डैनियल कोडिसक ने इस विषय को अपनी पुस्तक, गणित और भौतिकी में प्रोग्रामर के लिए बहुत विस्तार से शामिल किया है ।

कोडिसक प्राकृतिक दिखने वाले टकराव के समाधान को प्राप्त करने के लिए दो चीजें करता है:

  • उनके टकराव का पता लगाने के कार्य की गणना सही समय दो वस्तुओं के टकराने से होगी।
  • वह टकराव के समय नए वेगों को याद करता है, इसलिए वस्तुएं कभी भी ओवरलैप नहीं होती हैं।

मैंने कोडिसक की टक्कर का पता लगाने और रिज़ॉल्यूशन के आधार पर एक डेमो अपलोड किया

अद्यतन: यहाँ एक टक्कर का पता लगाने और संकल्प एल्गोरिथ्म है जो कोडिसक की विधि के समान है। स्रोत कोड के साथ । मैं अभी भी कोडिसक की पुस्तक की सिफारिश करता हूं, क्योंकि उनका एल्गोरिथ्म थोड़ा अलग तरीके से लागू किया गया है और बहुत अधिक अच्छी तरह से समझाया गया है।


1
आपका डेमो लिंक टूटने लगता है।
ashes999

@ ashes999: लिंक अभी तय किया गया है!
लेफ्टियम सेप

यह मंडलियों के लिए एक एल्गोरिथ्म है। बक्से के बारे में कैसे?
एंटोन चिकिन

@AntonChikin: कोडिसक के टक्कर रिज़ॉल्यूशन एल्गोरिदम को केवल तीन इनपुट लगते हैं: टकराव के बिंदु पर द्रव्यमान, वेग और सामान्य। कोडिसक हमेशा टकराव का पता लगाने पर टकराव के बिंदु पर सामान्य की गणना करता है। वह कई अलग-अलग प्रकार के टकराव का पता लगाता है, जिसमें एक बॉक्स दूसरे बॉक्स को मारता है। टक्कर संकल्प एल्गोरिथ्म में बस उस टक्कर का पता लगाने एल्गोरिथ्म में प्लग। पूर्ण विवरण के लिए कोडिसक की पुस्तक के 8-10 अध्याय देखें। (नोट घूर्णी भौतिकी को अधिक गणित की आवश्यकता होती है, जिसे बाद में पुस्तक में भी शामिल किया गया है ...)
वामियम

1
@ThomasHilbert: डेमो स्रोत कोड और Windows पर अब उपलब्ध निष्पादनयोग्य leftium.com/asteroid
Leftium

6

यदि आप वस्तुओं को आगे बढ़ने के बजाय टकराव की जाँच करते हैं, तो क्या होगा? या, दूसरे शब्दों में, आप नई स्थिति को अस्वीकार करते हैं यदि ऑब्जेक्ट टकराते हैं, तो उस मामले में पुराने एक का पुन: उपयोग?

स्यूडोकोड:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

इस तरह से जब वे टकराने वाले हैं तो ऑब्जेक्ट एक-दूसरे से टकराएंगे , यदि आपका अपडेट कदम काफी छोटा है, तो खिलाड़ी को प्रतिनिधित्व में कुछ भी अजीब नहीं दिखना चाहिए।


1
यह काफी कष्टप्रद है, क्योंकि आप आसानी से वस्तुओं के समानांतर नहीं चल सकते क्योंकि आप अन्य वस्तुओं को छूने पर अल पर नहीं जा सकते।
इक्के

जब तक आप x और y को अलग
तुरंत

6

जब भी दो ऑब्जेक्ट ओवरलैप होते हैं, तो जांचें कि क्या वे एक दूसरे से दूर या दूर जा रहे हैं। टकराव तभी करें जब वे एक-दूसरे की ओर बढ़ें।

यह वेक्टर गणित के साथ बहुत आसान है, बस गणना करें:

dot_product (B.position - A.position, A.velocity - B.velocity)

यदि परिणाम सकारात्मक है तो वस्तुएं एक दूसरे की ओर बढ़ती हैं।


4

मुझे गलतफहमी हो सकती है, लेकिन ऐसा लगता है कि आप दो सवाल पूछ रहे हैं: 1. टकराव के समाधान से निपटने के कुछ सामान्य तरीके जो आप देख रहे हैं वह 'आवेग आधारित सिमुलेशन' है, और कागजात का एक गुच्छा है मैं इससे बेहतर न्याय कर सकता हूं।

सारांश में, आप अपने भौतिकी सिमुलेशन को गति के स्थान पर ले जाना चाहते हैं, जो कि बड़े पैमाने पर वेग है (चीजों को बल पर आधारित न करें, आपका इंटीग्रेटर वैसे भी सही नहीं कर रहा है)।

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

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

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

यदि आप कर सकते हैं तो इसे सरल रखें।

  1. आप मल्टी बॉडी टकराव की समस्याओं को कैसे हल करते हैं

ऐसा करने का एकमात्र वास्तविक तरीका रैखिक समीकरणों की एक प्रणाली और बहुत सारे समाधान है। इसे करने का व्यावहारिक तरीका ऊपर की तरह एक प्रणाली है, और भौतिक रूप से समय के साथ स्वाभाविक रूप से हल करना है।

ज़्यादातर गेम जो घूमते हुए या चलती सतहों पर खड़े होने जैसे काम करते हैं, एक हाइब्रिड मॉडल होता है, जहाँ आपके पैर एक सतह (या पहियों से सड़क पर) जुड़े होते हैं, भौतिकी समय के साथ कदमताल करने के लिए (जिसके परिणामस्वरूप इंटरपेनिट्रेशन-प्रतिक्रिया चक्र होता है) काम नहीं करेगा)।

उम्मीद है की यह मदद करेगा। यदि आपको किसी गणित उदाहरण की आवश्यकता है, तो मुझे बताएं।


3

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

penalty forceको स्प्रिंग-डेम्पर की तरह लगाया जाता है, जहां पेनल्टी फोर्स को अधिक बढ़ाया जाता है, जिससे आप कठोर शरीर में अंतर-प्रवेश कर जाते हैं और बाद के फ्रेम में कम हो जाते हैं। इसे स्प्रिंग्स के रूप में सोचें। जब दो कठोर शरीर अंतर-प्रवेश करते हैं, तो वे प्रत्येक अदृश्य वसंत का सामना करते हैं जो उनकी प्रगति को कम कर देता है (अर्थात, अधिक अंतर-प्रवेश को रोकता है) और पहले से उल्लेखित लागू होता है penalty forceजब तक कि शरीर अब मर्मज्ञ नहीं होते हैं।

यह एक व्यापक विषय है, लेकिन उम्मीद है कि उपरोक्त जानकारी आपको मिल जाएगी।


तो अंतर-प्रवेश को रोकने के बजाय यह विधि इसे अनुमति देती है लेकिन प्रतिरोध प्रदान करती है, लगभग वस्तुओं की तरह संकुचित हो रही है?
सिस्कोपफोन

यह प्रतिरोध प्रदान करता है, हाँ, प्रतिरोध बढ़ जाता है जितना अधिक शरीर घुसना करने की कोशिश कर रहा है। व्यवहार में, यदि आपके पास कम पर्याप्त डेल्टा समय (उदाहरण के लिए 10ms) है, तो यह किसी भी अंतर-प्रवेश का उत्पादन नहीं करेगा। इस विधि का वास्तविक लाभ तब होता है जब आपके पास ऐसे शरीर होते हैं जो विभिन्न कारणों से अंतर-प्रवेश करते हैं (स्थिति बदल गई थी, वे कठोर शरीर हैं और उनकी स्थिति सही हो गई थी) और अब अलग होने की आवश्यकता है, क्योंकि इस तकनीक के बिना निकाय धीरे-धीरे अलग होने के बजाय बाहर विस्फोट होगा।
समोरसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.