कई वस्तुओं के साथ टकराव के मामले में टकराव का संकल्प


15

मेरे पास स्थिर वस्तुएं और चल वस्तुएँ हैं। टकराव का पता लगाने के लिए अलग-अक्ष-प्रमेय का उपयोग किया जाता है।

उदाहरण के लिए, इस स्थिति में मेरे पास दो स्थिर वस्तुएँ हैं (लाल रंग में):

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

और दोनों के बीच एक चल वस्तु:

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

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

उदाहरण के लिए, जब मैं हरे रंग की आयत और दाहिने लाल आयत के बीच टकराव की जाँच करता हूँ, तो एल्गोरिथ्म एक वेक्टर निकालता है जो मुझे बताता है कि कैसे टकराव को हल करने के लिए मुझे हरे आयत को स्थानांतरित करने की आवश्यकता है:

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

ध्यान दें कि मैंने इसे जल्दी ही MSPaint में आकर्षित किया है, इसलिए उस चित्र में वास्तव में यह हो सकता है कि न्यूनतम-अनुवाद-वेक्टर शीर्ष पर हरे आयत को बाहर धकेलता है, लेकिन मैं यहां यह मानने जा रहा हूं कि इसे बाईं ओर धकेलना / अधिकार वास्तव में कम है।

इसके समीप आने का सामान्य तरीका केवल एक बार में एक के बजाय एक फ्रेम प्रति टकराव के टकराने को हल करना होगा। लेकिन मेरे मामले में, इसका परिणाम फ्लिप-फ्लॉपिंग होगा:

सबसे पहले, सॉल्वर दो टकरावों का पता लगाता है लेकिन केवल सही आयत और हरे रंग की आयत के बीच टकराव को हल करता है:

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

फिर, अगले फ्रेम में, यह केवल एक टकराव का पता लगाता है जो कि बाएं लाल आयत और हरे रंग की आयत के बीच में है, और इसे हल करता है:

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

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

इसे कैसे हल किया जा सकता है?


आप अपने उदाहरण में आयतों का उपयोग कर रहे हैं। क्या आपकी टक्कर एल्गोरिदम केवल एक अक्ष पर टकराव को हल करता है? यदि हां, तो यह समझ में आता है कि आपके द्वारा वर्णित व्यवहार घटित हो रहा है।
अराजकतावादी

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

+1 अच्छा सवाल। मैंने शीर्षक से 2 डी (2 डी) "टैग" हटा दिया, यह कुछ ऐसा है जिससे आपको बचना चाहिए ( मेटा देखें )।
बंमज़ैक 14

जवाबों:


7

वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं (उच्च शारीरिक सटीकता या बस एक निकट-पर्याप्त वास्तविक समय सिमुलेशन) के आधार पर, आप सट्टा संपर्कों का उपयोग करके कोशिश कर सकते हैं।

यहाँ विवरण हैं: http://www.wildbunny.co.uk/blog/2011/03/25/specactory-contacts-an-continuous-collision-engine-approach-part-1/

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

यदि आपको अधिक आवश्यकता है, तो आप (IIRC) $ 7 के लिए उसका सोर्स कोड खरीद सकते हैं।

यहाँ 3D में मेरे कार्यान्वयन का एक वीडियो है: http://www.youtube.com/watch?v=JvT2H1RmOas

ध्यान दें कि सिमुलेशन केवल एक पुनरावृत्ति के साथ कितना स्थिर है। आप आसानी से एक स्थिर स्थिति में कई टकरावों को हल करने के लिए प्रति फ्रेम में कई पुनरावृत्तियों का उपयोग कर सकते हैं, जो अधिक सटीक होगा।


2

आप प्रत्येक टक्कर को हल करने के लिए आवश्यक सभी वैक्टरों की गणना कर सकते हैं, फिर उनसे परिणाम की गणना कर सकते हैं।

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


टकरावों के बारे में एप्सिलॉन * 10 के परिमाण के साथ एक छोटा यादृच्छिक वेक्टर जोड़ें ? फ्लोटिंग पॉइंट अंकगणित को बाकी करना चाहिए।
मार्टिन सोज्का

2
हां, यह काम कर सकता है, मुझे लगता है। लेकिन यह घबराना आंदोलनों को भी पैदा कर सकता है।
Mihai Maruseac

1
मुझे उम्मीद है कि मुझे अभी भी इस पर जवाब मिल सकता है: एक परिणामी कंप्यूटिंग को "अनंत लूप" समस्या को ठीक करता है, लेकिन "दरार" समस्या को फिर से पेश करता है, जहां एक ही आकार की टाइलों से बनी दीवार पर फिसलने के दौरान शरीर को मिलता है टाइल्स की "दरार" के बीच फंस गया। क्या इन दोनों समस्याओं को हल करने का कोई तरीका है?
विटोरियो रोमियो

सहमत ... इस तरह एक असंभव कठोर शरीर टकराव को हल करने के लिए सबसे अच्छा "सही जवाब" नहीं है। या तो यह झटके देता है, या आप वस्तुओं में से एक या अधिक में कुछ "मृदुता" की अनुमति देते हैं।
दाविद वैन ब्रिंक

0

यदि आप इसे बारीकी से देखते हैं, तो वस्तुओं की वह स्थिति (या होनी चाहिए) अस्वीकार्य है।

बाईं ओर लाल आकार R1 हो, और सबसे दाहिनी लाल आकृति R2 हो। हरे रंग का आकार दें।

अर्थात तीनों वस्तुओं के आकार और ज्यामिति को देखते हुए, और यह देखते हुए कि सभी वस्तुएँ घुसने योग्य नहीं हैं:

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

अब, यह करने के लिए नीचे फोड़े, अगर आपके एल्गोरिथ्म एक-एक करके अपनी वस्तुओं पर सवाल उठाता है, तो यह एक संगोष्ठी की बात है, एक अर्थ में, एल्गोरिथ्म एक ही समय में सभी वस्तुओं की जांच करने वाला है, लेकिन एल्गोरिथ्म आपको करने के लिए सीमित करता है ऑब्जेक्ट्स और उन्हें एक बार में प्रोसेस करना ...

यदि R2 के खिलाफ G को R1 के खिलाफ जाँच की जाती है, तो G कानूनी रूप से R1 के दाईं ओर दिखाई देगा (यदि G कहते हैं कि R1 वेक्टर की दिशा के साथ <-1, -1> मनमाने परिमाण (या दूरी) के साथ आता है ), क्योंकि R1 और G के बीच की जाँच इसे अनुमति देती है, और R2 और G के बीच की जाँच के बारे में भूल जाता है जो पहले किया गया था।

एक समाधान जो आप कर सकते हैं वह है सभी न्यूनतम विस्थापन वैक्टर को एक सरणी में या जो भी डेटा संरचना आप चाहते हैं उसे इकट्ठा करना, और एक चुनना जो सभी वस्तुओं के लिए कानूनी साबित होगा।

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

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