यदि दो एएबीबीज़ प्रतिच्छेद करते हैं तो सबसे तेज़ तरीका क्या है?


12

मेरे पास दो एएबीबी हैं जो आगे बढ़ रहे हैं, यह जांचने का सबसे तेज़ तरीका है कि क्या वे एक फ्रेम के तहत अंतर करेंगे?

हिलाने से मेरा मतलब है कि केवल सामान्य आयत चौराहे की विधि से जाँच करना नहीं है, मेरा मतलब है कि किसी भी तरह की सरल आसान बहने वाली परीक्षा जो केवल एक बूलियन, कोई हिट समय या अन्य कुछ नहीं लौटाती है।

मुझे लगता है कि बस इसे इस तरह करना है:

इस

लेकिन यह षट्कोण काफी जटिल है और मुझे नहीं पता कि AABB - बहुभुज चौराहे की गणना कैसे की जाए, क्या कोई आसान तरीका है?

कोई भी प्रोग्रामिंग भाषा जो आपको सबसे ज्यादा पसंद है, मैं उसे आसानी से पोर्ट कर सकता हूं।

धन्यवाद।


3
मैं उलझन में हूं। आपने विशेष रूप से "स्वेप्ट टेस्ट" का उल्लेख किया है, क्या आपने सामान्य एएबीबी स्वैप्ट टेस्ट की कोशिश की है? यह वही करता है जो आप चाहते हैं।
SomeWritesReserved 21

1
मैं ऊपर की टिप्पणी से सहमत हूं - "क्लासिक" परीक्षण में क्या गलत है? इसके अलावा, यहां प्रस्तावित समाधानों में से अधिकांश स्पष्ट रूप से धीमी हैं ... साथ ही उनमें से कुछ गलत परिणाम (मजबूत नहीं) दे सकते हैं।
वंद्रा २ w

आप एक्सिस टेस्ट को अलग करने की कोशिश कर सकते हैं gamedevelopment.tutsplus.com/tutorials/…
चरण

जवाबों:


8

Minkowski राशि का उपयोग करें

(एक अच्छा तरीका इस समस्या को हल करने के लिए प्रस्ताव की एक पंक्ति के बीच चौराहे पर विचार करना है v ) मूल (अनुवाद करने के लिए वी ' ) और मिंकोवस्की राशि का एक मूल (180 डिग्री घुमाया ए' ) और उसके बाधाओं (सिर्फ बी इस मामले में): ए 'बी

निम्नलिखित तस्वीर में मैं एक मनमाना समन्वय प्रणाली के मूल में एक स्मैक-डेब रखता हूं । द्वारा में 180 डिग्री परिणाम एक घूर्णन के रूप में समझने यह सरल ए ' , और वी मूल करने के लिए अनुवाद के बराबर होती है वी'

मिंकोवस्की योग हरे आयत है, और एक चलती के चौराहे अंक एक और एक स्थिर बी करके पाया जा सकता है लाइन AABB चौराहे । इन बिंदुओं को नीले घेरे के साथ चिह्नित किया गया है।

मिंकोव्स्की योग - पतित मामला

निम्नलिखित तस्वीर में एक अलग मूल का उपयोग किया गया था और समान चौराहे बिंदु पाए जाते हैं।

Minkowski राशि - अधिक सामान्य मामला

एकाधिक चलती AABBs

दो एएबीबी के लिए यह काम करने के लिए जो कि एक विशिष्ट अवधि के दौरान एक रैखिक फैशन में चलते हैं आप ए के वेग वेक्टर से बी के वेग वेक्टर को घटाएंगे और लाइन-एएबीबी चौराहे के लिए लाइन सेगमेंट के रूप में उपयोग करेंगे।

छद्म कोड

def normalize(aabb):
    return {x1: min(aabb.x1, aabb.x2), x2: max(aabb.x1, aabb.x2),
            y1: min(aabb.y1, aabb.y2), y2: max(aabb.y1, aabb.y2),

def rotate_about_origin(aabb):
    return normalize({x1: -aabb.x1, x2: -aabb.x2
                      y1: -aabb.y1, y2: -aabb.y2})

# given normalized aabb's
def minkowski_sum(aabb1, aabb2):
    return {x1: aabb1.x1+aabb2.x1, x2: aabb1.x2+aabb2.x2,
            y1: aabb1.y1+aabb2.y1, y2: aabb1.y2+aabb2.y2}

def get_line_segment_from_origin(v):
    return {x1: 0, y1: 0, x2: v.x, y2: v.y}

def moving_objects_with_aabb_intersection(object1, object2):
    A = object1.get_aabb()
    B = object2.get_aabb()

    # get A'⊕B
    rotated_A = rotate_about_origin(A)
    sum_aabb = minkowski_sum(rotated_A, B)

    # get v'
    total_relative_velocity = vector_subtract(object1.get_relative_velocity(), object2.get_relative_velocity())
    line_segment = get_line_segment_from_origin(total_relative_velocity)

    # call your favorite line clipping algorithm
    return line_aabb_intersection(line_segment, sum_aabb)

टकराव की प्रतिक्रिया

गेमप्ले के आधार पर आप या तो अधिक बारीक-बारीक टक्कर का पता लगाने का काम करेंगे (हो सकता है कि एएबीबी की जाली हो), या अगले चरण के लिए आगे बढ़ें: टकराव की प्रतिक्रिया।

जब टकराव होता है तो लाइन-एएबीबी-चौराहे एल्गोरिथ्म या तो 1 या 2 चौराहे के बिंदुओं पर वापस आ जाएगा, यह निर्भर करता है कि ए बी के अंदर अपना आंदोलन समाप्त करता है या क्रमशः इसके माध्यम से गुजरता है। (यह पतित मामलों को छूट दे रहा है, जहां ए चरस बी अपने पक्ष में या अपने संबंधित कोनों में से एक के साथ।)

किसी भी तरह से, लाइन खंड के साथ पहला चौराहा बिंदु टकराव बिंदु है, आप इसे वापस विश्व समन्वय प्रणाली में सही स्थिति में अनुवाद करेंगे (मूल v के साथ दूसरी तस्वीर में पहला हल्का नीला वृत्त , इसे पी कहें ) और फिर तय करें (जैसे, लोचदार टकराव के लिए p पर टकराव सामान्य के साथ v को दर्शाते हुए ) फ्रेम के अंत में A के लिए वास्तविक स्थिति क्या होगी ( At + 1 )।

टकराव की प्रतिक्रिया

यदि केवल 2 से अधिक कोलाइडर हैं, तो यह थोड़ा अधिक जटिल हो जाएगा, जैसा कि आप दूसरे, परिलक्षित, v के भाग के लिए भी टकराव का पता लगाना चाहते हैं ।


धन्यवाद, सबसे दिलचस्प। क्या आप यह समझा सकते हैं कि ए और बी चौराहे पर जाने के दौरान आप मामले को कैसे संभालते हैं, लेकिन चौराहे के बिना इस कदम को समाप्त कर सकते हैं?
GameAlchemist

@GameAlchemist वह टक्कर प्रतिक्रिया होगी, और इतनी टक्कर का पता लगाने (प्रश्न का मूल विषय) नहीं। लेकिन मुझे पेंट पसंद है, इसलिए संपादन संपादित करें। :-)
एरिक

अपडेट के लिए धन्यवाद (और योजनाओं के लिए हंगामा :-)), यह मेरा सवाल नहीं था, लेकिन मुझे यह समझने में मदद मिली कि आपका एल्गोरिदम पहले से ही मामले को संभालता है जब A पूरी तरह से बी से गुजरता है
GameAlchemist

5

OBB - ओरिएंटेड बाउंडिंग बॉक्स। यहाँ एक ट्यूटोरियल है

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

यदि आप त्वरित चौराहे की परीक्षा की तलाश कर रहे हैं, तो यह देखने के लिए कि क्या वे संभवतः प्रतिच्छेदन करते हैं, आप एक एएबीबी बना सकते हैं जो ऑब्जेक्ट ए के एएबीबी को शुरू और अंत दोनों स्थितियों में घेर लेता है। यदि AABB इस सब के साथ AABB को सम्मिलित नहीं करता है, तो कोई प्रतिच्छेदन नहीं है; हालांकि, इससे झूठी सकारात्मकता पैदा हो सकती है, इसलिए आपको इसे केवल प्रारंभिक परीक्षण के रूप में उपयोग करना चाहिए।


4

आपको OOB की आवश्यकता नहीं है और आपको समय-कदम टकराव का पता लगाने की आवश्यकता नहीं है। बस सामान्य AABB बह परीक्षण का उपयोग करें, इस लिंक को देखें । एसेन्स में यह वही होता है जो आपके आरेख में होता है: चलती एएबीबी प्रारंभ बिंदु से अंत बिंदु तक "बह" है और फिर इसका उपयोग अन्य, स्थिर एएबी के खिलाफ टक्कर का पता लगाने के लिए किया जाता है।

यदि आप चिंतित हैं कि यह बह परीक्षण अधिक महंगा है क्योंकि यह "प्रभाव समय" लौटाता है, तो मुझे लगता है कि आप समय से पहले अनुकूलन कर रहे हैं।

स्वेप्ट परीक्षणों के बारे में अधिक गहराई से जानकारी उत्कृष्ट पुस्तक में मिल सकती है: क्रिस्टरन द्वारा रियल-टाइम कोलिशन डिटेक्शन


3

AABB सन्निकटन एज केस कमजोरी

आपको पहले आंदोलन को छोटे चरणों में विघटित करने और उच्च-स्तरीय एएबीबी की गणना करने के लिए उस जानकारी का उपयोग करने की आवश्यकता होगी। यदि बड़े AABB के अंतःक्षिप्त हैं, तो आप अधिक सटीक होने के लिए छोटे चरणों की जांच कर सकते हैं।

अनुमान लगाना कि क्या AABB (या OOBB) का उपयोग करके टकराव हो सकता है या नहीं, केवल आरंभिक और समाप्त होने वाले पदों का उपयोग करके टकरावों को याद किया जा सकता है यदि वस्तु या तो जल्दी से घूम रही है और दूसरे की तुलना में एक आयाम में लंबी है।

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

यदि बड़े एएबीबी के साथ एक चौराहा है, तो आप छोटे एएबीबी का उपयोग कर सकते हैं जो पहले से ही निर्धारित करने के लिए गणना की गई थी कि टक्कर कहाँ हो सकती है। छोटे AABBs में से प्रत्येक के लिए जो दूसरी वस्तु के साथ प्रतिच्छेद करते हैं, तब आप अधिक महंगे मेष चौराहे का पता लगा सकते हैं।


2
या किसी भी रोटेशन के लिए BB की अधिकतम चौड़ाई का पूर्वव्यापी रूप से उपयोग कर सकते हैं और इसका उपयोग कर सकते हैं
शाफ़्ट फ्रीक

2

आपको आंदोलन को आंदोलन के छोटे चरणों में विघटित करना होगा। उदाहरण के लिए:

आप अधिक डेटासेटेन (इस मामले में, एक्स-अक्ष) का उपयोग करके आंदोलन को विघटित करना चाहते हैं, और फिर प्रत्येक चरण में टकराव की जांच करें।

यह बहुत महंगा लग सकता है, लेकिन इस बात पर ध्यान दें कि प्रत्येक चक्र की अपनी चौड़ाई की तुलना में तेजी से आगे बढ़ने वाली वस्तु तेजी से तेज होगी, इसलिए यह परिदृश्य उतना सामान्य नहीं है जितना कि आप पहले सोच सकते हैं।


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

1
हाँ, यह एक ठीक समाधान है, लेकिन बहुत अच्छा नहीं है। जब वस्तुओं के कोनों के पास टकराव होता है, तो सटीकता में तेजी से कमी आती है, गति में वृद्धि (या सटीकता, कार्यान्वयन के आधार पर) के रूप में प्रदर्शन कम हो जाता है, और यह सिर्फ अनावश्यक रूप से हैक होता है।
BWG

2

आपको टकराव की जांच के लिए सापेक्ष गति का भी उपयोग करना चाहिए ताकि एक एएबीबी "स्थिर" हो और दूसरा अपनी गति की गति पर "स्थिर" एक की गति को कम करे।

यह देखने का सबसे तेज़ तरीका है कि क्या वे प्रतिच्छेद कर सकते हैं बस गति के साथ चलती AABB का विस्तार करना है।

उदाहरण के लिए AABB 0.1 x / फ्रेम के साथ दाईं ओर घूम रहा है, तो आप इसे बढ़ाते हैं, इसलिए बाएं किनारे समान रहता है और दायां किनारे 0.1 आगे रहता है। फिर आप नए AABB से जांच कर सकते हैं। अगर झूठ है तो कोई टक्कर नहीं है। (शुरुआती वापसी और छोटी गति के लिए सटीक)।

तब आप जांच सकते हैं कि क्या अंत और चलती वस्तु के एएबीबी को शुरू करता है। अगर सच है तो सच लौटाओ।

अन्यथा आपको यह जांचने की आवश्यकता है कि क्या विकर्ण स्थिर एबीबी को काटता है।

इसमें विकर्ण के निर्देशांक प्राप्त करना शामिल है जहां x = स्थैतिक के बाएं किनारे और दाएं किनारे को देखते हैं कि क्या y नीचे और ऊपर है। (दूसरे तरीके से दोहराएं)

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