ओबीबी बनाम ओबीबी टकराव का पता लगाने


20

मान लें कि आपके पास दो बाउंडिंग बॉक्स ऑब्जेक्ट हैं, जिनमें से प्रत्येक वेक्टर में बॉक्स के वर्तमान वर्टिकल को संग्रहीत करता है, जिसमें ऑब्जेक्ट के सभी कोने एक सामान्य अक्ष के सापेक्ष घुमाए गए और अनुवादित होते हैं।

यहाँ मेरी समस्या को चित्रित करने के लिए एक चित्र है:

अगर दो ओबीबी समस्या के समाधान का स्वागत करने में मदद करने के लिए किसी भी लिंक को ओवरलैप कर रहे हैं तो मैं कैसे काम कर सकता हूं। कुछ भी नहीं बहुत कृपया ...

जवाबों:


16

एक OBB एक उत्तल पतवार है। उत्तल पतवार एक 3 डी आकार है जिसकी सतह पर कोई "क्रेननी" नहीं है। उत्तल पतवार पर प्रत्येक "बम्प" (वर्टेक्स) बाहर की ओर बढ़ता है , कभी अंदर की ओर नहीं। यदि आप एक विमान को एक उत्तल पतवार के माध्यम से काटते हैं तो आपको (केवल एक) उत्तल बहुभुज मिलेगा। यदि आप एक उत्तल पतवार के अंदर हैं और बाहर की ओर इशारा करते हुए एक लेजर आग लगाते हैं, तो आप केवल एक बार पतवार की सतह के माध्यम से पंच करेंगे (कभी दो बार नहीं)।

उत्तल धुरी की टक्कर का पता लगाने के लिए पृथक्करण एक्सिस प्रमेय परीक्षण का उपयोग किया जा सकता है। SAT परीक्षा सरल है। यह 2D और 3D में काम करता है। हालाँकि नीचे के चित्र 2D में होंगे, वे आसानी से 3D में लागू किए जा सकते हैं।

संकल्पना

यह वह महत्वपूर्ण अवधारणा है जिसका आप SAT के साथ उपयोग कर रहे हैं:

  • दो आकृतियाँ केवल तभी प्रतिच्छेद करती हैं जब वे दोनों आकृतियों के प्रत्येक सामान्य अक्ष पर "प्रक्षेपित" होने पर ओवरलैप होती हैं

1 डी वेक्टर पर एक आकृति का "प्रोजेक्शन" इस तरह दिखता है (जिसे मैं "क्रशिंग" कहता हूं)

लाल वत्स और एक अक्ष के साथ एक आकृति

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

आप किसके साथ रह गए हैं: अंक एक अक्ष पर

यहां छवि विवरण दर्ज करें

सैट कहता है:

चौराहे पर 2 उत्तल पतवारों के लिए, उन्हें प्रत्येक अक्ष पर ओवरलैप करना होगा (जहां प्रत्येक सामान्य आकृति या तो एक अक्ष के रूप में गिना जाता है जिसे हमें जांचना चाहिए)।

ये 2 आकार लें:

यहां छवि विवरण दर्ज करें

आप देखते हैं कि वे एक दूसरे को नहीं काटते हैं, इसलिए यह दिखाने के लिए कुछ कुल्हाड़ियों की कोशिश करते हैं कि ओवरलैप नहीं होता है।

पेंटागन के शीर्ष सामान्य की कोशिश:

यहां छवि विवरण दर्ज करें

ये विस्तार हैं। वे ओवरलैप करते हैं।

यहां छवि विवरण दर्ज करें

आयत के बाईं ओर का प्रयास करें। अब वे इस अक्ष में ओवरलैप नहीं करते हैं, इसलिए कोई अंतर नहीं है।

यहां छवि विवरण दर्ज करें

कलन विधि:

दोनों आकृतियों पर सामान्य चेहरे के लिए :

  • उस अक्ष पर दोनों आकृतियों के सभी शीर्ष कोने बिंदुओं के प्रक्षेपण का न्यूनतम और अधिकतम विस्तार (सबसे बड़ा और सबसे छोटा मान) ज्ञात करें।
  • यदि वे ओवरलैप नहीं करते हैं, तो कोई चौराहा नहीं है

और वाकई ऐसा है। SAT काम करने के लिए कोड बहुत छोटा और सरल है।

यहाँ कुछ कोड है जो दर्शाता है कि SAT अक्ष प्रक्षेपण कैसे किया जाता है:

void SATtest( const Vector3f& axis, const vector<Vector3f>& ptSet, float& minAlong, float& maxAlong )
{
  minAlong=HUGE, maxAlong=-HUGE;
  for( int i = 0 ; i < ptSet.size() ; i++ )
  {
    // just dot it to get the min/max along this axis.
    float dotVal = ptSet[i].dot( axis ) ;
    if( dotVal < minAlong )  minAlong=dotVal;
    if( dotVal > maxAlong )  maxAlong=dotVal;
  }
}

कॉलिंग कोड:

// Shape1 and Shape2 must be CONVEX HULLS
bool intersects( Shape shape1, Shape shape2 )
{
  // Get the normals for one of the shapes,
  for( int i = 0 ; i < shape1.normals.size() ; i++ )
  {
    float shape1Min, shape1Max, shape2Min, shape2Max ;
    SATtest( normals[i], shape1.corners, shape1Min, shape1Max ) ;
    SATtest( normals[i], shape2.corners, shape2Min, shape2Max ) ;
    if( !overlaps( shape1Min, shape1Max, shape2Min, shape2Max ) )
    {
      return 0 ; // NO INTERSECTION
    }

    // otherwise, go on with the next test
  }

  // TEST SHAPE2.normals as well

  // if overlap occurred in ALL AXES, then they do intersect
  return 1 ;
}

bool overlaps( float min1, float max1, float min2, float max2 )
{
  return isBetweenOrdered( min2, min1, max1 ) || isBetweenOrdered( min1, min2, max2 ) ;
}

inline bool isBetweenOrdered( float val, float lowerBound, float upperBound ) {
  return lowerBound <= val && val <= upperBound ;
}

Hullinator उत्तल hulls के लिए सैट परीक्षण को लागू करता है
bobobobo

जबरदस्त व्याख्या! धन्यवाद। मुझे लगता है कि आपके पास लाइन में एक टाइपो हो सकता है: "तो यह दिखाने के लिए कुछ कुल्हाड़ियों की कोशिश करें कि एक ओवरलैप नहीं होता है।", क्योंकि तब आप उदाहरण देते हैं जहां वे ओवरलैप करते हैं। एक बार फिर धन्यवाद!

क्या आपको मानदंडों के सभी क्रॉस उत्पादों के लिए भी परीक्षण करने की आवश्यकता नहीं है? यह लेख geometrictools.com/Documentation/DynamicCollisionDetection.pdf ऐसा कहता है।
23:FINITEi

यह बताते हैं कि SAT की यह विशिष्ट विधि केवल 2D में काम करती है। 3 डी में आपको प्रत्येक चेहरे के मानदंडों से अधिक प्राप्त करने की आवश्यकता है। एक बार जब आपके पास सही मानदंड होते हैं, हालांकि, बाकी प्रक्रिया (परियोजना, तुलना) बिल्कुल समान है।
निधि मोनिका का मुकदमा

वास्तव में अपने 2D चित्रों से यह बताना कठिन है कि तीर किस दिशा में जा रहे हैं।
WDUK

7

आपको निश्चित रूप से अलग एक्सिस प्रमेय को देखना चाहिए । यह उत्तल वस्तुओं के लिए है। एक नियम है: "यदि दो उत्तल वस्तुएं एक दूसरे को नहीं काटती हैं, तो एक ऐसा विमान है जहां इन दो वस्तुओं का प्रक्षेपण नहीं होगा"।

आप विकी पर कुछ उदाहरण पा सकते हैं । लेकिन यह आपके मामले की तुलना में थोड़ा अधिक जटिल है।

आपकी समस्या के लिए कुछ और उपयुक्त यहाँ पाया जा सकता है (दो कारें टकराने वाली)।


1

अधिक सैट लेख।

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

http://rocketmandevelopment.com/tag/separation-axis-theorem/

अच्छा, पुराना एन-गेम ट्यूटोरियल। वेब पर सर्वश्रेष्ठ सैट सिद्धांत।

http://www.metanetsoftware.com/technique/tutorialA.html


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

तुम्हारा क्या मतलब है यह काम नहीं करता है? इस बात पर ध्यान दें कि आप अपने वर्टिकल को कैसे स्टोर कर रहे हैं, जिस इमेज में आप उन्हें कार्टेशियन कोऑर्डिनेट सिस्टम में रखते हैं, उस ट्यूटोरियल में वह सेंटर्स को सेंटीरोइड के सापेक्ष स्टोर करता है (आपको बस इतना करना है कि आप अपने ही पर्स से सेंट्रो को घटाएं) उन पंक्तियों को हटाएं जहां वह अपने स्वयं के कोने को संशोधित करता है), डॉट उत्पाद जैसे कार्य आप स्वयं बना सकते हैं, आपको उन लोगों के लिए मार्गदर्शक की आवश्यकता नहीं है, बाकी को सीधे आगे होना चाहिए, यह कॉपी पेस्ट सामग्री नहीं है, इसे लागू करने की कोशिश करने से पहले एसएटी सीखें।
dreta

मैंने इसे कैसे लागू किया है: SAT.as , Shape2D.as , सेंट्रोइड से आपका क्या मतलब है? बहुभुज का केंद्र जैसे (x, y)?
जोशुआ बार्नेट

फिलहाल मेरे पास एक फ़ंक्शन getOBB () है जो मेरी मूल छवि में विस्तृत के रूप में लंबवत देता है। यह एक वेक्टर <b2Vec2> से आकृतियों के कोण, एक कोण चर और एक स्थिति चर से गणना की जाती है।
जोशुआ बार्नेट

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