মোবাইলকে অন্যের চারপাশে আনতে আমি কী ধরণের স্টিয়ারিং আচরণ বা যুক্তি ব্যবহার করতে পারি?


10

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

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

উদাহরণ:

কল্পনা করুন যে প্রতিটি সাপ আমার কাছে নিজেকে গাইড করেছিল এবং "সেতুসুনা" ঘিরে থাকবে should উভয় সাপ আমাকে দীর্ঘায়িত করতে বেছে নিয়েছে তা লক্ষ্য করুন? এটি কোনও কঠোর প্রয়োজনীয়তা নয়; এমনকি সামান্য অফসেট করা ঠিক আছে। তবে সেতুসুনাকে তাদের "ঘিরে" রাখা উচিত।

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


1
স্ট্যাকিংটি কি কেবল গন্তব্যস্থলে বা ট্রানজিট চলাকালীন একটি উদ্বেগ? আমি উত্তরোত্তর অনুমান করছি।
স্পার্টনডানট

এটি পরেরটি, @ স্পার্টনডোনট
ভান হিল্টস

@ ক্রমস্টারন আমি একটি ছবি যুক্ত করেছি, আশা করি এটির সাহায্য হবে।
ভন হিলস

উত্তর:


15

আপনার এজেন্টদের কুলম্বের আইনের ধারায় একে অপরকে বিতাড়িত করার জন্য একটি দুর্বল "বৈদ্যুতিন বিদ্যুত্চালিত চার্জ" দিন ।

সরলতার জন্য ধরে নিচ্ছি যে সমবেত জনতা একে অপরকে সমান শক্তি দিয়ে দূরে সরিয়ে দেবে, এটি প্রতিটি জোড় জোড়ের মধ্যে একটি মাত্রা সহ একটি বল প্রয়োগ করার পক্ষে যথেষ্ট হবে some_constant / distance^2, যেখানেsome_constant একটি কনফিগারযোগ্য বিকর্ষণ শক্তি এবং distanceতাদেরকে দূর করার দূরত্ব।

বিকর্ষণ শক্তিগুলি তখন দূরত্বের বর্গক্ষেত্রের সাথে পড়ে যায়।

কোড প্রকৃতি একটি বড় উদাহরণ (একটি লাইভ ডেমো সহ) আছে এখানে । দেখে মনে হচ্ছে:

সম্মিলিত অনুসরণ এবং পৃথক আচরণ

প্রত্যেকটি উপাদানের সাথে একে অপরের সাথে মিলে যাওয়া এক চতুর্ভুজ সময় ( O(n^2)) অপারেশন। আপনার যদি সত্যিই অনেক এজেন্ট থাকে তবে আপনি বার্নস-হাট আনুমানিকের সাথে বল গণনাগুলি অনুকূল করতে পারেন , এটি এটি লগ-লিনিয়ারে নামিয়ে নিয়েছে ( O(n log n)) তবে এটি একটি চতুষ্কোণের প্রয়োজন ।


দুর্দান্ত লিঙ্ক, আঙ্কো। অনেক প্রশংসিত! আমি অবশ্যই এই পুরো সাইটটি একটি পুনরায় পড়তে হবে।
ভান হিলস

স্টারক্রাফ্ট (1, কমপক্ষে) এর উড়ানের ইউনিটগুলির সাথে একই রকম কিছু করে। তবে এটি কেবল তখনই ঘটে যখন তারা চলাচল বন্ধ করে দেয়, অর্থাত্‍ যখন তারা চলতে থাকে তারা একে অপরের উপরে উঠে যায় (একে অপরকে প্রতিবন্ধকতা হিসাবে পুরোপুরি উপেক্ষা করে), কিন্তু যখন তারা থামায় তারা সমস্তগুলি কীভাবে দেখতে লাগে তা থেকে ছড়িয়ে দেওয়া শুরু করে কিছু নিয়মিত অঞ্চলের স্থানীয় কেন্দ্র (বর্গ / বৃত্ত, সম্ভবত) যা তাদেরকে ঘিরে রেখেছে। এটি উত্তরের উদাহরণের মতো দেখতে সুন্দর দেখাচ্ছে না, তবে এটি সম্ভবত কম সিপিইউ রিসোর্স ব্যবহার করেছে এবং
কোডিং

@ শিভানড্রাগন এসসি 2 একই আচরণ উপস্থাপন করে, তারা সকলে একটি ভিড়ের মধ্যে গন্তব্যে রূপান্তরিত করে, তারপর সদয়-বাস্তব এবং aestethically আনন্দদায়ক চেহারাগুলির জন্য জায়গা খুঁজে বের করে (যাতে তাদের অংশগুলি চারপাশে ক্লিপ হয় না)।
Kroltan

2
কিছু ধরণের রিপেলিং শক্তি একটি ভাল ধারণা হতে পারে, তবে বিশদটি জটিল trick আমি একটি স্পেস থিমযুক্ত আরটিএসে এগুলি নিয়ে পরীক্ষা-নিরীক্ষা করেছি এবং পদার্থবিদ্যাকে খুব কাছ থেকে অনুসরণ না করে বরং এটি মডেলিং করার পরামর্শ দিচ্ছি যাতে এটি সুন্দরভাবে আচরণ করে। কিছু পর্যবেক্ষণ: ১) যেহেতু এটি কোনও পদার্থবিজ্ঞানের সিমুলেশন নয় আমি কেবলমাত্র স্বল্প দূরত্বে বল প্রয়োগ করতাম। 2) এটি সীমাবদ্ধ সংস্থাগুলিকে ওভারল্যাপিং থেকে আটকাতে পারে না 3) শক্ত সম্ভাবনা সহজেই সংখ্যাসূচক ত্রুটিগুলির কারণ ঘটায় যেমন কণাগুলি উচ্চ গতিতে প্রতিস্থাপন করা হয়। 4) একবার আপনার মাঝে উল্লেখযোগ্য সংখ্যক কণা এবং মাঝারি উত্থানে চাপ পড়লে জিনিসগুলি কুৎসিত হয়।
কোডসইনচাউস

1

আমার দৃষ্টিভঙ্গি @ আঙ্কোর মতো, তবে গেমসের জন্য কৃত্রিম গোয়েন্দা থেকে মিলিংটন এবং ফাংয়ের কাজের উপর ভিত্তি করে ।

পৃথকীকরণের আচরণটি এটির মতো দেখায় তবে আপনার এই বিবেচনার বিষয়টি বিবেচনা করা দরকার যে এই বেগটি তার আপডেট ফাংশনে এজেন্টের গতির সাথে গণনা করা উচিত।

public Vector3 GetSeparationVel (float threshold, float decayCoefficient)
{
    threshold = threshold * threshold;
    Vector3 separationVelocity = Vector3.Zero;
    for (int i = 0; i < enemies.Length; i++) {
        if (enemies[i] == this) {
            continue;
        }
        Vector3 direction = this.position - enemies[i].position;
        float distance = direction.LengthSquared();
        float strenght = 0.0f;
        if (distance < (threshold)) {
            strenght = Math.Min(decayCoefficient / distance, this.maxAccel);
            direction.Normalize();
            separationVelocity += strenght * direction;
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.