दो बिंदुओं के बीच घुमावदार आंदोलन


15

एक अच्छी वक्रित गति में किसी वस्तु को बिंदुओं के बीच ले जाने में सक्षम करने के लिए एक अच्छी तकनीक क्या है?

अंतिम स्थिति गति में भी हो सकती है, जैसे कि होमिंग मिसाइल का प्रक्षेपवक्र।

जवाबों:


11

यह मानते हुए कि आप इसे एक फ्रेम-बाय-फ्रेम चीज़ (जहाँ लक्ष्य भी आगे बढ़ सकता है) होना चाहिए, न कि एक पूर्व-प्रक्षेपवक्र प्रक्षेपवक्र, यह वास्तव में अविश्वसनीय रूप से सरल है:

हर फ्रेम, मिसाइल के वेग-वेक्टर की तुलना वेक्टर से (स्थिति लक्ष्य - स्थिति मिसाइल ) ; यह है, वेक्टर मिसाइल से लक्ष्य की ओर इशारा करता है। हर फ्रेम, अगर दोनों वैक्टर में एक ही दिशा नहीं है, तो दूसरी वेक्टर की ओर veloity-वेक्टर को थोड़ा घुमाएं, इसलिए हर फ्रेम अपने लक्ष्य को देखने के लिए थोड़ा करीब हो जाता है।

आप यह निर्धारित कर सकते हैं कि दोनों वैक्टरों के बीच क्रॉस-उत्पाद के संकेत को देखते हुए दक्षिणावर्त घूमना है या नहीं।


[संपादित करें] XNA-ish कोड (मेरे पास यह परीक्षण करने के लिए XNA नहीं है):

//Once a frame:

//Get vector spanning from missile to target
Vector2 vectorToTarget = target.Position - missile.Position;

//Convert to Vector3 to do cross-product
Vector3 vectorToTarget3 = new Vector3(vectorToTarget, 0);
Vector3 missileVelocity3 = new Vector3(missile.Velocity, 0);

//Rotate clockwise/counter-clockwise is determined by sign of cross-product
int crossProductSign = Vector3.Cross(missileVelocity3, vectorToTarget3).Z;

//Positive cross-product means rotate counter-clockwise, negative is clockwise
double rotationAngle = 0;
if(crossProductSign > 0)
    rotationAngle = -0.05;
else if(crossProductSign < 0)
    rotationAngle = 0.05;

//I'm not sure how to do rotation in XNA, but the internets tell me it's something like this:
missile.velocity = Vector2.Transform(missile.velocity, Matrix.CreateRotationZ(rotationAngle))

ध्यान दें, क्योंकि rotationAngleकेवल तीन संभावित मूल्य हैं, सभी संभावित मूल्यों को Matrix.CreateRotationZ(rotationAngle)कैश किया जा सकता है, इसलिए आपको इसे हर फ्रेम पर कॉल करने की आवश्यकता नहीं है।


क्या आप शायद कुछ छद्म कोड प्रदान कर सकते हैं क्योंकि मैं इस सब के लिए नया हूं। मैं वर्तमान में केवल 2 आयाम में काम कर रहा हूं ताकि कुछ जटिलताओं को दूर किया जा सके।
anonymouse

@anonymouse: निश्चित रूप से, यह कोशिश करो
BlueRaja - Danny Pflughoeft

15

दो संभावित तकनीकें हैं:

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

इस स्थिति में आप ऑब्जेक्ट की स्थिति और वेग को ट्रैक करना चाहते हैं। प्रत्येक फ़्रेम लक्ष्य की दिशा और वर्तमान आंदोलन की दिशा को देखता है, और उचित रूप से वेग को समायोजित करता है।

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

दूसरी तकनीक एक पैरामीट्रिक विधि का उपयोग करना है । यह उन चीज़ों को एनिमेट करने के लिए उपयोगी है, जहाँ आप अपने लक्ष्य को सटीक और अनुमानित रूप से मारना चाहते हैं। इस मामले में आप आमतौर पर "समय" को अपने पैरामीटर के रूप में लेते हैं और इसे किसी प्रकार के फ़ंक्शन में डालते हैं।

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

XNA भी कई प्रक्षेप और घुमावदार गति कार्य प्रदान करता है। और के लिए प्रलेखनVector2 पर एक नज़र डालें । ये कुछ प्रक्षेप कार्य प्रदान करते हैं जिनका आप उपयोग कर सकते हैं और यहां तक ​​कि दिलचस्प चीजें करने के लिए गठबंधन कर सकते हैं। उदाहरण के लिए, एक मिसाइल फायरिंग: (रैखिक इंटरपोलेट) अपनी मिसाइल की स्थिति को उसके शुरुआती बिंदु से एक लक्ष्य की स्थिति में ले जाता है, और कुछ प्रारंभिक लक्ष्य से लक्ष्य की स्थिति को लक्ष्य वस्तु की वास्तविक (बदलती) स्थिति तक ले जाने पर भी जोर देता है। यह आपको एक अच्छा "लॉकिंग ऑन" प्रभाव देगा।MathHelperLerp

(उदाहरण के लिए, घटता उत्पन्न करने के लिए कुछ कार्य भी हैं: CatmulRom; Hermite। ये संभवतया किसी लक्ष्य निर्धारण के साथ सफलतापूर्वक उपयोग करने के लिए कठिन हैं, हालाँकि)

यदि आप "सहजता" (एनीमेशन के संदर्भ में) में देखते हैं, तो आप कुछ और दिलचस्प प्रक्षेप कार्य प्राप्त कर सकते हैं जो आपको त्वरण जैसे दिलचस्प प्रभाव दे सकते हैं।

अब - आप कह सकते हैं कि यह तकनीक कुछ अजीब परिणाम देती है क्योंकि आपका लक्ष्य चारों ओर घूमता है। हालाँकि व्यवहार में, जब तक आपका प्रक्षेप्य आपके लक्ष्य से अधिक तेज़ी से आगे बढ़ रहा है, तब तक यह आमतौर पर ठीक दिखता है। यदि यह एक समस्या है, तो आपको शायद वैसे भी एक फ्रेम-आधारित तकनीक का उपयोग करना चाहिए।


3

आप साइन लहरों या संभवतः बेजियर कर्व्स को देखना चाह सकते हैं । मुझे नहीं पता कि साइन लहर दृष्टिकोण सामान्य है, लेकिन मैं यह नहीं देख सकता कि यह गरीब क्यों होगा।


बी-स्प्लिन्स के साथ बेजियर घटता का उपयोग किसी भी वक्र के काफी सटीक प्रतिनिधित्व के लिए अनुमति देता है। यदि आपको सटीकता की आवश्यकता है, तो क्यूबिक हर्मिट स्प्लिन थोड़ा अधिक सटीक हैं। ध्यान में रखते हुए, कभी-कभी अशुद्धि जैविकता का स्वागत योग्य स्पर्श प्रदान करती है।
doppelgreener

Bezier घटता के लिए +1। वर्णित उपयोग के लिए, यह शायद सबसे आसान और सबसे नियंत्रणीय है।
गगम्बेट

1

आप स्टीयरिंग व्यवहार पर एक नज़र डाल सकते हैं, जैसा कि क्रेग रेनॉल्ड्स द्वारा परिभाषित किया गया है: http://red3d.com/cwr/steys/

इसका उपयोग अक्सर AI में NPCs को अपने लक्ष्य की ओर ले जाने के लिए किया जाता है।

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