প্রথমে আপনাকে বুড়িটির মুখোমুখি দিক এবং লক্ষ্যটির দিকের মধ্যে কোণের পার্থক্য নির্ধারণ করতে হবে।
Vector2 turretToTarget = target.position - turret.position;
float desiredAngle = atan2(turretToTarget.y, turretToTarget.x);
float angleDiff = desiredAngle - turret.angle;
// Normalize angle to [-PI,PI] range. This ensures that the turret
// turns the shortest way.
while (angleDiff < -PI) angleDiff += 2*PI;
while (angleDiff >= PI) angleDiff -= 2*PI;
আপনার এই পরিমাণগুলি একবার হয়ে গেলে আপনি বুড়ি কোণের জন্য দ্বিতীয় ডিগ্রি প্রকাশ করতে পারবেন set আপনি সর্বদা অবস্থান এবং বেগের সর্বশেষতম ডেটা ব্যবহার করেন তা নিশ্চিত করার জন্য আপনাকে প্রতিটি আপডেটে এটি গণনা করতে হবে।
// Compute angular acceleration.
const float C0 = // Must be determined.
const float C1 = // Must be determined.
float angularAcc = C0 * angleDiff - C1 * turret.angularVelocity;
এখানে, ত্বরণ এক্সপ্রেশন প্রথম শব্দ (শূন্য ডিগ্রি) বার্ধটি লক্ষ্য দিকে বাঁক শুরু করতে হবে। তবে এটি সময়মতো থামবে না বরং এটি পিছনে পিছনে দোল করা উচিত। এটি বন্ধ করতে আমাদের স্যাঁতস্যাঁতে দ্বিতীয় টার্ম (প্রথম ডিগ্রি) প্রয়োজন যা একটি উচ্চ ঘূর্ণন বেগকে একটি উচ্চ ত্বরণ দ্বারা বিরোধিতা করে।
এখন সিস্টেমটি ভাল আচরণের জন্য ইতিবাচক ধ্রুবকগুলি (অগত্যা প্রোগ্রামের ধ্রুবকগুলি নয়) স্থির এবং ভারসাম্যপূর্ণ হওয়া দরকার। C0
সিস্টেমের গতির জন্য প্রধান নিয়ন্ত্রণ। এর জন্য একটি উচ্চ মানের C0
একটি দ্রুত বাঁক গতি দেয় এবং একটি কম মান একটি কম বাঁক গতি দেয়। আসল মান অনেকগুলি বিষয়ের উপর নির্ভর করে তাই আপনার এখানে পরীক্ষা এবং ত্রুটি ব্যবহার করা উচিত। C1
স্যাঁতসেঁতে প্রস্থকে নিয়ন্ত্রণ করে। Discriminant দ্বিঘাত সমীকরণের আমাদের বলে যে যদি C1*C1 - 4*C0 >= 0
আমরা একটি অ-দোদুল ব্যবস্থা আছে।
// New definition.
const float C1 = 2*sqrt(C0); // Stabilizes the system.
C1
সংখ্যাসূচক কারণে আপনার সম্ভবত এটির থেকে কিছুটা বড় বাছাই করা উচিত , তবে খুব বেশি বড় নয় কারণ এটি খুব বেশি স্যাঁতসেঁতে হতে পারে এবং পরিবর্তে প্রতিক্রিয়া জানাতে ধীর হতে পারে। আবার, আপনি টুইট করতে হবে।
এছাড়াও এটি লক্ষণীয় গুরুত্বপূর্ণ যে এই কোডটি কেবল কৌনিক ত্বরণকে গণনা করে। কোণ এবং কৌণিক বেগটি এটিকে অন্য কোথাও থেকে আপডেট করতে হবে, কোনও ধরণের ব্যবহার করে এবং সংহতকারী। প্রশ্ন থেকে আমি ধরে নিই যে এটি আবৃত হয়েছে।
অবশেষে পিছিয়ে পড়ার বিষয়ে কিছু বলার আছে, কারণ দ্রুত টার্গেট ট্র্যাক করার সময় বুড়িটি সম্ভবত সর্বদা পিছনে থাকবে। এটি মোকাবেলার একটি সহজ উপায় হ'ল লক্ষ্যটির অবস্থানের সাথে একটি রৈখিক পূর্বাভাস যুক্ত করা, অর্থাৎ সর্বদা লক্ষ্যটির সামনের দিকে কিছুটা এগিয়ে যান।
// Improvement of the first lines above.
const float predictionTime = 1; // One second prediction, you need to experiment.
Vector2 turretToTarget = target.position + predictionTime * target.velocity - turret.position;
/// ...
কিছু সময়ের জন্য লক্ষ্য ব্যাসার্ধের মধ্যে বুড়িটি রাখার ক্ষেত্রে, এই ধরণের সিস্টেমে সরাসরি চাপিয়ে দেওয়ার জন্য এটি একটি কঠিন প্রয়োজন হতে পারে। আপনি নিশ্চিত হতে পারেন যে এই নিয়ামকটি সর্বদা লক্ষ্য (বা বরং পূর্বাভাসিত অবস্থান) লক্ষ্য করে বজায় রাখার চেষ্টা করবে। ফলাফলের সক্রিয় আউট যদি সন্তোষজনক না হতে আপনি প্যারামিটার সংশোধন করতে হবে predictionTime
, C0
এবং C1
(স্থিতিশীল সীমার মধ্যে)।