छोटे, हाई-स्पीड ऑब्जेक्ट टकराव: टनलिंग से बचना


14

EDIT / UPDATE: अभी मेरा सबसे बड़ा सवाल यह है कि क्या चरण 3 का "t = ..." समीकरण एक अच्छा विचार है या इसे करने का एक बेहतर तरीका है। अधिकांश अन्य मुद्दों को आंशिक या पूर्ण रूप से संबोधित किया गया है, लेकिन इस मुद्दे पर कोई टिप्पणी या उत्तर वास्तव में नहीं आया है। फिर, एक विश्लेषणात्मक समाधान की आवश्यकता है, वेग और दूरियां बहुत बड़ी हैं, और वस्तुएं बहुत छोटी हैं, किसी भी पुनरावृत्ति / पुनरावर्ती समाधान के लिए (कुछ टिप्पणियों में नीचे सुझाव दिए गए हैं) जो मैं सोच सकता हूं (हालांकि अगर वहाँ है एक विशेष पुनरावृत्ति / पुनरावर्ती समाधान जो इस प्रकार की स्थितियों को ठीक से संभाल लेगा फिर मैं निश्चित रूप से इसके लिए खुला हूं)। आपकी मदद के लिए अब तक बहुत-बहुत धन्यवाद, आप सभी बहुत बढ़िया हैं और मैं वास्तव में आपके विचारों और मदद की सराहना करता हूं!

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

रे कास्टिंग काम नहीं करेगी, क्योंकि यह दो उच्च गति वाली वस्तुओं के बीच टकराव का पता लगा रही है, न कि एक वस्तु और एक स्थिर दीवार के बीच। (जब तक कि मैं किरण की गलतफहमी नहीं कर रहा हूँ?) प्रदर्शन बहुत विचार योग्य है; यदि संभव हो तो, मैं एक बड़े प्रदर्शन हिट से बचना चाहता हूं। मेरे पास पहले से ही एक कार्यात्मक और बहुत प्रभावी क्वाड्री ( http://en.wikipedia.org/wiki/Quadtree ) लागू है, इसलिए मैं नीचे बताए अनुसार इसे संशोधित और उपयोग करूंगा।

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

प्रस्तावित समाधान:

चरण 1:

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

चरण 2: (इस चरण को छोड़ना चाह सकते हैं?)

क्वाडट्री द्वारा उत्पन्न संभावित टक्करों की सूची के माध्यम से जाना। देखें कि क्या आयतें प्रत्येक संभावित टकराव में अंतर करती हैं। यदि हां, तो चरण 3 पर आगे बढ़ें।

संपादित करें: नीचे, शॉन मिडिलडविच ​​ने स्वेप्ट वॉल्यूम / कैप्सूल के चौराहे (यदि ऑब्जेक्ट हलकों हैं) का उपयोग करने का सुझाव दिया। यह तीन विकल्प छोड़ता है: 1) चरण 2 को पूरी तरह से छोड़ दें। २) चरण २ मेरा मार्ग करो। 3) इसे शॉन के रास्ते से करें। सीन का तरीका मेरे बॉक्स आइडिया की तुलना में अधिक कम्प्यूटेशनल रूप से महंगा होगा, हालांकि यह मेरे रास्ते से अधिक झूठी सकारात्मकता को खत्म करेगा, उन्हें अंतिम चरण तक पहुंचने से रोकता है।

क्या कोई भी अनुभव से बोल सकता है कि इन 3 विकल्पों में से कौन सा विकल्प सबसे अच्छा है? (मैं कुछ अलग चीज़ों के लिए इस भौतिकी इंजन का उपयोग करने का इरादा रखता हूं, इसलिए मैं "आम तौर पर सबसे अच्छा" समाधान की तलाश कर रहा हूं जो कि विभिन्न प्रकार की स्थितियों में सबसे तेज़ काम करता है, न कि केवल एक विशिष्ट परीक्षण मामला जिसमें मैं आसानी से माप सकता हूं कि कौन सा समाधान सबसे तेज है)।

चरण 3:

नीचे t = समीकरण का उपयोग करें, यदि विभेदक (यानी वर्गमूल के नीचे का हिस्सा) नकारात्मक या 0 है, तो कोई टकराव नहीं, यदि सकारात्मक है तो टक के समय के रूप में t मान का उपयोग करें (जिसके बाद तदनुसार पदों को समायोजित करना आसान है। .. यदि दोनों वस्तुओं के टकराने के बाद भी अस्तित्व बना रहे)। समीकरण:

t = (-1/2 sqrt ((2 a w-२ a x + २ b y-२ b z-२ c w + २ c x-२ d y + २ dz) ^ 2-4 (w ^ 2- 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - a w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) का है

जहाँ (1 और 2 का उपयोग ऑब्जेक्ट 1 और 2 को दर्शाने के लिए किया जाता है):

t 0 और -1 के बीच एक नकारात्मक समय मान है, जहां 0 वर्तमान फ्रेम है, और -1 पिछला फ्रेम है;

a = x स्थिति 1;

बी = वाई स्थिति 1;

सी = एक्स स्थिति 2;

d = y स्थिति 2;

w = x वेग 1;

x = x वेग 2;

y = y वेग 1;

z = y वेग 2;

आर = त्रिज्या 1;

s = त्रिज्या 2;

व्युत्पत्ति: (^ 2 का अर्थ है चुकता)

वस्तुओं के गतियों के लिए पैरामीट्रिक समीकरण (उदाहरण के लिए, newxpos1 = a + t w) लें और उन्हें दूरी सूत्र (दोनों पक्षों को विभाजित करते हुए) में प्लग करें: दूरी सूत्र चुकता = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2। याद रखें, टी नकारात्मक होने वाली है। दो गोलाकार वस्तुओं के टकराने का समय ज्ञात करने के लिए हम बाईं ओर (r + s) ^ 2 के बराबर सेट करते हैं। द्विघात समीकरण (और बहुत थकाऊ बीजगणित का एक बड़ा सौदा) का उपयोग करके टी के लिए समाधान, हम उपरोक्त "टी = ..." समीकरण प्राप्त करते हैं।

मेरे सवाल:

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

2) क्या मेरे प्रदर्शन से बहुत नुकसान होगा? मुझे नहीं लगता कि यह होगा, लेकिन अगर यह होगा, तो क्या यह करने का एक बेहतर तरीका है?

3) क्या मुझे चरण 2 को छोड़ देना चाहिए और चरण 1 से 3 तक सीधे जाना चाहिए? स्पष्ट रूप से चरण 2 महत्वपूर्ण नहीं है, लेकिन यह प्रदर्शन में मदद कर सकता है (या इसे सहेजने की तुलना में अधिक सीपीयू समय खर्च हो सकता है)।

अन्य सभी टिप्पणियाँ, सुझाव, या आलोचना बहुत स्वागत है। आपके सहयोग के लिए धन्यवाद!


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

लगता है कि आपके पास पहले से ही एक योजना है .. इसे आज़माएं और देखें कि यह कैसे काम करता है?
ट्रेवर पॉवेल

मुझे लगता है कि "सामान्य" तरीका आपके डेल्टा समय पर एक छोटे से अधिकतम अंतराल है। इसलिए यदि आपके पास 1000ms इलास्ट हैं, तो बस 10x 100ms (या 100x 10ms, या 33x 30ms, या अन्य समान) का अनुकरण करें।
ashes999

@ रंडीगुल I ने पृष्ठ 215-218 पर वर्णित एल्गोरिथ्म को देखा, विशेष रूप से पृष्ठ 218 (Google पूर्वावलोकन)। यह काफी सुरुचिपूर्ण है, हालांकि मैंने अभी तक इसके सभी निहितार्थों, शक्तियों, और कमजोरियों के माध्यम से नहीं सोचा है। क्या यह मेरी तुलना में बहुत तेज होगा? यदि हां, तो एंडरसन की पुनरावृत्ति की तुलना में मेरे एल्गोरिथ्म का कौन सा हिस्सा धीमा है? चरण 3 में समीकरण बहुत धीमा होने वाला है? पुनरावृत्ति मुझे संकोच करती है, क्योंकि कुछ ऑब्जेक्ट बहुत तेजी से आगे बढ़ सकते हैं, और इसलिए कुछ मामलों में पुनरावृत्ति का एक बड़ा सौदा आवश्यक हो सकता है। (इसके अलावा, उस पुस्तक के लिए
OUCH

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

जवाबों:


9

आपने अनिवार्य रूप से बह संस्करणों के कुछ हद तक अति उत्साही संस्करण बनाया है ।

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

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

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

देखें वास्तविक समय टकराव की जांच का पता लगाने के टकराव के विषय पर बेहतर परिचयात्मक / मध्यस्थ पुस्तकों में से एक के लिए।


भयानक इनपुट के लिए धन्यवाद! आपके उत्तर को तोड़ते हुए इसलिए मैं इसके बारे में प्रश्न पूछ सकता हूं: "" स्वीप "वस्तु को इसकी शुरुआत से अंत तक।" अब तक मैं ट्रैक कर रहा हूं; निश्चित रूप से मेरे बॉक्स विधि पर एक सुधार। मैं इन आकृतियों को क्वाडट्री द्वारा खिलाऊँगा और फिर अधिक सटीक टकरावों के लिए जाँच करूँगा। "आप गणना कर सकते हैं कि टक्कर कब हुई थी।" हाहा आसान से किया गया :) क्या आप अनुशंसा कर रहे हैं कि मैं कदम के लिए चरण 3 से अपने समीकरण के साथ रहूं? या कोई बेहतर तरीका है? यह वास्तव में महत्वपूर्ण हिस्सा है।
माइंडसेकर

[जारी रखा] "एक और विकल्प ..." मैंने उस विकल्प के बारे में सोचा, लेकिन दुर्भाग्य से गति बहुत अधिक है। @ Ashes999 पर मेरी टिप्पणी की प्रतिक्रिया देखें और अधिक जानकारी के लिए ऊपर संपादित करें। मदद के लिए आपका बहुत बहुत धन्यवाद!
माइंडसेकर

प्रदर्शन के बारे में जानने का एकमात्र तरीका इसे आज़माना, इसे मापना और देखना है। मैंने कुछ "स्पष्ट रूप से" अयोग्य कोड को बड़े पैमाने पर पहले से कुशल संस्करणों का प्रदर्शन करते देखा है, आमतौर पर काफी गैर-सहज कारणों से। सबसे तेज क्या है यह मत पूछो; परीक्षण करें और पता करें।
शॉन मिडिलडाइच

पर्याप्त रूप से, मैं आगे जाऊंगा और अपने तरीके को आजमाऊंगा, जैसा कि आपने सुझाया है। टिप्पणी में मेरा प्रश्न अभी भी खड़ा है: "आप गणना कर सकते हैं कि टक्कर कब हुई थी।" क्या आप अनुशंसा कर रहे हैं कि मैं उस चरण के लिए चरण 3 से अपने समीकरण के साथ रहूं? या कोई बेहतर तरीका है? मेरे विचार से यह सबसे कठिन हिस्सा है। स्वेप्ट वॉल्यूम, अगर मैं उन्हें सही ढंग से समझ रहा हूं, तो मुझे बता सकते हैं कि ऑब्जेक्ट्स का मार्ग चौराहा है, लेकिन यह नहीं बता सकता है कि क्या / जब ऑब्जेक्ट स्वयं टकराते हैं।
माइंडसेकर

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

2

प्रश्न में प्रस्तावित एल्गोरिथ्म महान काम करता है: यह तेज़ है और पूरी तरह से सटीक है , तब भी जब ऑब्जेक्ट चरम गति से जा रहे हैं। मेरे पास एक क्वाडट्री लागू है, इसलिए चरण 1 में से 1 बॉक्स में बक्से को खिलाने के बाद, मैंने चरण 2 को अनावश्यक पाया: मेरा कार्यक्रम पहले की तरह लगभग तेजी से चल रहा था।

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


1

मेरे पास अभी तक टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन मैं यह जोड़ना चाहूंगा कि ऊपर उल्लेखित शॉन मिडिलडच का उपयोग करने से आपके "टी" की गणना करना संभव हो जाता है। कम से कम अगर मैं उसका जवाब समझ गया और आप सही तरीके से सवाल करते हैं।

यहाँ सैम होसेवर द्वारा एक भयानक उत्तर के लिए एक कड़ी है जो इसके बारे में सबसे अच्छा विवरण प्रदान करता है जो मैंने कभी पाया है (उसने चित्रों को भी, हुर्रे!)

/gamedev//a/55991/112940

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

"लिंक केवल उत्तर" छोड़ने से बचने के लिए, मैं उनके विचार का त्वरित सारांश प्रदान करूंगा:

  1. दो बाउंडिंग बॉक्स के बीच मिन्कोवस्की अंतर की गणना करें
  2. तब के बीच सापेक्ष वेग का उपयोग करते हुए, चौराहे के बिंदु को प्राप्त करने के लिए मिन्कोवस्की अंतर द्वारा बनाए गए बॉक्स से उत्पत्ति के लिए एक किरण / रेखा खंड कास्ट करें
  3. यदि किरण टकराती है, तो आपके वेग की दूरी को वैक्टर की लंबाई से विभाजित करें, जो सापेक्ष वेग का प्रतिनिधित्व करता है और आपके पास "" "" होगा
  4. ऊपर दिए गए लिंक पर क्लिक करें और बहुत सारी तस्वीरों के साथ इस सब का सुंदर विवरण देखें। ये अदभुत है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.