14

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

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

मैं बस उम्मीद कर रहा हूं कि वहां कुछ और है जो बेहतर है।

मैं सभी मदद की सराहना करता हूं।

उत्तर

1

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

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

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

मूल रूप से, डेटा संरचनाओं के बारे में आपके प्रश्न का उत्तर देने के लिए, आप अपनी सभी वस्तुओं को मास्टर सरणी में रख सकते हैं; मेरे पास "क्षेत्र" सरणी का एक सेट होगा जिसमें मास्टर सरणी में ऑब्जेक्ट्स के संदर्भ शामिल होंगे जो आप ऑब्जेक्ट को अपने कार्टेशियन निर्देशांक के आधार पर जल्दी से क्रमबद्ध कर सकते हैं; "क्षेत्र" सरणी में आपके मास्टर ऑब्जेक्ट सरणी में कम से कम 2x सबसे बड़ा ऑब्जेक्ट त्रिज्या परिभाषित किया जाना चाहिए (यदि यह व्यवहार्य है; ऑब्जेक्ट बाउंडिंग क्षेत्र स्केलिंग बनाम ऑब्जेक्ट्स की संख्या स्पष्ट रूप से ऊपर आती है)

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

बेशक, आपको अपने गैर-गोलाकार के बीच वास्तविक टकराव का पता लगाना होगा वस्तुओं, और यह गैर टी नहीं हो सकता है rivial, लेकिन आप उस बिंदु पर बहुत ही नाटकीय रूप से संभावित तुलना की संख्या कम कर दिया है।

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

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

+0

मैं समझता हूं कि गोलाकारों का उपयोग टकराव परीक्षण थोड़ा तेज़ कर देगा, और क्षेत्र विभाजन विभाजन का उपयोग करके और तुलना की मात्रा को सीमित कर देगा, लेकिन आपको इन "क्षेत्रों" को दोबारा बदलना होगा और यह धीमा है? मैं एक डेटा संरचना की तलाश में हूं जो अपने "क्षेत्रों" को तेजी से अपडेट कर सकता है। – esiegel

1

टकराव का पता लगाने के लिए एक दिलचस्प तरीका एक विशेष ऑक्टेट संरचना के भीतर व्यवस्थित गठबंधन बाध्यकारी बक्से (एएबीबी) का उपयोग करना है। एएबीबी की मदद क्योंकि वे मोटे टक्कर कंप्यूटेशंस को बहुत तेज़ करते हैं क्योंकि आपको केवल 6 तुलना करने की आवश्यकता होती है।

आप octree संरचना के साथ प्रयोग करना चाहिए चाल के एक जोड़े हैं:

1) सीमांकन क्षेत्र है जो एक नोड पर दो बार के रूप में बड़े होना चाहिए के रूप में यह (एक सामान्य octree के लिए होगा जहां octree विभाजन ओवरलैप के बिना अंतरिक्ष)। चूंकि प्रत्येक नोड को इसके आसन्न नोड्स के क्षेत्र का आधा ओवरलैप करना चाहिए। चूंकि एएबीबी केवल एक नोड से संबंधित हो सकता है, यह अतिरिक्त आकार और ओवरलैप इसे लंबे समय तक एक नोड में रहने की अनुमति देता है।

2) प्रत्येक नोड में और शायद पदानुक्रम के प्रत्येक स्तर में - आप नोड के पड़ोसियों के लिंक रखते हैं। इसमें बहुत अधिक कोड शामिल होंगे लेकिन यह आपको O (2logn) समय के बजाय O (1) समय के नजदीक नोड्स के बीच तत्वों को स्थानांतरित करने की अनुमति देगा।

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

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

केडी पेड़ (स्मृति से) अक्षीय गठबंधन विमानों का उपयोग करके अंतरिक्ष को विभाजित करते हैं, इस प्रकार वे एएबीबी के उपयोग के लिए एक उपयुक्त फिट हैं।

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

(थोड़ा समय के बाद से मैं स्थानिक खेल विकास कोडिंग के इस प्रकार किया है हो गया है।)

+0

मुझे वास्तव में सभी पड़ोसी नोड्स की सूची रखने का विचार पसंद है, लेकिन क्या यह मानता है कि सभी नोड्स बराबर आकार के हैं? एक स्पैस ऑक्टेट्री का उपयोग करके, मुझे लगता है कि समस्याएं होंगी, खासकर अगर मैंने नोड्स के डिवीजनों को दोबारा नहीं बदला। – esiegel

+0

वैसे दो तरीके हैं जिन्हें आप जा सकते हैं, या तो एक अतिरिक्त पेड़ की गणना करें और इसे निष्पादन के दौरान अद्यतन रखें, या पूर्ण ऑक्टेट्री उत्पन्न करें और बस इसके चारों ओर ऑब्जेक्ट्स को ले जाएं। आपको बस यह सोचने की जरूरत है कि आप किस लागत का भुगतान करना चाहते हैं। – Daemin

3
  1. आप एक octree में दृश्य विभाजन और दृश्य जुटना उपयोग कर सकते हैं। आपकी चलती वस्तु जिसे आप परीक्षण कर रहे हैं वह पेड़ के एक विशिष्ट नोड में अपनी गति के आधार पर फ्रेम की एक विशिष्ट मात्रा के लिए होगा। इसका मतलब है कि आप मान सकते हैं कि यह नोड में होगा और इसलिए नोड में नहीं होने वाली कई वस्तुओं को जल्दी से काट लें। बेशक मुश्किल बात यह है कि जब आपका ऑब्जेक्ट आपके विभाजन के किनारे के करीब होता है, तो आपको यह सुनिश्चित करना होगा कि ऑब्जेक्ट में कौन सा नोड है।

  2. एक चलती वस्तु में एक दिशा और गति होती है। आप आसानी से आंदोलन की दिशा से अपने ऑब्जेक्ट्स से एक लंबवत विभाजन का उपयोग करके दृश्य को दो वर्गों में विभाजित कर सकते हैं। इस विभाजन के गलत पक्ष पर किसी भी वस्तु को जांचने की आवश्यकता नहीं है। निश्चित रूप से अन्य वस्तु की वेग के लिए क्षतिपूर्ति। तो यदि अन्य वस्तु उचित धीमी है, तो आप आसानी से आगे की जांच से इसे काट सकते हैं।

  3. अक्ष के गठबंधन बाध्यकारी बॉक्स जैसे किसी भी आकार के साथ परीक्षण करने के लिए हमेशा सरल बनाएं। प्रारंभिक टकराव परीक्षण

  4. आप अपनी वस्तु और अन्य चलती वस्तु और वेगों के बीच की दूरी ले सकते हैं। यदि अन्य चलती वस्तु एक ही सामान्य दिशा में तेजी से वेग पर आगे बढ़ रही है, तो आप इसे अपने चेक से हटा सकते हैं।

  5. ऑब्जेक्ट के आकार के आधार पर कई अन्य अनुकूलन हैं। मंडल या वर्ग या अधिक जटिल आकारों में सभी विशिष्ट अनुकूलन होते हैं जो आप चलते समय कर सकते हैं।

  6. कुछ वस्तुओं को मानना ​​बंद करना या आगे बढ़ना बंद कर सकता है, आप उन वस्तुओं का ट्रैक रख सकते हैं जो रोकें। इन वस्तुओं को स्थिर वस्तुओं की तरह माना जा सकता है और इसलिए चेक तेज़ होते हैं और आप उन्हें सभी स्थिर अनुकूलन तकनीकों को लागू कर सकते हैं।

  7. मुझे और अधिक पता है लेकिन मेरे सिर के ऊपर से किसी के बारे में नहीं सोच सकता। थोड़ी देर में ऐसा नहीं किया है।

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

0

झाडू और व्यापक चरण + GJK संकीर्ण चरण

0

RDC काम का हो सकता है, खासकर यदि आपकी वस्तुओं विरल है (बहुत सारे चौराहों) कर रहे हैं छांटना।

संबंधित मुद्दे