আরটিএসের স্থানীয় এড়ানো কীভাবে হয়?


15

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

স্টারক্রাফ্ট 2 এর মতো আরটিএস গেমের জন্য কীভাবে স্থানীয় এড়ানো যায়? পদার্থবিজ্ঞান কি সিমুলেটেড বা একটি সর্বস্বত্ব নিয়ন্ত্রক সিদ্ধান্ত নেয় যে কোথায় থাকা উচিত? আমি জানি এই প্রশ্নটি কিছুটা বিস্তৃত হতে পারে তাই আমি স্টারক্র্যাফট 2 এর স্থানীয় বর্জনীয় আচরণগুলি কীভাবে অর্জন করব তা বিশেষভাবে জিজ্ঞাসা করছি; যদিও যে কিছু কাজ করে খুব প্রশংসা হবে।

আমি কোনও কোড খুঁজছি না - কেবল দরকারী সংস্থান বা স্টারক্রাফ্ট 2 (বা অনুরূপ গেমস) কীভাবে স্থানীয় বর্জন পরিচালনা করে তার ব্যাখ্যা।

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

আমি যে সমাধানটির সন্ধান করছি তার জন্য নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করতে হবে (স্টারক্রাফ্ট ২ তে):

  • বস্তুগুলি ওভারল্যাপ হয় না; বা কমপক্ষে ওভারল্যাপগুলি অবশ্যই অবশেষে সমাধান করা উচিত।
  • অবজেক্টগুলি একে অপরকে প্রয়োজনের চেয়ে বেশি দূরে ঠেলে দেয় না যাতে 2 ইউনিট গঠনে একে অপরের পাশে যেতে পারে।
  • বস্তুগুলি একই গন্তব্যের দিকে ঝাঁপিয়ে পড়লে কোনও অদ্ভুত আচরণ হওয়া উচিত নয়।
  • বিভিন্ন আকারের এমনকি বিভিন্ন উত্তল আকারের ইউনিটগুলি সমর্থন করতে পারে।

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


"ফ্লকিং আচরণ" (গুগল শব্দ) একটি বিস্তৃত সমস্যা,
রাচেট ফ্রিক

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

আরটিএস গেমগুলি প্রায়শই প্রতিটি ক্লায়েন্টের দ্বারা প্রতিটি মেশিনে একই ডিস্ট্রিমেন্টিক সিমুলেশন চালিয়ে কাজ করে। সুতরাং মূলত, যদি আপনি এটি একটি একক মেশিনের জন্য সমাধান করতে পারেন, তবে আপনি মাল্টিপ্লেয়ার পরিস্থিতিতে একই সমাধান প্রয়োগ করতে পারেন, স্থানীয় যে পরিহারের কৌশলটি আপনি শেষ করেছেন না কেন।
অ্যালান ওল্ফ

প্রশ্নের প্রতিক্রিয়া জন্য ধন্যবাদ। আমি প্রশ্নটি কিছুটা সঙ্কুচিত করেছিলাম এবং আমি কী অর্জন করতে চাইছি তা সুনির্দিষ্টভাবে জানিয়েছি।
JPtheK9

এটি একটি দুর্দান্ত সংস্থান: red3d.com/cwr/steer
tbkn23

উত্তর:


11

দেখে মনে হচ্ছে আপনি যা খুঁজছেন তা হ'ল অনুকূল পারস্পরিক সংঘর্ষের পরিহার এ্যালগোরিদম। পূর্ববর্তী কাগজ এছাড়াও মূল্য একটি পঠিত। যদিও কাগজটি কিছুটা জড়িত থাকতে পারে অ্যালগরিদমের পিছনে তত্ত্বটি মোটামুটি সোজা:

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

এখন, সিমুলেশন সম্পাদন করতে:

  1. প্রতিটি এজেন্টের জন্য, এটি স্থির রয়েছে বলে ধরে নেওয়া, ভবিষ্যতের যে কোনও সময়ে অন্য যে কোনও চলন্ত এজেন্টের সাথে এটি সংঘর্ষের কারণ হতে পারে এমন সমস্ত বেগ গণনা করুন। এটি অর্ধ-প্লেনকে ছেদ করার একটি সেট হিসাবে ( বেগ গতিরোধ হিসাবেও পরিচিত ) একটি সেট হিসাবে "বেগ স্পেসে" উপস্থাপিত হতে পারে ।
  2. সবচেয়ে কাছের এই জায়গার বিন্দুটি নির্ধারণ করুন v_p, এটি ইউনিটের নতুন গতিবেগ।

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

উপরের অ্যালগরিদমের দুটি স্তরের গণনার জন্য, আপনি বেগটি বাধা কী তা নির্ধারণ করতে মিনকোভস্কি সামগুলি ব্যবহার করতে পারেন এবং তারপরে গতি বাধা এড়ানোর জন্য নিকটতম বিন্দু নির্ধারণ করতে একটি লিনিয়ার প্রোগ্রামিং মডেল (যেমন সিম্প্লেক্স অ্যালগরিদম ) ব্যবহার করতে পারেন v_p। এছাড়াও, সংঘর্ষ এড়ানোর জন্য কোড আপনার অনুভূতির জন্য উপলব্ধ এবং ইউনিটির মতো গেম ইঞ্জিনগুলিতে ব্যবহার করতে সি # তে পোর্ট করা হয়েছে। এই কৌশলটি কমপক্ষে ওয়ারহ্যামার ৪০,০০০: স্পেস মেরিন এবং সম্ভবত অন্যান্য গেমগুলিতে ব্যবহৃত হয়েছে


এটি একটি আশ্চর্যজনক নিবন্ধ ছিল এবং আমার মনে হয় আমি আপনার ব্যাখ্যা থেকে এটির অর্ধেকটি পড়েছি। এই তথ্যের জন্য ধন্যবাদ।
JPtheK9

0

আমি জানি না যে আপনার ইউনিটগুলি কীভাবে কাজ করে তবে আমি ধরে নিই যে সেগুলি একটি রাষ্ট্রের মেশিনের মতো:

সম্ভাব্য রাষ্ট্রসমূহ

  • (X, y, z) এ চলছে
  • আক্রমণ করা হচ্ছে (শত্রু_আইডি)
  • রিসোর্স সংগ্রহ করা (রিসোর্স_আইডি)

স্টারক্র্যাফ্ট কীভাবে এই সমস্যার দিকে এগিয়ে যায় সেদিকে মনোযোগ দিলে আপনি দেখতে পাবেন:

  1. যদি কোনও দিকে যেতে সরানোর জায়গা থাকে তবে চর্যাচারটি সেই দিকে চলে যায়।
  2. কোনও স্থান না থাকলে উপায়টিতে ইউনিট স্থান তৈরি করতে চলে যাবে
  3. স্থান তৈরি করতে যে ইউনিটটি স্থানান্তর করতে হবে তার যদি ইতিমধ্যে একটি কমান্ড থাকে তবে এটি কমান্ডটি রাখবে, তবে শেষ পর্যন্ত স্থানটি পরিবর্তন করতে এটি কিছুটা পরিবর্তন করে।

এখানে দৃশ্য 1:

এখানে চিত্র বর্ণনা লিখুন

আমার কি সেখানে যাওয়ার জায়গা আছে? হ্যাঁ ? তাহলে যাও

দৃশ্য 2:

এখানে চিত্র বর্ণনা লিখুন

আমার কি সেখানে যাওয়ার জায়গা আছে? না? আরে আপনি কি আমার জন্য কিছু জায়গা তৈরি করতে পারেন, আপনি আমাকে ব্লক করছেন। আমি ইতিমধ্যে foward স্থানান্তর করার জন্য একটি আদেশ আছে কিন্তু আমি আপনাকে সংস্থান করব।

সুতরাং আপনার কী প্রয়োগ করতে হবে:

  • ইউনিটগুলি অবশ্যই তাদের চারপাশের বিষয়ে সচেতন হতে হবে
  • ইউনিটগুলির একে অপরের সাথে যোগাযোগের উপায় থাকতে হবে
  • অন্য ইউনিটকে অ্যাকোমোডেট করার সময় আপনাকে অবশ্যই একটি আদেশ কার্যকর করতে থাকবে implement

তথ্য এবং চাক্ষুষ জন্য ধন্যবাদ। এখনই আমি সংঘর্ষ সনাক্তকরণ ব্যবহার করছি যে কোনও ইউনিট অন্য জায়গায় চলে যেতে পারে বা অন্য ইউনিট এটি দখল করে আছে কিনা তা জানতে। প্রধান জিনিসটি যা আমি বের করতে চাইছি তা হ'ল কোন একক অ্যালগরিদমটি অন্য ইউনিটকে জানানোর জন্য কোন দূরত্বটি সরানো হবে বা কোন বেগটি সামঞ্জস্য করতে হবে tell অন্য কথায়, কীভাবে ব্লকিং ইউনিট উত্তীর্ণ হওয়ার চেষ্টা করে ইউনিটকে সামঞ্জস্য করবে।
JPtheK9

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

"পথ সরিয়ে না আসা অবধি" আপনার অর্থ কী? ইউনিটটি প্রথম স্থানে কীভাবে চলে?
JPtheK9

দুঃখিত আমি উল্লেখ ভুলে গেছি: ইউনিট রাষ্ট্রীয় মেশিন নয়। তাদের লকারে অনেকগুলি দক্ষতা রয়েছে যা প্রতিটি ফ্রেমে সিমুলেটেড হয় - এই ক্ষমতাগুলি কেবল তখনই কার্যকর হয় যখন সক্রিয় করা হয়, গন্তব্য দ্বারা X দূরত্বে থাকা বা লক্ষ্য অস্তিত্ব সহ whether ইউনিটের গতিবিধি তার বেগের ফল যা একটি দক্ষতার দ্বারা পরিবর্তন করা যায়।
JPtheK9

0

এটি করার একটি উপায় হ'ল ইউনিটগুলিকে স্বতঃ-ফর্ম গঠনগুলি তৈরি করা এবং তাদের গঠনের কেন্দ্রের তুলনায় কোনও অবস্থাতেই থাকার চেষ্টা করা উচিত । তারপরে, প্রতিটি ইউনিট পৃথকভাবে সরানোর পরিবর্তে চারদিকে গঠনের কেন্দ্রটিকে সরান।

ইউনিটগুলি তাদের যথাযথ অবস্থানে রাখার জন্য বাক্স গঠন এবং সহজ স্প্রিংস ব্যবহার করে এটি করার একটি প্রাথমিক উপায়:

// Defines a phalanx (box) formation
class Formation
    // Center of the box in the world
    Position center;
    // Width in # of units
    int width;
    // Height in # of units
    int height;
    // Space between units
    float scale;
    // How much force units will apply to stay near
    // their assigned spot.
    float springforce;

    // Return a position of a unit at the given row and column
    // Todo: add a rotation to this formation so it can rotate when moving.
    Position GetUnitPhalanxPosition(int row, int column)
        return new Position(center.X + column * scale - width * scale /2, 
                            center.Y + row * scale    - height* scale / 2);

// Represents a simple point object with a velocity and position;
// it belongs to a formation.
class Unit
    Position pos;
    Velocity vel;
    Formation formation;
    // What's our assigned spot in the formation?
    int row;
    int column;

    void Update(float dt)
        // Get the desired target position in the formation
        Position target = formation.GetUnitPhalanxPosition(row, column);
        // Apply a spring force toward the position (todo: you might want to damp this)
        vel += (target - position) * dt * formation.springforce;
        // Move along the velocity vector.
        pos += vel * dt;

ধন্যবাদ! এটি একটি সত্যই আকর্ষণীয় এবং সৃজনশীল সমাধান। আমি ভিড় আচরণ / গঠনের জন্য এর অনুরূপ কিছু বাস্তবায়ন করেছি তবে আমার এখনও ইউনিটগুলির ওভারল্যাপিংয়ের সমস্যা রয়েছে। 2 টি ফর্মেশন একে অপরের মধ্যে চলে গেলে কি হবে?
JPtheK9

আমি মনে করি এটি নকশার উপর নির্ভর করে। সবচেয়ে সহজ জিনিসটি এই ইমেজের মতো অন্যান্য ফর্মেশনগুলিতে কাছের ইউনিটগুলি থেকে দূরে অন্য স্টিয়ারিং শক্তি প্রয়োগ করা হবে apply । খেলোয়াড় দ্বারা নির্বাচিত হয়ে
ফর্মেশনগুলিকে একত্রিত করা

মেটা-ফর্মেশনগুলি শব্দটি সত্যই জটিল এবং বগিযুক্ত: সি। আপনার লিঙ্ক করা চিত্রটি যদিও আমার প্রয়োজন ঠিক তা হতে পারে। আমি স্টিয়ারিং ফোর্স দূরে আরও কিছু গবেষণা করতে যাচ্ছি। আপনার কি চিত্রটির নিবন্ধটির লিঙ্ক আছে?
জেপিথেক 9

আমার আপনার মতো একই সমস্যা রয়েছে, আপনি কীভাবে এটি সমাধান করেছেন তা জানতে আগ্রহী হবে। এই নিবন্ধটি ইড করার পরে মনে একটি ধারণা এসেছিল: মাইক্রো সংঘর্ষ এড়ানোর জন্য রিপেল ফোর্সটি ব্যবহার করার সময় ম্যাক্রো পাথ পরিকল্পনার জন্য প্যাথফাইন্ডিং (এ *) এর সংমিশ্রণ হতে পারে:
কোল্ডস্টিল

0

আমি লিঙ্ক ডাম্পিংয়ের বিষয়ে কিছু লোককে জানি, তবে আমি রিয়েল-টাইম স্ট্র্যাটেজি গেম বটগুলির (আইএসবিএন 978-91-7295-160-0) জন্য একটি বহু-এজেন্ট সম্ভাব্য ক্ষেত্র ভিত্তিক পদ্ধতির একটি খুব আলোকিত কাগজ হিসাবে পেয়েছি এবং এটি স্পষ্টতই জানায় আমি আরও বিস্তারিতভাবে বলতে পারার চেয়ে আরও বেশি উপায়। কাগজটি কৃত্রিম সম্ভাব্য ক্ষেত্রগুলি (রোবোটিক থেকে উদ্ভূত একটি ধারণা) ব্যবহার করে অন্বেষণ করে, গেম ডেভেলপমেন্ট প্রসঙ্গে স্থানীয় সংঘর্ষ এড়ানো সহজতর করার জন্য।


ধন্যবাদ! গবেষণা যেমন আমার কাছে ব্যাখ্যা হিসাবে তত সহায়ক। আমি এই কাগজে ডুব দেব।
JPtheK9

আমার একটি প্রভাব মানচিত্র ইতিমধ্যে সেট আপ হয়েছে তবে এটি আমার রুচিগুলির জন্য জটিল seems মূল জিনিসটি হ'ল বিভিন্ন ইউনিটগুলিকে সরিয়ে নেওয়ার জন্য সম্ভাব্য ক্ষেত্রগুলি তৈরি করা এবং সম্ভাব্য ক্ষেত্র থেকে ডেটাটিকে গতিবেগে রূপান্তরিত করা। মূলত, আমি মনে করি না যে এটি বিভিন্ন আকারের ইউনিটের জন্য কাজ করবে। এটি প্রচুর আকর্ষণীয় ধারণা সহ দুর্দান্ত পঠিত।
JPtheK9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.