মিনকভস্কি যোগফলটি ব্যবহার করুন
(একটি ভালো উপায় এই সমস্যা সমাধানের জন্য গতি একটি লাইন মধ্যে ছেদ বিবেচনা হয় বনাম ) উৎস (অনুবাদ বনাম ' ) এবং Minkowski সমষ্টি এর একটি উৎস (এ 180 ডিগ্রী আবর্তিত একটি' ) এবং তার অবমুক্ত (ঠিক বি এই ক্ষেত্রে): এ ' ⊕ বি ।
নিম্নলিখিত ছবিতে আমি একটি স্বেচ্ছাচারী স্থানাঙ্ক সিস্টেমের উত্সে একটি স্ম্যাক-ড্যাব রাখি । করে 180 ডিগ্রী ফলাফল একটি আবর্তিত যেমন বুঝতে এই সরলীকৃত একটি ' , এবং V উৎপত্তি অনুবাদ সমান বনাম' ।
মিনকোভস্কি যোগফলটি সবুজ আয়তক্ষেত্র এবং একটি চলমান এ এবং একটি স্টেশন বি এর ছেদ পয়েন্টগুলি লাইন-এএবিবি ছেদটি করে খুঁজে পাওয়া যাবে । এই পয়েন্টগুলি নীল চেনাশোনাগুলির সাথে চিহ্নিত।
নিম্নলিখিত ছবিতে একটি ভিন্ন উত্স ব্যবহৃত হয়েছিল এবং একই ছেদ পয়েন্টগুলি পাওয়া যায়।
একাধিক চলমান এএবিবি
দুই AABBs এই কাজটি করতে যে সময় একটি নির্দিষ্ট সময়ের আপনি বিয়োগ হবে সময় একটি রৈখিক ফ্যাশন পদক্ষেপ বি 's থেকে বেগ ভেক্টর একটি যে লাইন-AABB ছেদ জন্য লাইন বিভাগটিকে গুলি বেগ ভেক্টর এবং ব্যবহার।
সুডোকোড
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 ছেদ বিন্দুতে ফিরে আসবে তার উপর নির্ভর করে A এর বি এর অভ্যন্তরীণ গতিবেগ শেষ হয় বা যথাক্রমে এর মধ্য দিয়ে যায় passes (এটি অধঃপতনের ক্ষেত্রে ছাড় দিচ্ছে যেখানে A তাদের পাশ দিয়ে বা তাদের নিজ নিজ কোণে বি বর্ষণ করে))
যে কোনও উপায়ে, লাইন বিভাগের সাথে প্রথম ছেদ বিন্দুটি সংঘর্ষের বিন্দু, আপনি এটির পিছনে বিশ্বের স্থানাঙ্ক ব্যবস্থার সঠিক অবস্থানে অনুবাদ করতে চান (মূল v এর সাথে দ্বিতীয় চিত্রের প্রথম হালকা-নীল বৃত্ত , এটি কল করুন পি ) এবং তারপরে সিদ্ধান্ত নিন (উদাহরণস্বরূপ, পি তে সংঘর্ষের সাথে v প্রতিফলিত করে স্থিতিস্থাপক সংঘর্ষের জন্য ) ফ্রেমের শেষে A এর আসল অবস্থানটি কী হবে ( At + 1 )।
যদি মাত্র 2 টিরও বেশি সংঘর্ষকারী থাকে তবে এটি সামান্য জটিল হয়ে উঠবে, যেহেতু আপনি দ্বিতীয়টির জন্য সংঘর্ষ সনাক্তকরণ করতে চান, প্রতিফলিত, ভি এর অংশও ।