2009-12-16 21 views
6

मैं एक भौतिकी इंजन/सिम्युलेटर लिख रहा हूं जिसमें 3 डी स्पेस फ्लाइट, ग्रह/तारकीय गुरुत्वाकर्षण, जहाज जोर और सापेक्ष प्रभाव शामिल हैं। अब तक, यह बहुत अच्छी तरह से चल रहा है, हालांकि, एक चीज जिसे मुझे मदद की ज़रूरत है टकराव का पता लगाने एल्गोरिदम का गणित है।तेजी से बढ़ने वाले क्षेत्रों के बीच टकराव का पता लगाने

(नोट::। 3 डी वेक्टर सभी कैप्स हैं) के रूप में

आंदोलन है कि मैं उपयोग कर रहा हूँ की पुनरावृत्ति सिमुलेशन मूल रूप से है

For each obj 

    obj.ACC = Sum(all acceleration influences) 

    obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2  (*EQ.2*) 

    obj.VEL = obj.VEL + (obj.ACC * dT) 

Next 

कहाँ:

obj.ACC is the acceleration vector of the object 
obj.POS is the position or location vector of the object 
obj.VEL is the velocity vector of the object 

obj.Radius is the radius (scalar) of the object 

dT is the time delta or increment 

क्या मैं मूल रूप से करने के लिए कुछ कुशल सूत्रों को खोजने के लिए है (EQ.2) ऊपर दो ऑब्जेक्ट्स (obj1, obj2) के लिए और बताएं कि क्या वे कभी टकराते हैं, अगर ऐसा है, तो किस समय। मुझे सटीक समय दोनों की आवश्यकता है ताकि मैं यह निर्धारित कर सकूं कि यह इस विशेष समय वृद्धि में है (क्योंकि एक्सेलरेटन अलग-अलग समय वृद्धि पर अलग होंगे) और यह भी कि मैं सही स्थिति का पता लगा सकूं (जिसे मैं जानता हूं कि कैसे करना है, समय)

इस इंजन के लिए, मैं क्षेत्रों के रूप में सभी वस्तुओं मॉडलिंग कर रहा हूँ, यह सब सूत्र/algortithim क्या कहते हैं पर यह पता लगाने की है करने की जरूरत है:

(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius) 

जहां .Distance एक सकारात्मक अदिश मूल्य है। (यदि आप आसान हैं, तो दोनों पक्षों को भी चौकोर कर सकते हैं, डिक्शन गणना में निहित स्क्वायर रूट फ़ंक्शन से बचने के लिए)।

(हाँ, मुझे कई अन्य टकराव का पता लगाने के प्रश्नों के बारे में पता है, हालांकि, उनके समाधान सभी अपने इंजन और धारणाओं के लिए बहुत खास प्रतीत होते हैं, और कोई भी मेरी शर्तों से मेल नहीं खाता: 3 डी, गोलाकार, और त्वरण लागू । सिमुलेशन वेतन वृद्धि के भीतर मुझे पता है कि अगर मैं गलत हूँ चलो)


कुछ स्पष्टीकरण:।

1) यह मेरे पहले और बाद में * दो क्षेत्रों के चौराहे * के लिए जाँच करने के लिए पर्याप्त नहीं है समय वृद्धि कई मामलों में उनके वेग और स्थिति में परिवर्तन उनके त्रिज्या से कहीं अधिक हो जाएगा।

2) आरई: दक्षता, मुझे टक्कर के लिए संभावित उम्मीदवारों को निर्धारित करने के संबंध में सहायता (इस बिंदु पर वैसे भी) की आवश्यकता नहीं है, मुझे लगता है कि मैंने इसे कवर किया है।


एक और स्पष्टीकरण है, जो एक बहुत आ रहा किया जा रहा है:

3) मेरा समीकरण (EQ।2) वृद्धिशील आंदोलन के एक द्विघात समीकरण दोनों वेग और त्वरण लागू होने वाला है:

obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 

भौतिकी इंजन है कि मैंने देखा है, (और निश्चित रूप से हर खेल इंजन है कि मैं कभी सुना) केवल रैखिक वृद्धिशील आंदोलन के समीकरणों कि लागू केवल वेग:

obj.POS = obj.POS + (obj.VEL * dT) 

यही कारण है कि मैं ढेर पर पाया टक्कर पता लगाने के लिए आमतौर पर प्रकाशित समाधान उपयोग नहीं कर सकते ओवरफ्लो, विकिपीडिया और पूरे वेब पर, जैसे कि दो पंक्ति खंडों के चौराहे/निकटतम दृष्टिकोण को ढूंढना। मेरा सिमुलेशन वैरिएबल त्वरण से संबंधित है जो परिणामों के लिए मौलिक हैं, इसलिए मुझे जो चाहिए वह दो पैराबॉलिक सेगमेंट का चौराहे/निकटतम दृष्टिकोण है।

उत्तर

4

वेबपेज पर एशेलली को संदर्भित किया गया है, निकटतम गति पर चलने वाली दो वस्तुओं के मामले में निकटतम दृष्टिकोण दृष्टिकोण विधि विकसित की गई है। हालांकि, मेरा मानना ​​है कि वही वेक्टर-कैलकुस विधि का उपयोग निरंतर गैर-शून्य त्वरण (वर्गबद्ध समय निर्भरता) के साथ चलने वाली दो वस्तुओं के मामले में परिणाम प्राप्त करने के लिए किया जा सकता है।

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

0 = |D_ACC|^2 * t^3 + 3 * dot(D_ACC, D_VEL) * t^2 + 2 * [ |D_VEL|^2 + dot(D_POS, D_ACC) ] * t + 2 * dot(D_POS, D_VEL)

जहां:

D_ACC = ob1.ACC-obj2.ACC

D_VEL = ob1.VEL-obj2.VEL (से पहले अद्यतन)

D_POS = ob1.POS-obj2.POS (

मैं व्युत्पन्न समीकरण जो निकटतम दृष्टिकोण के समय देना चाहिए बाहर काम किया अद्यतन से पहले भी)

और dot(A, B) = A.x*B.x + A.y*B.y + A.z*B.z

(ध्यान दें कि परिमाण |A|^2 के वर्ग dot(A, A) का उपयोग कर की जा सकती है)

टी के लिए इस का समाधान करने के लिए, आप शायद लोगों found on Wikipedia तरह सूत्रों का उपयोग करने की आवश्यकता होगी।

बेशक, यह आपको केवल निकटतम दृष्टिकोण का क्षण देगा। आपको इस पल में दूरी का परीक्षण करने की आवश्यकता होगी (ईक 2 जैसे कुछ का उपयोग करना)। यदि यह (obj1.Radius + obj2.Radius) से बड़ा है, तो इसे अवहेलना किया जा सकता है (यानी कोई टकराव नहीं)। हालांकि, अगर दूरी कम है, तो इसका मतलब है कि इस क्षण से पहले गोलाकार टकराते हैं। इसके बाद आप पहले के समय की दूरी का परीक्षण करने के लिए एक पुनरावृत्ति खोज का उपयोग कर सकते हैं। पुनरावृत्ति हल करने के बिना, किसी अन्य (यहां तक ​​कि अधिक जटिल) व्युत्पन्न के साथ आना संभव हो सकता है जो आकार को आकार में लेता है, या कुछ अन्य विश्लेषणात्मक समाधान ढूंढना संभव हो सकता है।

संपादित: उच्च आदेश की वजह से, समीकरण के समाधान के लिए कुछ वास्तव में सब से अधिक दूर जुदाई के क्षणों कर रहे हैं। मेरा मानना ​​है कि सभी मामलों में या तो 3 समाधानों में से 1 या 3 समाधानों में से 2 सबसे दूरदराज के अलगाव का समय होगा।

D''(t) = 3 * |D_ACC|^2 * t^2 + 6 * dot(D_ACC, D_VEL) * t + 2 * [ |D_VEL|^2 + dot(D_POS, D_ACC) ]

: आप विश्लेषणात्मक कि क्या आप एक मिनट या समय के संबंध में दूसरा व्युत्पन्न का मूल्यांकन (आप शून्य करने के लिए पहले व्युत्पन्न की स्थापना करके पाया जो टी के मूल्यों पर) द्वारा एक अधिकतम पर हैं परीक्षण कर सकते हैं यदि दूसरा व्युत्पन्न एक सकारात्मक संख्या का मूल्यांकन करता है, तो आप जानते हैं कि दी गई अवधि टी के लिए न्यूनतम, अधिकतम नहीं है।

+0

धन्यवाद tcovo, यह वास्तव में मेरी ज़रूरत पर एक अच्छी शुरुआत है। विकिपीडिया में वेक्टर गुणांक में क्यूबिक समीकरण समाधान का विस्तार करने का कोई विचार है? – RBarryYoung

+0

मैंने लिखा क्यूबिक समीकरण स्केलर गुणांक है: दो वैक्टरों का डॉट उत्पाद एक स्केलर है, और परिमाण का वर्ग भी एक स्केलर है। मैंने उन पर विस्तृत करने के लिए अपनी प्रतिक्रिया संपादित की। – tcovo

+0

आह, बढ़िया! धन्यवाद ... – RBarryYoung

1

ऐसा लगता है कि आप Closest Point of Approach (CPA) चाहते हैं। यदि यह त्रिज्या के योग से कम है, तो आपके पास टकराव है। लिंक में उदाहरण कोड है। आप मौजूदा वेग के साथ प्रत्येक फ्रेम की गणना कर सकते हैं, और जांच सकते हैं कि सीपीए समय आपके टिक आकार से कम है या नहीं। आप सीपीए समय को कैश भी कर सकते हैं, और केवल तभी अपडेट करें जब किसी भी आइटम पर त्वरण लागू किया गया हो।

+0

हां, मुझे यह विधि पता है। दुर्भाग्यवश, AFAIK यह मेरे समीकरण 2 (यानी त्वरण के साथ) के लिए हल नहीं करता है, यह केवल वस्तुओं के वेग के बढ़ते अनुप्रयोग के लिए हल करता है। मेरा इंजन वस्तुओं के लिए वेग और त्वरण के वृद्धिशील अनुप्रयोग का उपयोग करता है और इस प्रकार इसे हल करने के लिए एक अलग (उच्च-आदेश) सूत्र की आवश्यकता होती है। – RBarryYoung

+0

आपका टिक (डीटी) कितना समय है? मैंने देखा है कि ज्यादातर सिमुलेशन के लिए, यह काफी छोटा है कि '(obj.ACC * डीटी^2)/2' शब्द कम से कम किसी भी टिक के लिए लापरवाह है, कम से कम टकराव का पता लगाने के प्रयोजनों के लिए। – AShelly

+0

टिक अभी 1/10 वें सेकंड हैं, लेकिन यह पैरामीटर करने योग्य है और बदल सकता है। इससे भी बदतर यह तथ्य है कि 100 से अधिक जी की गति दोनों संभव है और कभी-कभी संभावना होती है। – RBarryYoung

2

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

वहां से आप अपने डेल्टा समय को टकराव पर ठीक से करने के लिए बैकस्टेप कर सकते हैं ताकि आप सही ढंग से बलों की गणना कर सकें।

क्या आपने भौतिकी लाइब्रेरी का उपयोग करने पर विचार किया है जो पहले से ही यह काम करता है? कई पुस्तकालयों के साथ काम कर रहे समीकरणों की प्रणालियों को हल करने के लिए कहीं अधिक उन्नत और अधिक स्थिर (बेहतर एकीकृतकर्ता) सिस्टम का उपयोग करते हैं। Bullet Physics दिमाग में आता है।

+0

फिर से, "लाइन सेगमेंट" मानता है कि वृद्धिशील आंदोलन का मेरा समीकरण है: (obj.POS = obj.POS * (obj.VEL * dT)}, जो * रैखिक * है। मेरा वृद्धिशील आंदोलन समीकरण * क्वाड्रैटिक * है, जो "पैराबॉलिक सेगमेंट" के न्यूनतम अलगाव के लिए हल करने की आवश्यकता है। इसे एक पूरी तरह से अलग (और अधिक कठिन) सूत्र की आवश्यकता है। – RBarryYoung

+1

मैं किसी और की भौतिकी लाइब्रेरी का उपयोग करने पर विचार नहीं कर रहा हूं क्योंकि मेरे मुख्य लक्ष्यों में से एक यह स्वयं करना है।इसके अतिरिक्त, ओपन सोर्स फिजिक्स इंजन के मेरे संक्षिप्त सर्वेक्षण में कोई भी ऐसा नहीं हुआ जो ऑब्जेक्ट त्वरण के साथ पर्याप्त रूप से निपटाया गया था जो कि उनकी दूरी के व्यस्त वर्ग (यानी, ग्रह ग्रैविटी, वे सभी लगातार त्वरण मानते हैं) या गति के साथ भिन्न होते हैं। सीमित प्रभाव और दृश्यता प्रसार (यानी, प्रकाश/सापेक्षता की गति), न ही कोई उचित तरीका भी उन्हें जोड़ता है। इन दोनों सिमुलेशन के लिए जरूरी हैं। – RBarryYoung

+0

मुझे नहीं पता कि आप कितने सटीक होने की कोशिश कर रहे हैं ... एक छोटे से पर्याप्त डीटी के लिए आप डेल्टा स्थिति को लाइन सेगमेंट के रूप में देख सकते हैं? – basszero

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