একটি ভাল বাঁকানো গতিতে কোনও পয়েন্টের মধ্যে যাওয়ার জন্য কোনও অবজেক্টকে সক্ষম করার জন্য একটি ভাল কৌশল কী?
শেষের অবস্থানটি চলতে পারে যেমন একটি হোমিং ক্ষেপণাস্ত্রের ট্রাজেক্টোরি।
একটি ভাল বাঁকানো গতিতে কোনও পয়েন্টের মধ্যে যাওয়ার জন্য কোনও অবজেক্টকে সক্ষম করার জন্য একটি ভাল কৌশল কী?
শেষের অবস্থানটি চলতে পারে যেমন একটি হোমিং ক্ষেপণাস্ত্রের ট্রাজেক্টোরি।
উত্তর:
ধরে নিই যে আপনি এটি একটি ফ্রেম-বাই ফ্রেম জিনিস হতে চান (যেখানে লক্ষ্যটি এমনকি চলমানও হতে পারে), এবং কোনও প্রাক্পম্পিউটেড ট্র্যাজেক্টোরি নয়, এটি আসলে অবিশ্বাস্যরকম সহজ:
প্রতিটি ফ্রেম, ভেক্টর থেকে ক্ষেপণাস্ত্র বেগ-ভেক্টর তুলনা (অবস্থান লক্ষ্য - অবস্থান ক্ষেপণাস্ত্র ) ; এটি, ভেক্টর মিসাইল থেকে লক্ষ্যকে নির্দেশ করছে from প্রতিটি ফ্রেম, যদি দুটি ভেক্টর একই দিক না থাকে, তবে অন্য ভেক্টরটির দিকে কিছুটা ভেলোটি-ভেক্টরটি ঘোরান, সুতরাং প্রতিটি ফ্রেম মিসেলটি তার লক্ষ্যটির দিকে তাকানোর জন্য আরও খানিকটা কাছে যায় gets
দুটি ভেক্টরগুলির মধ্যে ক্রস-প্রোডাক্টের চিহ্নটি দেখে আপনি ঘড়ির কাঁটার দিকে বা ঘড়ির কাঁটার বিপরীতে ঘুরবেন কিনা তা নির্ধারণ করতে পারেন।
[সম্পাদনা] এক্সএনএ-ইশ কোড (এটি পরীক্ষা করার জন্য আমার কাছে এক্সএনএ নেই):
//Once a frame:
//Get vector spanning from missile to target
Vector2 vectorToTarget = target.Position - missile.Position;
//Convert to Vector3 to do cross-product
Vector3 vectorToTarget3 = new Vector3(vectorToTarget, 0);
Vector3 missileVelocity3 = new Vector3(missile.Velocity, 0);
//Rotate clockwise/counter-clockwise is determined by sign of cross-product
int crossProductSign = Vector3.Cross(missileVelocity3, vectorToTarget3).Z;
//Positive cross-product means rotate counter-clockwise, negative is clockwise
double rotationAngle = 0;
if(crossProductSign > 0)
rotationAngle = -0.05;
else if(crossProductSign < 0)
rotationAngle = 0.05;
//I'm not sure how to do rotation in XNA, but the internets tell me it's something like this:
missile.velocity = Vector2.Transform(missile.velocity, Matrix.CreateRotationZ(rotationAngle))
দ্রষ্টব্য, যেহেতু rotationAngle
কেবলমাত্র তিনটি সম্ভাব্য মান রয়েছে Matrix.CreateRotationZ(rotationAngle)
তাই সমস্ত সম্ভাব্য মানগুলি ক্যাশে করা যায় তাই আপনাকে এটিকে প্রতিটি ফ্রেমে কল করতে হবে না।
দুটি সম্ভাব্য কৌশল রয়েছে:
প্রথম কৌশলটি ফ্রেম-ভিত্তিক সিমুলেশন করা। আপনি যদি গেমপ্লেতে একটি হোমিং ক্ষেপণাস্ত্রের মতো কিছু করছেন তবে এটি আপনার টার্গেটে ঠিক আঘাত করতে হবে না এটি ভাল।
এই ক্ষেত্রে আপনি অবজেক্টের অবস্থান এবং বেগ ট্র্যাক করতে চান। প্রতিটি ফ্রেম লক্ষ্যটির দিকে এবং বর্তমান গতিপথের দিকটি দেখে এবং বেগ যথাযথভাবে সামঞ্জস্য করে।
যদি আপনি তাত্ক্ষণিক বেগটি স্ন্যাপ করেন তবে আপনার ক্ষেপণাস্ত্র সর্বদা লক্ষ্যবস্তুতে চলে যাবে। তবে আপনি যদি প্রতিটি ফ্রেমকে সামান্য পরিমাণে বেগটি সামঞ্জস্য করেন তবে আপনার ক্ষেপণাস্ত্র লক্ষ্যটির দিকে বাঁকিয়ে যাবে - এবং এটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরেاوস্ত হয়ে যায় the
দ্বিতীয় কৌশলটি হল প্যারামেট্রিক পদ্ধতি ব্যবহার করা । এটি এমন জিনিসগুলিকে অ্যানিমেটেড করার জন্য দরকারী যেখানে আপনি আপনার লক্ষ্যটিকে যথাযথভাবে এবং অনুমানের সাথে আঘাত করতে চান। এই ক্ষেত্রে আপনি সাধারণত আপনার প্যারামিটার হিসাবে "সময়" নেন এবং এটিকে কোনও প্রকারের ফাংশনে রেখে দেন।
বিশেষত কার্যকর ফাংশনগুলির একটি সেট হ'ল সমীকরণগুলির গতিগুলি যা আপনি হাইস্কুল পদার্থবিজ্ঞানে শিখেছিলেন। এটিকে উভয় অক্ষটিতে প্রয়োগ করে আপনি ব্যালিস্টিক ট্র্যাজেক্টরিগুলি পেতে পারেন। অল্প অল্প গণিতের সাহায্যে আপনি লক্ষ্যটিকে আঘাত করতে প্রাথমিক প্যারামিটারগুলি নির্ধারণ করতে পারেন - এমনকি একটি চলমান এমনকি যদি এটি পূর্বাভাসের সাথে অগ্রসর হয়।
এক্সএনএ এছাড়াও বেশ কয়েকটি ইন্টারপোলেশন এবং বক্র গতি ফাংশন সরবরাহ করে। জন্য Vector2
এবং জন্য MathHelper
ডকুমেন্টেশন একবার দেখুন । এটি কিছু ইন্টারপোলেশন ফাংশন সরবরাহ করে যা আপনি ব্যবহার করতে পারেন এবং এমনকি আকর্ষণীয় জিনিসগুলি সংযুক্ত করতে পারেন। উদাহরণস্বরূপ, একটি ক্ষেপণাস্ত্র চালানো: Lerp
(লিনিয়ার ইন্টারপোল্ট) আপনার ক্ষেপণাস্ত্রের অবস্থানটি প্রথম দিক থেকে লক্ষ্য স্থিতির দিকে নিয়ে যায় এবং লক্ষ্য লক্ষ্যটিকে কিছু প্রাথমিক লক্ষ্য থেকে লক্ষ্য বস্তুর আসল (পরিবর্তিত) অবস্থানের দিকে ছুঁড়ে দেয়। এটি আপনাকে একটি দুর্দান্ত "লকিং অন" প্রভাব দেবে।
(এছাড়াও উত্পাদক রেখাচিত্র জন্য কিছু ফাংশন আছে, উদাহরণস্বরূপ: CatmulRom
, Hermite
। এই সম্ভবত কঠিন যদিও একটি চলমান লক্ষ্য সঙ্গে সফলভাবে ব্যবহার করতে।)
যদি আপনি "ইজিমিং" (অ্যানিমেশন প্রসঙ্গে) সন্ধান করেন তবে আপনি আরও কিছু আকর্ষণীয় ইন্টারপোলেশন ফাংশন পেতে পারেন যা আপনাকে ত্বরণের মত আকর্ষণীয় প্রভাব দিতে পারে।
এখন - আপনি বলতে পারেন যে আপনার টার্গেটটি প্রায় কাছাকাছি চলে আসার সাথে সাথে এই কৌশলটি কিছু বিজোড় ফলাফল দেয়। তবে অনুশীলনে, যতক্ষণ না আপনার প্রক্ষিপ্তর আপনার টার্গেটের চেয়ে দ্রুত এগিয়ে চলেছে, এটি সাধারণত সূক্ষ্ম দেখায়। যদি সমস্যা হয় তবে আপনার সম্ভবত কোনও ফ্রেম-ভিত্তিক কৌশল ব্যবহার করা উচিত।
আপনি সাইন ওয়েভ বা সম্ভবত বেজিয়ার কার্ভগুলি সন্ধান করতে পারেন । সাইন ওয়েভ এপ্রোচটি স্বাভাবিক কিনা তা আমি জানি না, তবে কেন এটি দরিদ্র হবে তা আমি দেখতে পাচ্ছি না।
ক্রেগ রেইনল্ডস দ্বারা নির্ধারিত হিসাবে আপনি স্টিয়ারিং বিহ্যাভিয়ার্সটি একবার দেখে নিতে পারেন: http://red3d.com/cwr/steer/
এটি প্রায়শই এআইতে এনপিসিগুলি তাদের লক্ষ্যের দিকে এগিয়ে যেতে ব্যবহৃত হয়।