দুটি চলন্ত এএবিবি ছেদ করলে দ্রুততম চেকটি কি?


12

আমার দুটি এএবিবি রয়েছে যেগুলি চলমান, চেক করার দ্রুততম উপায় কোনটি কোনও ফ্রেমের নীচে ছেদ করবে কিনা?

সরানোর অর্থ আমি কেবলমাত্র সাধারণ আয়তক্ষেত্র ছেদ পদ্ধতিতে যাচাই করা নয়, আমি বোঝাতে চাইছি এমন এক ধরণের সহজ সরল অদলবদল পরীক্ষা যা কেবলমাত্র বুলিয়ান দেয়, কোনও হিট সময় বা অন্য কিছু দেয় না।

আমি যা মনে করি তা কেবল এটির মতো করে করা:

এই

তবে যে হেক্সাগনটি বেশ জটিল এবং আমি কীভাবে কোনও এএবিবি - বহুভুজ ছেদটি গণনা করতে জানি না, সেখানে কি আরও সহজ উপায় আছে?

আপনি যে কোনও প্রোগ্রামিংয়ের ভাষা সর্বাধিক পছন্দ করেন তা আমি সহজেই এটি পোর্ট করতে পারি।

ধন্যবাদ।


3
আমি বিভ্রান্ত আপনি বিশেষত "অদলবদল পরীক্ষা" উল্লেখ করেছেন, আপনি কি সাধারণ এএবিবি সোয়েপ্ট পরীক্ষার চেষ্টা করেছেন? এটি আপনি যা চান ঠিক তা করে।
সোমবারটাইটস সংরক্ষিত

1
আমি উপরের মন্তব্যে একমত - "ক্লাসিক" পরীক্ষায় ভুল কী? তদুপরি, এখানে প্রস্তাবিত বেশিরভাগ সমাধানগুলি এর চেয়ে পরিষ্কার ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ...
আশ্চর্য 21

আপনি পৃথকীকরণ পরীক্ষা টেস্ট গেম
ডেভলপমেন্ট.

উত্তর:


8

মিনকভস্কি যোগফলটি ব্যবহার করুন

(একটি ভালো উপায় এই সমস্যা সমাধানের জন্য গতি একটি লাইন মধ্যে ছেদ বিবেচনা হয় বনাম ) উৎস (অনুবাদ বনাম ' ) এবং 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 টিরও বেশি সংঘর্ষকারী থাকে তবে এটি সামান্য জটিল হয়ে উঠবে, যেহেতু আপনি দ্বিতীয়টির জন্য সংঘর্ষ সনাক্তকরণ করতে চান, প্রতিফলিত, ভি এর অংশও ।


ধন্যবাদ, সবচেয়ে আকর্ষণীয়। আপনি কী দয়া করে ব্যাখ্যা করতে পারবেন যে সরানোর সময় A এবং B ছেদ করলে আপনি কেসটি কীভাবে পরিচালনা করবেন তবে ছেদ ছাড়াই সরানো শেষ করবেন?
গেমএলচেমিস্ট

@ গেমএলচেমিস্ট এটি সংঘর্ষের প্রতিক্রিয়া হবে, এবং এত সংঘর্ষ সনাক্তকরণ নয় (প্রশ্নের মূল বিষয়)। তবে আমি পেইন্টটি পছন্দ করি, তাই সম্পাদনাটি দেখুন। :-)
এরিক

আপডেটের জন্য ধন্যবাদ (এবং প্রকল্পগুলির জন্য হুড়কা :-)), এটি আমার প্রশ্ন ছিল না তবে আমাকে বুঝতে সাহায্য করেছিল যে আপনার অ্যালগরিদম ইতিমধ্যে কেস পরিচালনা করে যখন এ পুরোপুরি বি এর মধ্য দিয়ে যায়
গেমএলকেমিস্ট

5

ওবিবি - ওরিয়েন্টেড বাউন্ডিং বক্স। এখানে একটি টিউটোরিয়াল

কার্যকরভাবে, একটি বাউন্ডিং বাক্সটি y এর অক্ষের (আপ) হিসাবে বস্তুর A এর বেগ ভেক্টরের সাথে একত্রিত হয়। এর প্রস্থ এবং উচ্চতাটি অবজেক্ট এ এর ​​শুরু এবং শেষ পয়েন্টগুলি দ্বারা গণনা করা যেতে পারে আপনি তারপরে এটি অবজেক্ট বি এর এএবিবি (এটি একটি ওওবিবি হিসাবে বিবেচনা করে) এবং আপনার সোনার সাথে তুলনা করুন।

যদি তারা কেবল ছেদ করতে পারে তবেই যদি আপনি কেবল একটি চৌরাস্তা পরীক্ষার সন্ধান করছেন তবে আপনি এমন একটি এএবিবি তৈরি করতে পারেন যা শুরুর এবং শেষের উভয় অবস্থানে অবজেক্ট এ এর ​​এএবিবিকে ঘিরে রেখেছে। যদি কোনও এএবিবি এই-সমস্ত সংক্ষিপ্ত এএবিবির সাথে ছেদ না করে তবে কোনও ছেদ নেই; যাইহোক, এটি মিথ্যা ইতিবাচক দিকে পরিচালিত করতে পারে, সুতরাং আপনার এটি কেবল প্রাথমিক পরীক্ষা হিসাবে ব্যবহার করা উচিত।


4

আপনার OOB দরকার নেই এবং আপনার সময়-পদক্ষেপের সংঘর্ষ সনাক্তকরণ ব্যবহার করার দরকার নেই। কেবলমাত্র সাধারণ এএবিবি অদলবদল পরীক্ষা ব্যবহার করুন, এই লিঙ্কটি দেখুন । অপরিহার্যভাবে এটি আপনার ডায়াগ্রামে যা ঠিক আছে তা করে: চলন্ত এএবিবি শুরু থেকে শেষ পয়েন্ট পর্যন্ত "বয়ে যায়" এবং তারপরে এটি অন্যান্য, স্ট্যাটিক এএবিবির বিরুদ্ধে সংঘর্ষ সনাক্তকরণের জন্য ব্যবহৃত হয়।

যদি আপনি উদ্বিগ্ন হন যে এই অদলবদল পরীক্ষাটি আরও ব্যয়বহুল কারণ এটি "প্রভাবের সময়" ফিরিয়ে দেয় তবে আমি মনে করি আপনি অকালে অপ্টিমাইজ করে নিচ্ছেন।

অদলবদল পরীক্ষা সম্পর্কে আরও গভীরতার তথ্যটি দুর্দান্ত বইতে পাওয়া যাবে: ক্রাইস্টার এরিকসনের রিয়েল-টাইম সংঘর্ষ সনাক্তকরণ


3

এএবিবি আনুমানিক প্রান্ত ক্ষেত্রে দুর্বলতা

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

কেবলমাত্র শুরু এবং শেষ অবস্থানগুলি ব্যবহার করে এএবিবি (বা OOBB) পরীক্ষা করে সংঘর্ষ হয়েছে কিনা তা অনুমান করা যদি কোনও বস্তু দ্রুত ঘোরানো হয় এবং অন্যটির চেয়ে এক মাত্রায় দীর্ঘ হয় তবে সংঘর্ষের হাতছাড়া হতে পারে।

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

যদি বৃহত্তর AABB এর সাথে কোনও ছেদ থাকে তবে আপনি সংক্ষিপ্তসারটি কোথায় থাকতে পারে তা নির্ধারণ করতে ইতিমধ্যে ছোট ছোট AABB গুলি ব্যবহার করতে পারেন। ছোট ছোট AABB- র প্রত্যেকের জন্য যা অন্য বস্তুর সাথে ছেদ করে, তারপরে আপনি আরও ব্যয়বহুল জাল ছেদ সনাক্তকরণ করতে পারেন।


2
বা বিবি যে কোনও ঘূর্ণনের জন্য সর্বাধিক প্রস্থের পূর্বনির্ধারণ করতে পারে এবং এটি ব্যবহার করতে পারে
রাচেট ফ্রিক

2

আপনাকে আন্দোলনের ক্ষুদ্রতর পদক্ষেপগুলিতে বিভক্ত করতে হবে। উদাহরণ স্বরূপ:

আপনি বৃহত্তর কম্পোনেন (এই ক্ষেত্রে, এক্স-অক্ষ) ব্যবহার করে চলাচলটি পচন করতে চান এবং তারপরে প্রতিটি পদক্ষেপে সংঘর্ষের জন্য পরীক্ষা করতে পারেন।

এটি দেখতে খুব ব্যয়বহুল মনে হতে পারে তবে একথা বিবেচনা করুন যে প্রতিটি চক্রের নিজস্ব প্রস্থের চেয়ে দ্রুত গতিতে চালিত কোনও বস্তু অত্যন্ত চটজলদি হয়ে উঠবে, সুতরাং এই দৃশ্যটি আপনার বিবেচনার মতো সাধারণ নয়।


2
এই পদ্ধতিটি খারাপ, কারণ এটি কিছু ক্ষেত্রে ধরা পড়বে না (উদাহরণস্বরূপ একটি বাক্স প্রথমটির কাছাকাছি এবং দ্বিতীয়টি আপনি আঁকিয়েছিলেন) এবং স্যাম্পলিং বৃদ্ধি করা ওভারকিল হবে। স্যাট ব্যবহার করে সাধারণ বহুভুজ পরীক্ষাটি যথেষ্ট দ্রুত এবং নির্ভরযোগ্য হওয়া উচিত।
সোপেল

1
হ্যাঁ, এটি একটি ঠিক সমাধান তবে খুব দুর্দান্ত নয়। সংঘর্ষ যখন বস্তুর কোণে কাছে আসে তখন নির্ভুলতা দ্রুত হ্রাস পায়, গতি বাড়ার সাথে সাথে কর্মক্ষমতা হ্রাস পায় (বা বাস্তবতার উপর নির্ভর করে নির্ভুলতা) এবং এটি কেবল অযথা হ্যাক।
বিডব্লিউজি

2

সংঘর্ষের চেকের জন্য আপনার আপেক্ষিক গতিও ব্যবহার করা উচিত যাতে একটি এএবিবি "স্ট্যাটিক" এবং অন্যটি "স্ট্যাটিক" একের গতি বিয়োগের গতিতে চলে আসে speed

তারা ছেদ করতে পারে কিনা তা দেখার দ্রুততম উপায় হ'ল গতিতে চলমান এএবিবিকে প্রসারিত করা।

উদাহরণস্বরূপ, এএবিবি 0.1 x / ফ্রেমের সাথে ডানদিকে চলেছে, তবে আপনি এটি প্রসারিত করুন যাতে বাম প্রান্তটি একই থাকে এবং ডান প্রান্তটি আরও 0.1 হয় 0.1 তারপরে আপনি নতুন এএবিবি দিয়ে পরীক্ষা করতে পারেন। যদি মিথ্যা হয় তবে কোনও সংঘর্ষ নেই। (তাড়াতাড়ি রিটার্ন এবং ছোট গতির জন্য নির্ভুল)।

তারপরে আপনি চেক করতে পারবেন এবং চলমান বস্তুর AABB শেষ হয় কিনা তা শুরু করতে পারেন। যদি সত্য হয় তবে সত্য ফিরে আসুন।

অন্যথায় আপনার ত্রিভুজটি স্থির ABB কে ছেদ করে কিনা তা পরীক্ষা করে দেখার দরকার।

এর মধ্যে ডায়াগোনালের স্থানাঙ্কগুলি পাওয়া জড়িত যেখানে x = স্ট্যাটিকের বাম প্রান্ত এবং ডান প্রান্তটি দেখুন যে y নীচের এবং উপরে অবস্থিত। (চারপাশে অন্যভাবে পুনরাবৃত্তি)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.