2 डी गेम टकराव की प्रतिक्रिया: किसी दिए गए अक्ष के साथ सैट और न्यूनतम विस्थापन?


13

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

यहाँ एक स्थिति का उदाहरण दिया गया है जहाँ यह बात होगी:

उदाहरण

ऊपर वर्णित सैट विधि के अनुसार, आयत बस त्रिभुज से बाहर निकलकर अपने कर्ण के लिए लंबवत होगी:

सैट-स्टाइल रिस्पांस

हालांकि, वास्तविक रूप से, आयत को त्रिकोण के निचले दाएं कोने पर रोकना चाहिए, क्योंकि यह पहली टक्कर का बिंदु होगा यदि यह अपने विस्थापन वेक्टर के साथ लगातार आगे बढ़ रहा था:

यथार्थवादी प्रतिक्रिया

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

(StackOverflow से क्रॉस-पोस्ट किया गया, आशा है कि यह नियमों के विरुद्ध नहीं है!)


यह नियमों के खिलाफ है। क्रॉसपोस्ट मत करो।
आक्रमण 24

हाँ, इसे StackOverflow से हटा दें और यहाँ रखें: P
ट्रैविसग

gamedev.stackexchange.com/questions/9144/… मैंने आपके विशेष प्रश्न का उत्तर यहां दिया है।
ultifinitus

एसओ से हटाए गए।
अर्चागन

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

जवाबों:


11

यहाँ विधि मुझे मिली। यह त्रुटिपूर्ण हो सकता है, लेकिन मुझे इसके सरसरी विश्लेषण में अभी तक कोई समस्या नहीं हुई है। यह कुछ मामूली संशोधनों के साथ मनमाने बहुभुज के लिए भी काम करता है।

नीचे दिए गए चित्र में, नीली वस्तु घूम रही है और लाल वस्तु स्थिर है। 1 चरण 1: प्रत्येक बहुभुज के लिए, गति वेक्टर के लिए लंबवत रेखा पर उस बहुभुज के प्रक्षेपण के साथ दो सबसे दूर के बिंदुओं को ढूंढें। 2 चरण 2: इन बिंदुओं को जोड़ने वाली रेखा के साथ प्रत्येक बहुभुज को विभाजित करें। बहुभुज का आधा जो मोशन वेक्टर के साथ अन्य बहुभुज का सामना करता है, वह "फॉरवर्ड हल" है। यह बहुभुज का एकमात्र हिस्सा है जो संभवतः टकरा सकता है। 3 चरण 3:प्रत्येक बहुभुज के "फॉरवर्ड हल" पर प्रत्येक बिंदु से एक वेक्टर को विपरीत बहुभुज की ओर गति वेक्टर के साथ प्रोजेक्ट करें, और इसे विपरीत बहुभुज के "आगे पतवार" के प्रत्येक किनारे के साथ चौराहे के लिए जांचें। (संभवतः धीमी गति से, लेकिन कंप्यूटर आजकल बहुत तेज हैं - ठीक है?) (झुके हुए तीर के बारे में क्षमा करें। सभी तीर समानांतर होना चाहिए।) 4 चरण 4: सबसे छोटा वेक्टर लें। यह सटीक टक्कर की दूरी है। 5 चरण 5: वोइला! 6


2
यह बहुत प्रभावशाली है। क्या आपके पास अपने एल्गोरिथ्म की गति की तुलना में सरल (4x या 8x) मल्टीसैमप्लिंग की तुलना में कोई भी मौका है?
ट्रैविसज

दुर्भाग्यवश नहीं।
अर्चागन

प्रभावशाली, और मुझे यकीन है कि गणित बहुत जटिल / गहन नहीं है। +1
you786

7

इसी तरह के प्रश्न की जाँच करें: टकराव समाधान

और साथ ही, http://www.metanetsoftware.com/technique/tutorialA.html#section5 से (जिसे आपने एक लिंक पोस्ट किया है :))

खंड 5: तेजी से आगे बढ़ने वाली वस्तुएं

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

यदि आपके पास पूरी तरह से उनके पास होना चाहिए, तो छोटी और / या तेजी से आगे बढ़ने वाली वस्तुओं से निपटने के लिए दो सामान्य तरीके हैं: बह-टकराव परीक्षण, और मल्टीसमैपलिंग।

- = स्वीप परीक्षण = -

दो स्थिर आकृतियों के बीच अंतर-परीक्षण के बजाय, हम इसके प्रक्षेपवक्र के साथ मूल आकृतियों को व्यापक करके और इन स्वैप्टिक आकृतियों के बीच ओवरलैप के लिए परीक्षण करके नए आकार बना सकते हैं।

मूल विचार [गोमेज़] में वर्णित है, सर्कल-सर्कल और एएबीबी-एएबीबी स्वीप परीक्षणों के लिए।

- = मल्टीसमापलिंग = -

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

यदि आप यह सुनिश्चित करते हैं कि नमूने हमेशा वस्तु की त्रिज्या से कम दूरी पर होते हैं, तो यह उत्कृष्ट परिणाम देगा। हमारे कार्यान्वयन में, हम नमूनों की अधिकतम संख्या को सीमित करते हैं, इसलिए बहुत अधिक गति कभी-कभी समस्याओं का परिणाम होगी; यह कुछ ऐसा है जिसे आपके विशिष्ट एप्लिकेशन के आधार पर ट्विक किया जा सकता है।

संपादित करें

सारांश और AFAIK में, कुछ समाधान हैं

  1. अपने खेल को कभी भी एक छोटी और / या तेज गति वाली वस्तु तक सीमित न करें, जो इसका कारण भी हो सकता है
  2. एक प्रणाली लागू करें जो वास्तव में हो रही टक्करों को रोकती है, जैसा कि मैंने पोस्ट की गई पहली कड़ी में वर्णित है
  3. तेज़ और / या छोटी चलती वस्तुओं के लिए अपनी नमूना दर बढ़ाएँ
  4. ... संभवतः अधिक है, लेकिन मैं एक विशेषज्ञ नहीं हूं।

1

यह निर्भर करता है कि क्या आप केवल रैखिक आंदोलन चाहते हैं, या यदि आपको कोणीय आंदोलन के साथ सामना करने की आवश्यकता है।

SAT का उपयोग करने का एक विकल्प:

केवल रैखिक के मामले में आप वस्तुओं के डेल्टा रैखिक वेग की दिशा में मूल से दो बहुभुज के मिंकोवस्की अंतर के खिलाफ किरण डाल सकते हैं।

यदि किरण एमडी से टकराती है, तो दो ऑब्जेक्ट टकराएंगे और हिट बिंदु आपको उस समय का समय बताएगा, जिस पर वे टकराए थे।

अब, यदि ऑब्जेक्ट घूम रहे हैं और घूम रहे हैं तो यह और मुश्किल हो जाता है, लेकिन आप फिर भी एक समान तकनीक का उपयोग कर सकते हैं। रूढ़िवादी अग्रिम आपको इस मामले से निपटने की अनुमति देगा। यह तकनीक पुनरावृत्त है; प्रत्येक पुनरावृत्ति एक नया एमडी उत्पन्न करेगा और आपको चौराहे के समय के करीब लाएगा।

यहां कंजर्वेटिव एडवांसमेंट पर मूल ड्राफ्ट पेपर है:

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

मैंने एक लेख में तकनीक के बारे में विस्तार से बताया है:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

आशा है कि ये मदद!

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