चलती लक्ष्य को हिट करने के लिए शॉट कोण और वेग की गणना कैसे करें?


11

मैं एक 2 डी एंड्रॉइड गेम विकसित कर रहा हूं और मैं एआई प्रोजेक्टाइल के लिए दुश्मनों को मारने के लिए एक लक्ष्यीकरण एल्गोरिथम बना रहा हूं जो या तो एक पथ का अनुसरण कर रहा है, या मुफ्त हिल रहा है। फिलहाल यह केवल गणना करता है कि लक्ष्य दूरी के बाद कहां होगा और उस दूरी पर इसे पूरा करने के लिए एक प्रक्षेप्य फायर करता है। बेशक इसका मतलब लक्ष्य को पूरा करने के लिए प्रक्षेप्य गति को अलग करना है।

क्या किसी को सरल-ईश एल्गोरिथ्म (इष्टतम-ईश) के लिए कोई सुझाव देना है कि जब प्रक्षेप्य को आग लगने की आवश्यकता होती है और यह लक्ष्य करने की आवश्यकता है कि क्या यह केवल एक स्थिर वेग से यात्रा कर सकता है? कहें कि प्रक्षेप्य लक्ष्य की गति से दोगुना हो जाता है?

एकमात्र तरीका जो मैं सोच सकता हूं उसमें खोज शामिल है और यह काफी बड़ा है।



@JohnMcDonald: बहुत संबंधित नहीं है जो कि पैराबोलिक प्रोजेक्टाइल के बारे में है, रैखिक नहीं है। यह बहुत करीब है: gamedev.stackexchange.com/questions/4995/…
e100

जवाबों:


13

एक टॉवर रक्षा खेल में मैंने बनाया, मैंने चौराहे की भविष्यवाणी करने के लिए एक द्विघात समीकरण का उपयोग किया और इस तरह लक्ष्य बिंदु। निम्नलिखित लक्ष्य कोड स्निपेट मानता है कि दुश्मन निरंतर गति और दिशा में यात्रा कर रहा है। यह भी मानता है कि प्रक्षेप्य ज्ञात स्थिर गति से यात्रा कर रहा होगा (किसी भी गति हो सकता है लेकिन एल्गोरिथ्म के लिए जाना जाना चाहिए)।

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

चूँकि यह उस समय के प्रभाव का समय भी निर्धारित करता है, जब तक कि मैं उस समय लक्ष्य की स्थिति पर प्रभाव ग्राफिक्स को कॉल करने के लिए चिपकाए गए समय तक इंतजार नहीं करता था ... हिट्स निर्धारित करने के लिए किसी भी टकराव का पता लगाने की कोई आवश्यकता नहीं है।


"हिट्स निर्धारित करने के लिए किसी भी टकराव का पता लगाने की आवश्यकता नहीं है।" - यदि लक्ष्य (एस) उनकी गति और दिशा को बनाए रखने के लिए विवश हैं। --- यदि, हालांकि, उनके पास एक सक्रिय AI है, या इससे भी बदतर, खिलाड़ी हैं, और शूटर द्वारा निकाल दिए जाने के बाद आगे बढ़ने में सक्षम हैं, तो टकराव का पता लगाने के बजाय समय पर अपनी हिट्स को आधार बनाते हुए आपके खिलाड़ी का आधार क्या होगा कुछ बुरा कीड़े / glitches के रूप में अनुभव होगा।
XenoRo

@ लीमा युप, जैसे यह उत्तर के 2 वाक्य में कहता है। ;-)
स्टीव एच।

यह मेरे परिदृश्य के लिए लगभग सही है, लेकिन आप इन 2 अतिरिक्त चरों में कैसे कारक होंगे: प्रक्षेप्य के लिए त्वरण, टॉवर की गति?
जैक

a0 क्या है ? यह शून्य अपवाद द्वारा एक विभाजन का उत्पादन करेगा, लेकिन चर टी के संदर्भ में इसका क्या मतलब है? क्या इसे 'बहुत बड़ी संख्या' माना जाना चाहिए या सबसे अच्छा मामला क्या होगा?
जुआरिनक्स

क्या एक अच्छी किताब है जो इसके पीछे अंतर्ज्ञान में जाती है? मैं उत्सुक हूँ कि आप इस गणित को कैसे देखना चाहते थे ...
davidkomer

4

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

एआई, लक्ष्य के समय के दौरान प्रक्षेप्य का स्थान निकाल दिया जाता है, और मृत्यु के बिंदु पर लक्ष्य का अंतिम स्थान एक त्रिकोण का निर्माण करता है। आपके लिए पहले से ही क्या पता होना चाहिए:

  1. साइड की लंबाई a, जो कि प्रक्षेप्य गति है
  2. साइड की लंबाई बी, जो लक्ष्य गति है
  3. लक्ष्य की गति की गति का कोण।

आपके पास त्रिभुज, एसएसए केस के तीन भाग हैं, इसलिए इसे इस तरह हल करें

  1. कोण B को गति के कोण और AI के स्थान के आधार पर खोजें
  2. कोण A को खोजने के लिए साइन के नियम का उपयोग करें

कोण ए को आपको उस कोण को निर्धारित करने की अनुमति देनी चाहिए जिस पर प्रक्षेप्य लॉन्च किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.