ওবিবি বনাম ওবিবি সংঘর্ষ সনাক্তকরণ


20

বলুন যে আপনার দুটিতে বাউন্ডিং বক্স অবজেক্ট রয়েছে যার প্রতিটি বাক্সের বর্তমান সূচকে একটি ভেক্টরে সংরক্ষণ করে অবজেক্টের সমস্ত শীর্ষবিন্দুটি ঘোরানো হয়েছে এবং একটি সাধারণ অক্ষের সাথে সম্পর্কিত অনুবাদ করা হয়েছে।

আমার সমস্যাটি চিত্রিত করার জন্য এখানে একটি চিত্র রয়েছে:

দু'জন ওবিবি যদি সমস্যার সমাধান বোঝাতে সহায়তা করতে কোনও লিঙ্ককে ওভারল্যাপ করে তবে আমি কীভাবে কাজ করব welcome খুব বেশি কিছু সংঘবদ্ধ হয়নি ...

উত্তর:


16

একটি ওবিবি একটি উত্তল হাল। উত্তল হাল একটি 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 ;
}


দুর্দান্ত ব্যাখ্যা! ধন্যবাদ। আমি মনে করি আপনার লাইনে একটি টাইপো থাকতে পারে: "সুতরাং ওভারল্যাপটি না ঘটেছিল তা দেখানোর জন্য কয়েকটি অক্ষ ব্যবহার করে দেখি " ", কারণ তারপরে আপনি উদাহরণ দিয়ে যেতে পারেন যেখানে তারা ওভারল্যাপ করে do আবার ধন্যবাদ!

নরমালগুলির সমস্ত ক্রস পণ্যগুলির জন্যও আপনার পরীক্ষা করার দরকার নেই? এই নিবন্ধটি জ্যামিতিকটলস / ডকুমেন্টেশন / ডায়নামিককোলিজেনডেটিশন.পিডিএফ তাই বলে।
iNFINITEi

এটি উল্লেখ করার মতো যে স্যাটের এই নির্দিষ্ট পদ্ধতিটি কেবলমাত্র 2 ডি তে কাজ করে। 3 ডি-তে আপনাকে প্রতিটি মুখের স্বাভাবিকের চেয়ে বেশি পেতে হবে। একবার আপনার ঠিক স্বাভাবিক হয়ে গেলে, বাকি প্রক্রিয়া (প্রকল্প, তুলনা) হুবহু একই।
মনিকার লসুইট

আপনার 2 ডি ছবি থেকে তীরগুলি কী দিকে চলেছে তা সত্যিই বলা শক্ত।
ডাব্লুডিউউ

7

আপনার অবশ্যই অক্ষের উপপাদকটি পৃথক করে দেখা উচিত । এটি উত্তল বস্তুর জন্য। একটি নিয়ম রয়েছে: "যদি দুটি উত্তল বস্তু ছেদ না করে তবে একটি বিমান রয়েছে যেখানে এই দুটি বস্তুর প্রক্ষেপণ ছেদ করবে না"।

আপনি উইকিতে কিছু উদাহরণ খুঁজে পেতে পারেন । তবে এটি আপনার মামলার চেয়ে কিছুটা জটিল।

আপনার সমস্যার জন্য আরও উপযুক্ত কিছু এখানে পাওয়া যাবে (দুটি গাড়ি সংঘর্ষে)।


1

আরও স্যাট নিবন্ধ।

এই সাইটের সর্বশেষ নিবন্ধটি সম্পূর্ণ কোড সহ এসেছে, আমার মনে হয় এটি ফ্ল্যাশে রয়েছে, আমার কোনও ধারণা নেই, তবে আমার যখন প্রথমবারের জন্য স্যাট ব্যবহার করতে হয়েছিল তখন আমার ঠিক 0 টি সমস্যা এটি সি ++ এ রূপান্তরিত হয়েছিল, খুব কঠিন হওয়া উচিত নয় অন্যান্য ভাষার ক্ষেত্রেও একই কাজ করুন। কেবলমাত্র আপনাকে যুক্ত করতে হবে প্রতিটি গণনাতে স্থানচ্যূত ভেক্টর সংরক্ষণ করা (যদি এটি সবচেয়ে ছোট, অবশ্যই, আপনি স্যাট সম্পর্কে শিখবেন তখন আপনি এটি বুঝতে পারবেন), এই টিউটোরিয়ালের কোডটি এটি করে না, তাই আপনি শেষ গণনা ভেক্টর দিয়ে শেষ।

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

ভাল, পুরানো এন-গেম টিউটোরিয়াল। ওয়েবে সেরা স্যাট তত্ত্ব।

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


এটি এত বিরক্তিকর নয় যে কোনও প্রয়োজনীয় সমস্ত শ্রেণীর সাথে পুরো কার্য উত্স পোস্ট করে। আমি তার কোডটি আমার নিজের একটি ডেমোতে পোর্ট করেছি তবে এটি কার্যকর হয় না। :( এটি এখন পর্যন্ত আমার প্রকল্প যদি কেউ আমাকে এটির ডিবাগ করতে সহায়তা করতে পারে তবে দুর্দান্ত হবে link লিঙ্ক
জোশুয়া বার্নেট

তুমি কি বোঝাতে চাও যে এটি কাজ করে না? আপনি কীভাবে আপনার শিখরগুলি কার্টেসিয়ান স্থানাঙ্ক সিস্টেমে রেখেছেন সে বিষয়ে মনোযোগ দিন, টিউটোরিয়ালে তিনি সেন্ট্রয়েডের সাথে সম্পর্কিত ভেক্টর হিসাবে উল্লম্বগুলি সঞ্চয় করেন (আপনাকে যা করতে হবে তা হ'ল আপনার নিজের শীর্ষে থেকে সেন্ট্রয়েড বিয়োগ করা বা লাইনগুলি যেখানে তিনি তার নিজস্ব শীর্ষকে পরিবর্তন করেছেন) মুছে ফেলুন, ডট পণ্যগুলির মতো ফাংশন যা আপনি নিজেরাই তৈরি করতে পারেন, তাদের জন্য আপনার কোনও গাইডের দরকার নেই, বাকিগুলি সরাসরি হওয়া উচিত, এটি কোনও অনুলিপি পেস্টের উপাদান নয়, কার্যকর করার চেষ্টা করার আগে স্যাট শিখুন
ড্রেটা

এইভাবেই আমি এটি বাস্তবায়ন করেছি: স্যাট.অ্যাস , শেপ 2 ডি.এএস , সেন্ট্রয়েড বলতে কী বোঝ ? বহুভুজের কেন্দ্র যেমন (x, y)?
জোশুয়া বার্নেট

এই মুহুর্তে আমার একটি ফাংশন getOBB () রয়েছে যা আমার মূল চিত্রটিতে বিশদ হিসাবে প্রত্যাবর্তন করে। এটি একটি ভেক্টর <b2Vec2> থেকে আকারের কোণ, একটি কোণ ভেরিয়েবল এবং অবস্থান ভেরিয়েবল সমেত গণনা করা হয়।
জোশুয়া বার্নেট

হ্যাঁ, কেন্দ্র, এই লোকটি তার বহুভুজগুলি যেভাবে তৈরি করেছে তা হ'ল কেন্দ্র থেকে অফসেটগুলি দেওয়া হয়েছে, আইডিকে এএস 3, তবে ডট প্রোডাক্টটি গণনা করার সময় আপনি কোণ থেকে সেন্ট্রয়েড বিয়োগ করার চেষ্টা করুন (ভেক্টর বিয়োগ) ) এর পাশে আপনি যাচাই করছেন না যে কোন বিচ্ছেদ ভেক্টরটি এখনও সবচেয়ে ছোট, আপনি কেবলমাত্র শেষের একটি গণনা করে
রেখেছেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.