আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি এমন কিছু আছে যা এখনও পর্যন্ত দেওয়া উত্তরগুলিতে মিস হয়েছে। মূল প্রশ্নে, ক্ষেপণাস্ত্রটি (বা যাই হোক না কেন) লক্ষ্য অবস্থার দিকে ত্বরান্বিত করতে বলা হয়েছিল। বেশ কয়েকটি জবাব নির্দেশ করেছে যে এটি ভুল ছিল এবং আপনার লক্ষ্যটি পরবর্তী সময়ে হবে বলে আপনার গতি বাড়ানো উচিত। এটি ভাল তবে তবুও ভুল।
আপনি যা করতে চান তা লক্ষ্যের দিকে ত্বরান্বিত না হয়ে লক্ষ্যের দিকে এগিয়ে যাওয়া। এটি সম্পর্কে চিন্তা করার উপায়টি হ'ল লক্ষ্য হিসাবে আপনার পছন্দসই গতিবেগ সেট করা (বা লক্ষ্যগুলির অবস্থানের একটি অভিক্ষেপ) এবং তারপরে আপনি কী ত্বরণটি সর্বোত্তমভাবে প্রয়োগ করতে পারেন তা নির্ধারণ করুন (আপনার যে কোনও বিধিনিষেধ রয়েছে তার অর্থ প্রদত্ত, যেমন একটি ক্ষেপণাস্ত্র সম্ভবত ত্বরণ করতে পারে না) প্রত্যক্ষ বিপরীতে) আপনার কাঙ্ক্ষিত বেগ অর্জন করতে (স্মরণ করে যে বেগটি একটি ভেক্টর)।
এখানে একটি কার্যকর উদাহরণ যা আমি আজ সকালে প্রয়োগ করেছি, আমার ক্ষেত্রে খেলোয়াড় এআইয়ের জন্য একটি ক্রীড়া সিমুলেশন গেমের ক্ষেত্রে, যেখানে প্লেয়ার তাদের প্রতিপক্ষকে তাড়া করার চেষ্টা করছেন। আন্দোলনটি একটি স্ট্যান্ডার্ড 'কিক-ড্রিফ্ট' মডেল দ্বারা পরিচালিত হয় যেখানে গতি আপডেট করার জন্য টাইমস্টেপের শুরুতে ত্বরণ প্রয়োগ করা হয় এবং তারপরে টাইমস্টেপের সময়কালের জন্য সেই গতিতে অবজেক্টগুলি প্রবাহিত হয়।
আমি এটির উত্সটি পোস্ট করব, তবে আমি খুঁজে পেয়েছি যে এই সাইটে কোনও গণিতের মার্কআপ সমর্থিত নেই। ছি! আপনাকে কেবল বিশ্বাস করতে হবে যে এটি সর্বোত্তম সমাধান যা আমার মনে করে যে ত্বরণের দিকনির্দেশ সম্পর্কে আমার কোনও বিধিনিষেধ নেই, যা কোনও ক্ষেপণাস্ত্র টাইপের বস্তুর ক্ষেত্রে নয়, তাই এর জন্য কিছু অতিরিক্ত বাধাও প্রয়োজন।
কোডটি অজগরটিতে রয়েছে তবে কোনও ভাষার পটভূমির সাথে পঠনযোগ্য হওয়া উচিত। সরলতার জন্য, আমি ধরে নিয়েছি প্রতিটি সময় পদক্ষেপের দৈর্ঘ্য 1 এবং এটি প্রতিফলিত করার জন্য যথাযথ ইউনিটে বেগ এবং ত্বরণ প্রকাশ করি।
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
নোট করুন যে atan2 (a, b) ফাংশনটি a / b এর বিপরীতমুখী টানটি গণনা করে তবে কোণগুলি একটি বৃত্তের সঠিক কোয়াড্রেন্টে বসার বিষয়টি নিশ্চিত করে, যার জন্য a এবং b উভয়ের চিহ্ন জানতে হবে।
আমার ক্ষেত্রে, একবার আমার ত্বরণ হওয়ার পরে আমি গতিটি আপডেট করার জন্য এটি প্রয়োগ করি
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
আমি কোনও খেলোয়াড় নির্ভর সর্বাধিক গতির বিপরীতে নতুন গতিটিও পরীক্ষা করে দেখি এবং এটি এটি ক্যাপ করি। একটি ক্ষেপণাস্ত্র, গাড়ি বা সর্বাধিক টার্নিং রেট (টিকের প্রতি ডিগ্রীতে) সহ কোনও কিছুর ক্ষেত্রে আপনি কেবল গণনা করা আদর্শের তুলনায় গতির বর্তমান কোণটি দেখতে পারেন এবং যদি এই পরিবর্তনটি অনুমোদিতের চেয়ে বেশি হয় তবে কেবল কোণ হিসাবে পরিবর্তন করুন যতটা সম্ভব আদর্শের দিকে।
এটির উত্পন্নকরণে আগ্রহী যে কোনও ব্যক্তির জন্য, আমি টাইমস্টেপের পরে প্লেয়ার এবং লক্ষ্যের মধ্যে দূরত্ব লিখেছিলাম, প্রাথমিক অবস্থান, গতি, ত্বরণ হার এবং ত্বরণ কোণের দিক দিয়ে, তারপর ত্বরণের কোণটির সাথে সম্মতি নিয়ে ডেরাইভেটিভ নিয়েছি। এটি শূন্যে সেট করা ত্বরণের কোণের একটি কার্য হিসাবে টাইমস্টেপের পরে প্লেয়ার-লক্ষ্য দূরত্বের মিনিমা খুঁজে পায়, যা আমরা জানতে চাই। মজার বিষয় হল, ত্বরণের হারটি মূলত সমীকরণগুলিতে থাকলেও, আপনি প্রকৃতপক্ষে কতটা ত্বরণ করতে সক্ষম তার থেকে এটি সর্বোত্তম দিকটিকে স্বাধীন করে তোলা বাতিল করে দেয়।