लक्ष्य तक पहुंचने के लिए एआई के लिए सही गति का पता लगाना


10

मेरे पास एक जहाज है जो अधिकतम गति से यात्रा करता है maxSpeedऔर rotationSpeedप्रति सेकंड डिग्री बदल सकता है । जहाज हमेशा उस दिशा में आगे बढ़ता है जिसका वह सामना कर रहा है, जिसका अर्थ है कि जहाज जितनी तेजी से यात्रा कर रहा है उतना बड़ा उसका मोड़ त्रिज्या है।

मुझे अपनी स्थिति, और रोटेशन और लक्ष्य की स्थिति पता है।

मैं यह पता लगाना चाहूंगा कि क्या कोई लक्ष्य इस गति से मेरी टर्निंग त्रिज्या के अंदर है, या बेहतर है, मैं जिस गति से यात्रा कर सकता हूं, वह अधिकतम गति है, ताकि बिना लक्ष्य के चक्कर लगाते हुए लक्ष्य को मोड़ सकें।

क्या ऐसा करने का एक कुशल (ईश) तरीका है?

यहाँ मैं अब तक क्या सोच रहा हूँ: क्योंकि मुझे पता है कि मैं प्रति कदम कितनी दूर यात्रा कर रहा हूँ और मैं प्रति चरण कितना घूम रहा हूँ, मैं यह पता लगा सकता हूँ कि मैं अगले दो फ्रेमों में कहाँ रहूँगा। मेरी वर्तमान स्थिति p1 है, मेरी अगली स्थिति P2 है तो p3 है। मैं (पी 1, पी 2) और (पी 2, पी 3) के लंबवत द्विभाजक ले सकता हूं। उनका चौराहा बिंदु मुझे एक चक्र का केंद्र देगा। मैं तब परीक्षण कर सकता हूं यदि लक्ष्य उस घेरे में है।

मैं अनिश्चित हूं कि यह 3 डी में काम करेगा (मैं अनिश्चित हूं कि मेरे इनपुट के साथ एक क्षेत्र की गणना कैसे करें)। यह समाधान भी सही गति खोजने में बहुत अधिक मदद नहीं करता है जिस पर यात्रा करने के लिए, मुझे एक उचित खोजने के लिए विभिन्न गति के साथ कुछ बार प्रयास करना होगा।

क्या कोई बेहतर समाधान पर कुछ प्रकाश डाल सकता है?

जवाबों:


17

बाध्य रोटेशन की गति के साथ दो तरीके से एक एआई नियंत्रित इकाई है और एक समायोज्य आंदोलन की गति एक लक्ष्य तक पहुंच सकती है।

सबसे पहले, उस चुनौती पर विचार करें जिसे हम प्रस्तुत कर रहे हैं ताकि हम इसे बेहतर समझ सकें:

यहाँ छवि विवरण दर्ज करें

यदि खिलाड़ी किसी लक्ष्य तक पहुँचने की कोशिश करते हुए निरंतर गति में घूम रहा है और घूम रहा है, जो उसके दाईं या बाईं ओर है, तो वह हमेशा के लिए हलकों में चला जाएगा, कभी भी यह लक्ष्य का सामना नहीं करेगा। खिलाड़ी जिन दो क्षेत्रों को सर्कल करेगा, उन्हें ऊपर लाल रंग में चिह्नित किया जाएगा।

लाल में चिह्नित परिपत्र क्षेत्र की गणना इस तरह की जा सकती है:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

यह लाल घेरे की स्थिति और त्रिज्या का परिणाम है। हम यह निर्धारित करने के लिए उपयोग कर सकते हैं कि क्या कोई निश्चित लक्ष्य एआई नियंत्रित इकाई की पहुंच से बाहर है यदि यह लक्ष्य की दिशा की ओर मुड़ता है।

यह पता लगाने के लिए कि क्या एक निश्चित वस्तु मंडलियों में से एक है, हम केवल मंडलियों के केंद्र से दूरी की गणना करते हैं:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

इसके लिए दो संभावित उपाय हैं:

1।

गोल लाल क्षेत्र के बाहर होने तक कुछ दूरी बनाएं और फिर फैशन की तरह यू-टर्न लें। यह सरल है, इकाई को तब तक चलते रहने दें जब तक कि चेक वापस न आ जाए कि गोल इस घेरे में नहीं है। फिर आप घूम सकते हैं।

यहाँ छवि विवरण दर्ज करें

दूसरे विकल्प की गणना के लिए थोड़ा और काम करने की आवश्यकता है:

हम एआई इकाई और लक्ष्य के बीच एक काल्पनिक रेखा खींचते हैं। उनके बीच के कोण का उपयोग करना:

angle = Math.atan2(goalY - unitY, goalX - unitX);

अब आपको सही गति की गणना करने के लिए निम्नलिखित करने की आवश्यकता है:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

यहाँ छवि विवरण दर्ज करें

आदेश में यह 3 डी मामले में काम करने के लिए:

वह विमान ढूंढें जिस पर निम्नलिखित तीन बिंदु रहते हैं:

  1. लक्ष्य बिंदु।
  2. पिछले फ्रेम में AI यूनिट की स्थिति।
  3. एआई इकाई की वर्तमान स्थिति।

आप उस विमान का उपयोग 2d तरीके से गति की गणना करने के लिए कर सकते हैं। आपको बस अपने 3 डी मानों से डॉट्स को उनके सामान्य विमान पर एम्बेडेड 2d मूल्यों में बदलने की आवश्यकता है।

आप इसका उपयोग करना चाहते हैं:

यूवी निर्देशांक के लिए एक विमान पर एक 3D बिंदु कैसे परिवर्तित करें?


उत्तम! बिल्कुल सही जवाब मैं उम्मीद कर रहा था! आपके विस्तृत स्पष्टीकरण के लिए धन्यवाद, मुझे लगता है कि मैं इस पर एक्सट्रपलेशन करने और 3 डी में इसका उपयोग करने में सक्षम हूं।
वीचसम

@weichsem मैंने उत्तर को अपडेट किया। मैंने जो सुझाव दिया वह एक सामान्य 2d सादा हिस्सा है जो वे साझा करते हैं और सही गति की गणना करने के लिए इसका उपयोग करते हैं।
अट्टुरसम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.