একটি ওবিবি একটি উত্তল হাল। উত্তল হাল একটি 3D আকৃতি যার পৃষ্ঠে কোনও "ক্র্যানিজ" নেই। উত্তল হলের উপরের প্রতিটি "bগল" (ভার্টেক্স) বাহ্যিকভাবে প্রসারিত হয় , কখনই অভ্যন্তরীণ হয় না। যদি আপনি উত্তল হলের মাধ্যমে একটি বিমানটি টুকরো টুকরো করেন তবে আপনি (কেবলমাত্র একটি) উত্তল বহুভুজ পাবেন। যদি আপনি উত্তল হলের অভ্যন্তরে থাকেন এবং বাহিরের দিকে ইঙ্গিত করে একটি লেজার ফায়ার করেন তবে আপনি কেবল হলের পৃষ্ঠটি একবার খোঁচাবেন (কখনও কখনও নয়)।
বিভাজক অক্ষের উপপাদ্য পরীক্ষাটি উত্তল হালগুলির সংঘর্ষ সনাক্ত করতে ব্যবহার করা যেতে পারে। স্যাট পরীক্ষাটি সহজ। এটি 2D এবং 3 ডি তে কাজ করে। যদিও নীচের ছবিগুলি 2 ডি তে হবে তবে সেগুলি কেবল 3 ডি তে প্রয়োগ করা যেতে পারে।
ধারণা
আপনি স্যাট এর সাথে এটিই মূল ধারণাটি ব্যবহার করছেন:
- দুটি আকার কেবল তখনই ছেদ করতে পারে যখন উভয় আকারের প্রতিটি সাধারণ অক্ষের উপরে "প্রজেক্ট করা" থাকে যখন তাদের ওভারল্যাপ হয় ।
1 ডি ভেক্টরটির উপর কোনও আকারের "প্রজেকশন" দেখতে দেখতে এটি দেখতে (আমি যাকে বলে "ক্রাশিং")
লাল ভার্টস এবং একটি অক্ষ সহ একটি আকার
"আকৃতিটিকে অক্ষরেখায় প্রবর্তন করা" অর্থ অক্ষের উপর অবতরণের জন্য আকৃতির প্রতিটি বিন্দু থেকে একটি লম্ব নামানো। আপনি এটিকে একটি হাত দ্বারা পয়েন্টগুলি "ক্রাশিং" হিসাবে ভাবতে পারেন যা সমস্ত কিছু জড়ো করে এবং লম্বালম্বিভাবে এটি অক্ষের নীচে চূর্ণ করে দেয়।
আপনি যা রেখে গেছেন: একটি অক্ষের উপরে পয়েন্ট
স্যাট বলেছেন:
ছেদ করার জন্য ২ উত্তল হোলগুলির জন্য, তাদের প্রতিটি অক্ষের উপর ওভারল্যাপ করতে হবে (যেখানে উভয় আকারের প্রতিটি সাধারণকে আমাদের অক্ষ হিসাবে বিবেচনা করে)।
এই 2 টি আকার নিন:
আপনি দেখতে পাচ্ছেন যে তারা ছেদ করছে না, সুতরাং ওভারল্যাপটি ঘটেছিল না এমনটি দেখানোর জন্য কয়েকটি অক্ষ ব্যবহার করে দেখি ।
পেন্টাগনের উপরের সাধারণটি চেষ্টা করে দেখছি:
এগুলি এক্সটেন্টস। তারা ওভারল্যাপ করে।
আয়তক্ষেত্রের বাম দিকে চেষ্টা করুন। এখন তারা এই অক্ষটিতে ওভারল্যাপ করে না, অতএব কোনও ইন্টারসেকশন নেই।
অ্যালগরিদম:
উভয় আকারে প্রতিটি মুখের জন্য স্বাভাবিক :
- Ax অক্ষের উপর উভয় আকারের সমস্ত শীর্ষবিন্দু কোণার বিন্যাসের প্রক্ষেপণের সর্বনিম্ন এবং সর্বাধিক সীমাবদ্ধ (সবচেয়ে বড় এবং ক্ষুদ্রতম মান) সন্ধান করুন
- যদি তারা ওভারল্যাপ না করে তবে কোনও ছেদ নেই ।
এবং সত্যিই এটি। স্যাট কাজ করার কোডটি খুব ছোট এবং সহজ।
এখানে কিছু কোড যা দেখায় যে কীভাবে স্যাট অক্ষের প্রক্ষেপণ করতে হয়:
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 ;
}