एक अवरोधन के वेक्टर की गणना कैसे करें?


11

यह देखते हुए कि एक जुड़वां अंतरिक्ष यान है, और 1 अनुकूल अंतरिक्ष यान अभी भी खड़ा है, एक दुश्मन जानी-पहचानी वास्तविक स्थिति, गति और दिशा के साथ अनुकूल जहाज पर सीधे नहीं जा रहा है।

अनुकूल जहाज दुश्मन से लड़ने के लिए खुद को फायरिंग रेंज में लाना चाहता है।

वास्तव में मैं वास्तविक स्थिति में चल रहे जहाज के लिए बस एक सीधा वेक्टर स्थापित कर रहा हूं, और इसे हर फ्रेम को पुनर्गणना करता हूं, जिसके परिणामस्वरूप किसी प्रकार का "गोल" फ्लाइटपाथ होता है।

मैं जो चाहता हूं वह इस स्थिति के लिए एक सीधा और सीधा रास्ता तय करना है कि दुश्मन (जब संभवतया) होगा जब फायरिंग दूरी तक पहुंच जाएगा, यह मानते हुए कि दुश्मन तब तक पाठ्यक्रम नहीं बदलेगा।

पहले और "सरल" कार्यान्वयन के रूप में यह पर्याप्त होगा यदि हम यह मान लें कि मित्र कुछ ही समय में 0 से अधिकतम गति कर सकता है।

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

जवाबों:


5

यदि मैं आपके प्रश्न को समझता हूं, तो आप यह नहीं चाहते कि जहाज लक्ष्य पर चढ़े, बल्कि सीधी रेखा में उड़ान भरे, जो लक्ष्य को बाधित करने के लिए होता है। मैं एक टॉवर रक्षा खेल बना रहा हूं जो मूल रूप से एक टॉवर की गोली के लिए समान आवश्यकता है, एक टॉवर एक बंदूक को फायर करना चाहता है जैसे कि बुलेट एक चलती लक्ष्य को तब तक बाधित करेगा जब तक यह गति / दिशा नहीं बदलता। जिस तरह से मैंने इसे हल किया वह द्विघात समीकरण का उपयोग करके था। यहाँ कुछ छद्म कोड है:

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

मुझे यह अच्छी तरह से काम करने के लिए मिला है मुझे शॉट के लिए टकराव का पता लगाने की आवश्यकता नहीं थी ... मैं हर शॉट पर एक बैल की आंख मारने की गिनती करने में सक्षम था, चाहे दूरी / दिशा / लक्ष्य की गति की परवाह किए बिना जब तक कि वे कारक स्थिर रहे।


आपके विवरण से यह प्रतीत होता है कि मैं क्या खोज रहा हूं, कम से कम आसान तरीका है जो अधिकतम गति को त्वरित त्वरण मान रहा है। मैं शाम को इस पर करीब से नज़र डालूंगा। क्या मैं सही मान रहा हूं कि वेक्टर.डॉट वैक्टर के डॉटप्रोडक्ट को लौटाता है?
नोबजेड

हम्म् ... मैंने अब रूबी में यह किया है, लेकिन कुछ गलत लगता है। हर बार जब मैं कोशिश करता हूं, तो एक अपवाद है, क्योंकि sqrt में अभिव्यक्ति कुछ नकारात्मक का मूल्यांकन करती है और इसलिए सीमा से बाहर है। इससे मैं किस तरह निपट सकता हूं। प्रश्न के लिए क्षमा करें, लेकिन मैं केवल इसका उपयोग कर सकता हूं, लेकिन यहां शंकु को तब तक न समझें जब तक कि कोई मुझे सलाह न दे।
नोबबुल जूल

इसका उदाहरण इस पुस्तक से था: amazon.com/…
स्टीव एच।

1
अगर यह मदद करता है पता नहीं है, लेकिन यहाँ कुछ अजगर कोड है कि एक ही बात को पूरा करता है। moddb.com/mods/wicmw/tutorials/…
स्टीव एच।

ठीक है, मैं अभी भी छेद के गणित को पीछे नहीं समझता हूं, लेकिन अजगर कोड के लिए thx, प्रलेखन ने मुझे बताया, कि यदि sqrt के अंदर एक नकारात्मक मूल्य है, तो मेरे दोस्त को पकड़ने के लिए धीमा करना है। अपने परीक्षण मूल्यों को ट्विक करने के बाद मुझे कुछ परिणाम मिलते हैं। आपकी मदद के लिए thx।

6

मेरा सुझाव है कि आप स्टीयरिंग व्यवहार पर ध्यान दें। विशेष रूप से पीछा । स्रोत-कोड OpenSteer कार्यान्वयन में पाया जा सकता है या " उदाहरण के लिए प्रोग्रामिंग गेम AI " जैसी पुस्तक देख सकता है (ISBN 13: 978-1556220784)


लक्ष्य के बारे में ज्ञान की आवश्यकता के लिए खोज करने की आवश्यकता है और उस ओर कदम बढ़ाता है, लेकिन मुझे वास्तव में लक्ष्य का पता नहीं है। मुझे पता है कि दुश्मन अब कहां है, मैं इसकी गति और इसकी दिशा जानता हूं। अब मैं जानना चाहता हूं कि जल्द से जल्द अपने लक्ष्य के रास्ते में शत्रु को रोकने के लिए उसे किस दिशा में जाना है। जैसा कि पहले उल्लेख किया गया है कि त्वरण को पहले नजरअंदाज किया जा सकता है, यह वास्तविक संस्करण की तुलना में प्रसंस्करण समय की बहुत बचत करेगा ... नए मॉडल के साथ मुझे केवल तब पुन: गणना करना होगा जब दुश्मन "कॉन्सचेंज" -वेंट को आग लगाता है, प्रत्येक के लिए नहीं " hasmoved "-event जैसा कि मैं अभी करता हूं।
नोबजेड

हाँ, आप जो वर्णन करते हैं वह पीछा है। यह लक्ष्य नहीं जानता है .. यह "दुश्मनों" की वर्तमान स्थिति, गति और दिशा के आधार पर एक भविष्यवाणी करता है
बम्म्ज़ैक

फिर मैंने वर्णन को गलत समझा, मैं कल इस पर बारीकी से विचार करूंगा।
नोबज जूल

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

@NobbZ मुझे खेद है कि मेरा उत्तर सहायक नहीं था। आपको शायद अपने प्रश्न को तदनुसार संपादित करना चाहिए, क्योंकि जैसे कथन: "मुझे पता है, कि दुश्मन की गति या पाठ्यक्रम के परिवर्तन के मामले में हर गणना को दोहराया जाना चाहिए" भ्रामक हो सकता है .. यदि आपने ऐसा किया है, तो आप समाप्त होंगे "पीछा" स्टीयरिंग व्यवहार।
बंमज़ैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.