प्रक्षेप्य गति - तीर


13

एक 2 डी गेम में, मैं बस उड़ान में एक तीर का प्रक्षेपवक्र आकर्षित करना चाहता हूं। नीचे दिए गए कोड के साथ, प्रक्षेपवक्र (परवलय) सही दिखता है, लेकिन कोण (या रोटेशन) या तीर नहीं है।

float g = -9.8f;
float x = (launchVelocity * time);
float y = (launchVelocity * time) + (0.5f * g * (float)Math.Pow(time, 2));
float angle = (float)Math.Tanh(y / x);

मुझे किसकी याद आ रही है? धन्यवाद।


3
स्क्रीनशॉट में मदद मिल सकती है
doppelgreener

जवाबों:


10

Arctanhआप हाइपरबोलिक वक्र के लिए स्पर्शरेखा देता है! जहाँ तक मुझे पता है आपका परबोला हाइपरबोला नहीं है।

लेकिन हमारे पास अच्छी खबर है: अपने परबोला के लिए स्पर्शरेखा खोजना आसान है। समीकरण है

x = s · t => t = x / s; y = s · t + g / 2 · t² => y = x + g / 2 · x² / s =

कहाँ अपने है launchVelocity। अब आपके तीर का ढलान है:

∂y / ∂y = g / (2s ·) · x + 1

आप चाहें Arctanतो अब सुरक्षा उपयोग कर सकते हैं।

भौतिकी के बारे में कुछ अतिरिक्त जानकारी:

आप जिस अनुमानित प्रक्षेप पथ का अनुकरण कर रहे हैं वह आपके तीर के द्रव्यमान के केंद्र पर लागू होता है। जब आप "स्थिति" (x, y) कहते हैं तो आप द्रव्यमान की स्थिति के केंद्र के बारे में बात कर रहे हैं। एक तीर के लिए द्रव्यमान का केंद्र मध्य बिंदु से थोड़ा आगे है और आपको उस खाते को ध्यान में रखना चाहिए यदि आप तीर को खींचने जा रहे हैं।

ध्यान रखें कि आप तीर की निष्क्रिय गति पर विचार नहीं कर रहे हैं (जो कि अगर आप एक विशाल बलीस्टा फायर कर रहे हैं तो बहुत भिन्न हो सकते हैं) और आप तीर के द्रव की गतिशीलता पर विचार नहीं कर रहे हैं: धनुष तीर की उड़ान एक परवलयिक पथ का अनुसरण नहीं करेगी!


धन्यवाद एफएक्सएलएल। कोई भी विचार जहां मुझे वे सूत्र मिल सकते हैं जो एक तीर के भौतिक पर लागू होते हैं?
मार्टिन

मुझे लगता है कि आपका मतलब है: [! & भाग; y / & part; x = g / (2s & sup2;) और middot; x + 1] [2] लेकिन किसी भी मामले में मुझे लगता है कि मैंने नीचे एक बेहतर दृष्टिकोण की सिफारिश की है। एक बात के लिए, आपने x और y घटकों को अलग करने के बारे में नहीं बताया, इसलिए यह एक मनमाने ढंग से 45 डिग्री के कोण पर हार्डकोड किया गया है, लॉन्चवैलोस के साथ वास्तव में लॉन्चवेलोसिटी नहीं है, लेकिन x और y दोनों में घटक
Dov

जड़ता के क्षणों की गणना आसानी से कर सकते हैं। ये छड़ के लिए दो हैं, एक अपने द्रव्यमान के केंद्र के बारे में रोटेशन के लिए और दूसरा रॉड की धुरी के बारे में रोटेशन के लिए। जड़ता के क्षणों के लिए सुपरपोजिशन सिद्धांत लागू होता है इसलिए तीर को तीन भागों में विभाजित किया जा सकता है: पंख, शरीर और टिप।
FxIII

1
समस्या यह है कि एकमात्र गति की गणना करना आसान है, कोण भिन्नता के कारण एक है (आप देख सकते हैं कि एक पैराबोल से दो बार बस एक स्थिर शब्द रहता है)। दूसरा पीठ के पंख के कारण कताई के कारण होता है। यहाँ पंख की लपटें और घर्षण दोनों शामिल हैं, जो गतिज ऊर्जा को कताई में परिवर्तित करते हैं, तीर को धीमा करते हैं लेकिन जाइरोस्कोपिक प्रभाव जोड़ते हैं। यह प्रक्षेपवक्र को प्रभावित करता है और मॉडल के लिए काफी मुश्किल है
FxIII

वैसे भी अगर आप गति को पंख सेटअप से संबंधित कर सकते हैं, तो सभी को पूरी तरह से एकीकरण की गणना की जा सकती है, लेकिन मुझे यकीन नहीं है कि आपके पास गति के समीकरणों के लिए एक बंद रूप हो सकता है (यानी आप एक एकीकरण एल्गोरिथ्म प्राप्त कर सकते हैं लेकिन पैरामीट्रिक नहीं समीकरण)।
FxIII

4

आप किसी भी समय तीर का कोण चाहते हैं। आपको याद है कि एक कोण की गणना करने के लिए, एक स्पर्शरेखा है। लेकिन यहां आपकी सोच गलत होने लगी है:

  1. आप जो चाहते हैं वह डेल्टा y / डेल्टा x है, क्योंकि ढलान परिवर्तन की दर है (अन्य उत्तरों में से एक में उल्लिखित)। ध्यान दें कि x केवल वह स्थिति है जहाँ आप किसी भी समय, dx नहीं हैं।

ठीक है, इसलिए यदि आप वायु घर्षण की उपेक्षा करते हैं, तो तीर का एक्स-वेग एक स्थिर है।

सबसे पहले, x और y घटकों में वेग को विघटित करें। आप 45 डिग्री या 60 डिग्री के कोण पर शूटिंग कर सकते हैं। तो आपको लॉन्चवैलोसिटी और एक कोण की आवश्यकता है, यह एक स्केलर नहीं है।

दूसरा, सब कुछ डबल के रूप में गणना करें, फ्लोट नहीं। जब आप राउंडऑफ़ त्रुटि को नहीं मारेंगे, तो आप यह जानने के लिए पर्याप्त रूप से परिष्कृत नहीं होंगे कि आप प्रयास न करें। यह किसी भी मामले में एक महान समय बचाने वाला नहीं है।

तीसरा, Math.pow का उपयोग न करें, यह धीमा है और पूर्णांक शक्तियों के लिए गुणा के रूप में सटीक नहीं है। इसके अलावा आप हॉर्नर के फॉर्म का उपयोग करके बहुत समय बचा सकते हैं (नीचे देखें)

final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y

double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time

यदि आप प्रदर्शन के लिए बेताब हैं, तो आप 0.5 * g को भी रोक सकते हैं, लेकिन उपरोक्त कोड आपको 90% तक ले जाएगा, बिना कुछ पागल किए। यदि आप चाहें तो बेंचमार्क 10 मिलियन बार कर रहे हैं, यह वास्तव में समय की एक बड़ी राशि नहीं है, लेकिन प्रतिशत-वार यह बहुत बड़ा है - पुस्तकालयों जावा में बहुत धीमी हैं

तो, यदि आप कोण चाहते थे जिस पर तीर जाना चाहिए, तो आप क्या चाहते हैं

atan(dy/dx)

और इस मामले में, यह काम करेगा क्योंकि dx एक स्थिर है। लेकिन सामान्य तौर पर, dx शून्य हो सकता है, इसलिए आप आमतौर पर उपयोग करना चाहते हैं:

atan2(dy, dx)

जो इस कार्य के लिए विशेष रूप से डिज़ाइन किया गया एक फ़ंक्शन है।

लेकिन जैसा कि मैंने कहा, जावा में लाइब्रेरी फ़ंक्शंस छिपे हुए धीमी गति से होते हैं, और इस मामले में ऊपर @FxIII द्वारा आबंटित किए बिना इसे करने का एक बेहतर तरीका है।

यदि क्षैतिज वेग हमेशा v0x है, और ऊर्ध्वाधर वेग है:

double vy = v0y - 0.5 * g * time;

फिर आपका डेल्टा है: vx, vy

आपको कोण की आवश्यकता नहीं है। यदि आप एक तीर खींचना चाहते हैं, तो नाममात्र का उपयोग करें:

प्लॉट (x, y, x + vx, y + vy);

मुझे नहीं पता कि आप क्या ड्राइंग कर रहे हैं, इसलिए यदि आपको इसे घुमाने के लिए कोण की आवश्यकता है (जैसे आप JOGL का उपयोग कर रहे हैं) तो निश्चित रूप से, कोण का उपयोग करें।

यदि आप कोण को वापस डिग्री में बदलने के लिए opengl का उपयोग कर रहे हैं, तो यह न भूलें कि ATAN2 रिटर्न रेडियंस:

final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;

2

तनह () (हाइपरबोलिक स्पर्शरेखा ) एक कोण को एक पैरामीटर के रूप में लेता है, लेकिन आपने इसे पक्षों के अनुपात में खिलाया है।

आप वास्तव में जो चाहते हैं वह हाइपरबोलिक आर्कटिक का उपयोग करना है , जो एक पैरामीटर के रूप में पक्षों के अनुपात को लेता है, और कोण लौटाता है। (इस पर नामकरण "अतनह", "अतनह 2", "अर्चनह" या कुछ और इसी तरह का हो सकता है; विभिन्न गणित पुस्तकालयों के बीच बहुत अंतर प्रतीत होता है)


नहीं, आप हाइपरबोलिक कुछ भी नहीं चाहते हैं
डॉव

जी, आप बिलकुल सही कह रहे हैं। मैंने तुरंत "मूल त्रिकोणमिति के उपयोग" त्रुटि पर उठाया, और याद किया कि वह जिस फ़ंक्शन का उपयोग कर रहा था वह उसके बाकी के दृष्टिकोण के लिए पूरी तरह से गलत था।
ट्रेवर पावेल

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