जवाबों:
परवलयिक ट्रेक्टोरी फ़ंक्शन को निम्न के रूप में परिभाषित किया गया है:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
ज्ञात मूल्य:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
अज्ञात मान:
Vo: Initial Velocity
'Vo' की गणना करने के लिए, हम F फ़ंक्शन को मान दे सकते हैं:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
अब आप एफ समीकरण में टी को मान देने वाले मूल से लक्ष्य तक पहुंचने के लिए सभी मूल्य प्राप्त कर सकते हैं:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
मुझे हाल ही में इसी तरह की समस्या को हल करना था, मैं दो समाधानों के साथ आया था, विकिपीडिया पृष्ठ 'डैन द मैन' में पाए गए सूत्र के आधार पर पहले ही उल्लेख किया गया है: प्रक्षेपवक्र का प्रक्षेपवक्र
इस समाधान में आपको निश्चित रूप से लॉन्च कोण तय या एक्स वेग की आवश्यकता होती है। वाई वेग की जरूरत नहीं है क्योंकि हम एक विशिष्ट कोण में प्रक्षेप्य को लॉन्च करते हैं।
समाधान 1, लॉन्च कोण तय हो गया है, वेग की गणना करें:
g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity
समाधान 2, वेग तय हो गया है, लॉन्च कोण की गणना करें:
g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle
मेरे मामले में इस समाधान ने काफी अच्छा काम किया।
यदि आप इसकी परवाह नहीं करते हैं कि यह गणितीय रूप से सही है, केवल यह कि यह काफी सही लग रहा है, तो सीधे पथ की गणना करें और अपने प्रक्षेप्य को उस पथ का अनुसरण करें, लेकिन उस पंक्ति के सामान्य के साथ "पुश अप" करें, यह फ़ंक्शन के रूप में दूर है। लाइन सेगमेंट, इसलिए यह उगता है क्योंकि यह सेगमेंट के बीच में आता है और लाइन सेगमेंट के बीच से दूर चला जाता है।
इसके लिए आप एक साइन वेव का उपयोग कर सकते हैं, -90 से +90 तक की सीमा का उपयोग करते हुए (जहां -90 लाइन सेगमेंट पर बाएं बिंदु है, 90 दाएं बिंदु है, और आप बीच में लेरप करते हैं), और परिणाम को गुणा करें इसे स्थिर करने के लिए एक निरंतरता से।
यदि आपको विशुद्ध रूप से सही गणितीय / भौतिक उत्तर की आवश्यकता है तो यह मदद नहीं करेगा। यदि आप नहीं करते हैं, तो यह संभवतः आपके लिए बहुत अच्छा काम कर सकता है!
मत भूलो, गेम प्रोग्रामिंग भ्रम के उपयोग के बारे में है जो यथार्थवाद के बजाय सही (और गणना करने के लिए सस्ता है)।
यदि आपको बस कुछ की आवश्यकता है जो सिर्फ सही के बारे में है और एक निश्चित वेग है तो आप इस बहुत ही सरल तरीके का उपयोग कर सकते हैं।
distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;
दूरी नकारात्मक हो सकती है लेकिन यह अभी भी काम करेगा क्योंकि कोण दूरी पर भी निर्भर करता है। यदि दूरी ऋणात्मक है तो जिस कोण को जोड़ना है वह नकारात्मक भी है।
आपको सही मान खोजने के लिए दूर-दराज के साथ खेलने की आवश्यकता होगी। यह प्रक्षेप्य के गुरुत्वाकर्षण और शक्ति पर निर्भर करता है। यह 1 के पास होना चाहिए, जो अधिकतम दूरी के माध्यम से विभाजित हो सकता है।