एक 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 ;
}