কিভাবে একটি বাধা ভেক্টর গণনা?


11

প্রদত্ত একটি দ্বিমাত্রিক স্থান এবং 1 বন্ধুত্বপূর্ণ স্পেসশিপ স্থির দাঁড়িয়ে রয়েছে, একজন শত্রু সরাসরি প্রকৃত অবস্থান, গতি এবং দিকনির্দেশ দিয়ে বন্ধুত্বপূর্ণ জাহাজে চলে যাচ্ছেন না।

বন্ধুত্বপূর্ণ জাহাজ শত্রুর সাথে লড়াইয়ের জন্য নিজেকে ফায়ারিংয়ের পরিসরে যেতে চায়।

প্রকৃতপক্ষে আমি প্রকৃত অবস্থান চলমান শিপটিতে কেবল একটি সরাসরি ভেক্টর স্থাপন করছি, এবং প্রতিটি ফ্রেমে এটি পুনরায় গণনা করছি, যার ফলে একরকম "বৃত্তাকার" ফ্লাইটপথ হবে।

আমি যা চাই তা হ'ল ফায়ারিংয়ের দূরত্বে পৌঁছে যাওয়ার পরে (সম্ভবত) শত্রুরা যে অবস্থানে থাকবে তার সরাসরি ও সোজা পথ নির্ধারণ করে, ধরে নিই যে শত্রু ততক্ষণে পথ পরিবর্তন করবে না।

প্রথম এবং "সাধারণ" বাস্তবায়ন হিসাবে এটি যথেষ্ট হবে যদি আমরা ধরে নিই যে বন্ধুটি কোনও সময়ের মধ্যে 0 থেকে সর্বোচ্চে গতি অর্জন করতে পারে।

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

উত্তর:


5

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

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

আমি এটি এত ভাল কাজ করতে পেলাম যে শটের জন্য আমার সংঘর্ষ সনাক্তকরণের দরকার নেই ... যতক্ষণ না those কারণগুলি স্থির থাকে ততক্ষণ দূরত্ব / দিক / গতির লক্ষ্য নির্বিশেষে আমি একটি ষাঁড়ের চোখে আঘাত করা প্রতিটি শটের উপর নির্ভর করতে সক্ষম হয়েছি।


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

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

উদাহরণটি এই বইটি থেকে ছিল: অ্যামাজন.com/…
স্টিভ এইচ

1
এটি সাহায্য করে কিনা জানি না তবে এখানে কিছু অজগর কোড রয়েছে যা একই জিনিসটি সম্পাদন করে। moddb.com/mods/wicmw/tutorials/…
স্টিভ এইচ

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

6

আমি আপনাকে স্টিয়ারিং আচরণগুলি সন্ধান করার পরামর্শ দিচ্ছি। বিশেষ করে সাধনাওপেনস্টিয়ার বাস্তবায়নে সোর্স-কোড পাওয়া যাবে বা " প্রোগ্রামিং গেম এআই উদাহরণস্বরূপ " এর মতো কোনও বই সন্ধান করুন (আইএসবিএন 13: 978-1556220784)


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

হ্যাঁ, আপনি যা বর্ণনা করেছেন তা হ'ল সাধনা। এটি লক্ষ্য জানে না .. এটি "শত্রুদের" বর্তমান অবস্থান, গতি এবং দিকনির্দেশনার উপর ভিত্তি করে একটি পূর্বাভাস দেয়
বাম্মজ্যাক

তারপরে আমি বর্ণনাটি ভুল বুঝেছি, আগামীকাল আমি এটি ঘনিষ্ঠভাবে দেখব।
নোবজেড

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

@ নোবজেড আমি দুঃখিত আমার উত্তরটি কার্যকর ছিল না। আপনার সম্ভবত সেই অনুযায়ী আপনার প্রশ্নটি সম্পাদনা করা উচিত, কারণ এই বক্তব্যগুলি: "আমি জানি, গতি পরিবর্তন বা শত্রুদের গতির পরিবর্তনের ক্ষেত্রে প্রতিটি গণনার পুনরাবৃত্তি করতে হবে" বিভ্রান্তিকর হতে পারে .. আপনি যদি তা করেন তবে আপনার শেষ পর্যন্ত হবে "অনুসরণ" স্টিয়ারিং আচরণ।
বাম্মজ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.