मैं तेजी से, सटीक 2 डी टक्कर का पता कैसे लगा सकता हूं?


11

मुझे अच्छी तरह पता है कि कैसे पता लगाया जाए कि दो या दो से अधिक 2D ऑब्जेक्ट टकराते हैं लेकिन मुझे इस बात में दिलचस्पी है कि कैसे टकराव के लिए जांच की जाए। पिछली परियोजनाओं में, मुझे बस हर वस्तु को हर दूसरी वस्तु के खिलाफ जांचना था (मुझे पता है, O (n ^ 2) मूर्खता का स्तर) और यह द्रव गेमप्ले की तुलना में कम है।

विभिन्न फ़ोरम Quadtrees, B-Trees, और किसी भी अन्य प्रकार के पेड़ या संरचना की महानता की जय हो, जिसके बारे में आप सोच सकते हैं।

यह निर्धारित करने के लिए सबसे कुशल संरचना क्या है कि क्या टकराव की जाँच की जानी चाहिए?


1
एक बात जिस पर आप विचार करना चाहते हैं, वह केवल उन वस्तुओं के लिए टकराव की जाँच कर रही है जो स्थानांतरित हो गई हैं, और केवल वही वस्तुएँ जो आपके करीब हैं। मेरा वर्तमान सिस्टम अच्छी तरह से काम करता है (सैकड़ों हजारों वस्तुएं) - और यह सब मैं कर रहा हूं।
ultifinitus

मुझे लगता है कि gamedev.stackexchange.com/questions/14369/… आपको बहुत मदद कर सकता है। यह मूल रूप से समानांतर प्रसंस्करण के लिए और एल्गोरिदम के लिए था, लेकिन मुझे लगता है कि एक ही एल्गोरिदम एकल थ्रेडेड अनुप्रयोगों में भी सुधार कर सकता है।
अली

1
@ultifinitus है कि अनिवार्य रूप से मैं के बारे में पूछ रहा हूँ क्या है। मैं कैसे निर्धारित करूं कि हर वस्तु के माध्यम से पुनरावृत्ति किए बिना कौन सी वस्तुएं पास हैं और यह स्थिति की जांच कर रही है।
माइक

माइक, आप मुझे कुछ विशिष्ट कोड के लिए ईमेल कर सकते हैं जो मैंने उपयोग किया है, यह c ++ में है - या मैं आपको मूल संरचना दे सकता हूं, हालांकि इसकी वजह से यह अस्पष्ट और जटिल हो सकता है।
अल्टीफिनिटस

1
यह एक डुप्लिकेट नहीं है क्योंकि मैं पूछ रहा था कि किस तरह की संरचना यह निर्धारित करने के लिए सबसे उपयुक्त है कि क्या हमें टक्कर के लिए जाँच करने से परेशान होना चाहिए। अन्य प्रश्न पारदर्शी बनाम गैर-पारदर्शी टकरावों के बारे में पूछ रहे थे। उल्लेख करने के लिए नहीं, यह प्रश्न आपके द्वारा लिंक किए जाने से एक साल पहले पूछा गया था।
माइक क्लॅक

जवाबों:


12

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


यह समाधान उन वस्तुओं से कैसे निपटता है जो 2 या 4 ग्रिड कोशिकाओं की सीमा बनाती हैं?
ashes999

1
किसी भी सेल का ऑब्जेक्ट ओवरलैप हो जाता है, इसे माना जाता है, इसलिए एक ऑब्जेक्ट कई कोशिकाओं में हो सकता है। अधिकांश स्थानिक डेटा संरचनाएं इसी तरह से ओवरलैप के मुद्दे से निपटेंगी।
डार्सी रेनर

वाह, यह प्रीटी स्मार्ट है। +1 चियर्स दोस्त।
ashes999

1

2 डी भौतिकी इंजन जैसे कि Box2D और चिपमंक, एक स्थानिक हैश मैप का भारी उपयोग करते हैं

संदर्भ के लिए http://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetection देखें । चिपमंक डेमो में एक बहुत अच्छा स्थानिक हैश विज़ुअलाइज़र शामिल है जो यह वास्तव में स्पष्ट करता है कि वे कैसे तकनीक काम करते हैं।


1

यदि आपकी दुनिया में एक बहुत "लंबे" आयाम हैं (इसे एक्स कहते हैं), तो दूसरों की तुलना में, आप ऑब्जेक्ट को एक ऑर्डर की गई सूची में रख सकते हैं जिसे आप स्थानांतरित करने के बाद फिर से सॉर्ट कर सकते हैं, और फिर टकराव का पता लगाने का मतलब केवल उन वस्तुओं की जांच करना है, जो एक्स अक्ष में ओवरलैप।

एक अन्य कब्जे के लिए वस्तुओं की सक्रिय / निष्क्रिय सूची रखना है, और निष्क्रिय वस्तुओं (जो बिल्कुल नहीं बढ़ रहे हैं) से परेशान न हों।

यदि वे सभी मध्यम आकार की वस्तुएं हैं जो स्क्रीन पर खिलाड़ी को दिखाई देती हैं, तो सब कुछ बनाम सब कुछ शायद बहुत बुरा नहीं है।

इसके अलावा, मैं डार्सी के साथ हूं, एक समान ग्रिड अच्छा है।

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