सतत भौतिकी इंजन की टक्कर का पता लगाने की तकनीक


10

मैं एक विशुद्ध रूप से निरंतर भौतिकी इंजन पर काम कर रहा हूं , और मुझे व्यापक और संकीर्ण चरण टक्कर का पता लगाने के लिए एल्गोरिदम चुनने की आवश्यकता है। "विशुद्ध रूप से निरंतर" का मतलब है कि मैं कभी भी चौराहे परीक्षण नहीं करता हूं, बल्कि ऐसा होने से पहले हर टकराव को पकड़ने के तरीके ढूंढना चाहता हूं, और प्रत्येक को "नियोजित टकराव" स्टैक में डाल दिया जाता है जो टीओआई द्वारा आदेश दिया जाता है।

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

मुझे इस बात का कोई अंदाजा नहीं है कि आज के असतत टकराने वाले तरीकों जैसे कि क्वाड-ट्री के लिए निरंतर एनालॉग्स मौजूद हो सकते हैं। असत्य इंजन के रूप में अनुचित और व्यर्थ व्यापक परीक्षण को रोकने के बारे में मैं कैसे जा सकता हूं? मैं आगे भी 1 से अधिक फ्रेम को टक्कर देखने में सक्षम होना चाहूंगा।

संकीर्ण चरण
मैंने असतत के बजाय संकीर्ण SAT को लगातार जांचने में कामयाब किया है, लेकिन मुझे यकीन है कि कागजात या साइटों पर आप लोगों के पास आने वाले अन्य बेहतर एल्गोरिदम हैं।
आपके द्वारा सुझाए गए विभिन्न तेज़ या सटीक अल्गोरिद्म मैं क्या उपयोग करते हैं और प्रत्येक के फायदे / असमानताएं क्या हैं?

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


मेरा सुझाव है कि आप इन पुस्तकों की जांच करें amazon.com/Real-Time-Collision-Detection-Interactive-Technology/… amazon.com/…
concept3d

मुझे जोड़ने के लिए खेद है, लेकिन Box2D का उपयोग क्यों नहीं करें? इसे लगभग हर भाषा में चित्रित किया गया है। यदि आप इसका उपयोग करने की योजना नहीं बनाते हैं, तो इसे स्रोत पर ब्राउज़ क्यों नहीं करें ताकि आप देख सकें कि यह कैसे कोलाज का प्रबंधन करता है?
डेरेक

जवाबों:


2

मैं वास्तव में सिर्फ विचारों को इधर-उधर फेंक रहा हूं। आपके पास (बहुत कम से कम) currentस्थिति और nextस्थिति को मानते हुए ; प्रत्येक फ्रेम के लिए।

आपको दो अलग-अलग व्यापक चरणों की आवश्यकता होगी, उसके बाद आपका संकीर्ण चरण:

  • एक है कि एक टकराव हो जाएगा बाहर आंकड़े।
  • एक वह आंकड़ा जो मोटे तौर पर होता है जहाँ टक्कर वास्तव में होती है (उदाहरण के लिए एक व्यापक चरण / गलत सैट)
  • अंत में आपका संकीर्ण चरण दूसरे व्यापक चरण के परिणाम में सुधार करेगा।

प्रारंभिक व्यापक चरण

आप प्रारंभिक व्यापक चरण के लिए स्थानिक हैशिंग ( nextस्थिति का उपयोग करते हुए , नहीं current) में देख सकते हैं । यह आपकी समस्या के स्थान को टक्कर के उम्मीदवारों के समूह में अच्छी तरह से विभाजित करेगा।

दूसरा व्यापक चरण

आपके द्वारा वर्णित सर्कल चौराहे विधि का उपयोग करके एक बाइनरी मल्टी-नमूना करें। दूसरे शब्दों में:

left = current
right = next
midpoint = (left + right) / 2
loop a desired amount of times tweaked to the accuracy you want:
  is a collision occuring at midpoint?
    right = midpoint
  else?
    left = midpoint
  midpoint = (left + right) / 2
pointOfCollision = midpoint

वह सटीकता ट्वीक भी विचार में दूरी ले सकता है - मुझे लगता है कि 'लंबाई वर्ग' के उपयोग से next - currentपिक्सेल-पूर्ण परिणाम प्राप्त होगा।

संकीर्ण चरण

पीएमएस्क जैसे कुछ का उपयोग करके एक द्विआधारी बहु-नमूना करें - तर्क बिल्कुल ऊपर जैसा होगा; बस एक अलग टक्कर दिनचर्या का उपयोग कर।

आखिरकार

आप समय-चौराहे से काम करने में सक्षम होंगे pointOfCollision, currentऔर आपके वर्तमान speedऔर acceleration(यह मानते हुए कि आपके पास एक एकीकृत इंटीग्रेटर है)।


तो माध्यमिक व्यापक चरण का पता लगाने के लिए, क्या आप सुझाव दे रहे हैं कि मैं सर्कल के यात्रा पथ का मध्य बिंदु प्राप्त करूं, और परीक्षण करूं कि क्या यह सर्कल के अंदर परीक्षण किया जा रहा है? मैं सोच रहा था कि मैं बस एक समीकरण बना सकता हूं जो समय के साथ एक दूसरे से दो सर्कल की दूरी देता है, और यह देखते हुए कि किसी भी समय दूरी 0. के बराबर है
ग्रिफिन

इसके अलावा, Pmask वास्तव में क्या करता है? साइट वास्तव में व्याख्या नहीं करती है = /।
ग्रिफिन

@ आपकी पहली टिप्पणी काम कर सकती है - देखें कि क्या आप पता लगा सकते हैं। मैं मूल रूप से एक टकराव की जगह पर एक द्विआधारी खोज कर रहा हूँ ... PMask बहुत चालाक है। पिक्सल के 8x8 ग्रिड (ऑन / ऑफ) के रूप में एक अहस्ताक्षरित 64-इंट देखें - एक साधारण और (बाइनरी) निर्धारित करता है कि क्या टक्कर हो रही है (गैर-शून्य); आपको पहले कुछ चतुर बिटशिफ्टिंग करने की आवश्यकता है, लेकिन यह विचार है। अधिक जानकारी के लिए स्रोत पढ़ें; यहां व्याख्या करना कठिन है (या यों कहें, मेरा स्पष्टीकरण चूसना होगा) - आपको वास्तव में स्रोत को संदर्भित करने की आवश्यकता है।
जोनाथन डिकिंसन

1

ठीक है, मैंने देखा है कि आपने अपना प्रश्न अपडेट कर दिया है ताकि अधिक विशिष्ट हो। मैं कोशिश करूँगा और आपको कुछ और मदद करूँगा।

आपके पहले व्यापक चरण की जाँच के लिए, मैं दृढ़ता से स्थानिक हैशिंग की सिफारिश करूँगा ।

अनिवार्य रूप से, आप अपनी स्क्रीन को समान आकार के ग्रिड में विभाजित करते हैं। फिर, यदि कोई वस्तु ग्रिड के भीतर है, तो आप इसे 1 डी हैश तालिका में "बाल्टी" में जोड़ते हैं।

वह आपका पहला चेक है। यदि वस्तुएं एक ही बाल्टी में नहीं हैं, तो उनके लिए अंतर करना असंभव होगा।

उसी के साथ आगे बढ़ते हुए, अब आपके पास वस्तुओं की एक बाल्टी है (संभावित रूप से)। आप यहाँ या तो एक और व्यापक-चरण जाँच कर सकते हैं:

ए) इस बाल्टी को 4 अन्य बाल्टी में विभाजित किया, और परिणामी 1D हैश तालिका की जाँच की। यदि वे एक ही बाल्टी में नहीं हैं, तो कोई टक्कर नहीं है।

या:

बी) एक साधारण दूरी की जाँच करना और सटीकता सुनिश्चित करने के लिए वस्तु की चौड़ाई और / या ऊँचाई को ध्यान में रखना।

लेकिन क्या जब आप संभावित रूप से एक टक्कर है?

तब मैं की तर्ज पर कुछ सुझाव है इस । यह अनिवार्य रूप से कम जटिल आकृतियों के लिए बहुभुज टकराव (जटिल आकार के लिए) या आयत / वृत्त के बीच मिश्रण का एक प्रकार है।

इसके अलावा, यदि आप वास्तव में "होने से पहले टकराव को पकड़ना और उन्हें संग्रहीत करना चाहते हैं" तो आप हमेशा कुछ ऐसा कर सकते हैं:

यदि दो वस्तुएं एक ही बाल्टी में हैं, तो वे टकरा सकते हैं।

इसके अलावा, क्या वस्तुएं इतनी करीब हैं कि वे जल्द ही टकरा सकती हैं? (खाते के वेग, वस्तु के आकार और दूरी को ध्यान में रखते हुए)

यदि दोनों का उत्तर हां में है, तो आगे बढ़ो और इसे बाद में एक चौराहा परीक्षण करने के लिए संग्रहीत करें।


पुराना जवाब

खैर, दुर्भाग्य से मैंने अपने "ऑल कोलिजन टाइप्स एंड व्हाट वी आर यूज फॉर" हैंडबुक का ट्रैक खो दिया है। :)

हालांकि, भले ही यह एक अत्यंत व्यापक खोज है, लेकिन मैं आपको शुरू कर दूंगा।

यहाँ कुछ इस तरह से संबंधित एक अच्छा (उत्तर) प्रश्न है

साथ ही यहाँ पर N और N + बनाने वाले लोगों का एक लेख ।

उल्लेख नहीं करने के लिए, आपको अच्छा ol 'फ़ॉलबैक प्रति पिक्सेल टकराव मिला है

मुझे पूरी तरह से संदेह है कि किसी के पास हर तरह की टक्कर की एक सूची होगी, लेकिन इससे आपको शुरुआत करने में मदद मिलेगी।

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


जिस विधि को मैंने अपने टकराने के आधार पर रखा था, उसे जोड़ने के लिए भूल गए (Per-Pixel a Hull Design का उपयोग करके) संग्रह को क्षमा करें, मूल साइट वेबसाइट स्वर्ग में चली गई है। web.archive.org/web/20090126230334/http://www.ziggyware.com/…
इलेक्ट्रोफ्लेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.