पहले आपको बुर्ज का सामना करने की दिशा और लक्ष्य की दिशा के बीच के कोण में अंतर निर्धारित करने की आवश्यकता है।
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;
एक बार आपके पास ये मात्राएँ होने के बाद आप बुर्ज कोण के लिए दूसरी डिग्री की अभिव्यक्ति स्थापित कर सकते हैं। आपको यह सुनिश्चित करने के लिए प्रत्येक अपडेट पर यह गणना करने की आवश्यकता है कि आप हमेशा पदों और वेग के नवीनतम डेटा का उपयोग करें।
// 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
भिगोना परिमाण को नियंत्रित करता है। द्विघात समीकरण का विभेदक बताता है कि यदि 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
(स्थिर सीमा के भीतर)।