गिरने और तेज वेग की गणना कैसे करें?


9

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

जवाबों:


28

सबसे सरल तरीका ईयूल एकीकरण है। आपको स्थिति वेक्टर और वेग वेक्टर संग्रहीत करना होगा। प्रत्येक फ्रेम में:

  • अंतिम एकीकरण चरण के बाद से पारित समय को मापें: dt
  • अपने इंजनों की वजह से बल वॉक की गणना करें: एफ
  • त्वरण वेक्टर की गणना करें: A = F / m जहां m स्पेसशिप मास है।
  • गुरुत्वाकर्षण सदिश जोड़ें: A = A + G यह सुनिश्चित करता है कि G ग्रह के केंद्र की ओर इंगित करता है
  • वेग वेक्टर V = V + A · dt को अपडेट करें
  • स्थिति सदिश X = X + V · dt को अपडेट करें

( एक्स स्कार्स के लिए एक्स , वैक्टर के लिए एक्स )

यकीन है कि डीटी छोटा है ...

| जी | पृथ्वी के लिए लगभग 9.8 m / s² और चंद्रमा के लिए लगभग 1.6 m / s moon है

सामान्य तौर पर गुरुत्वाकर्षण बल के कारण सक्रियता बल है:

सार्वभौमिक गुरुत्वाकर्षण का न्यूटन का नियम

यह प्रत्येक शरीर को प्रभावित करता है और यह दूसरे की ओर इशारा करता है।

जी अदिश बहुत प्रसिद्ध है गुरुत्वाकर्षण स्थिरांक इसके बारे में 6.67e-011 N (एम / किलोग्राम) है ²

चूंकि आप त्वरण में रुचि रखते हैं:

त्वरण

आपको केवल अपने त्वरण की गणना करने के लिए ग्रह के द्रव्यमान (एम 2) और त्रिज्या (आर) को जानना होगा।

आमतौर पर त्वरण जो ग्रह को आपके अंतरिक्ष यान की ओर ले जाता है, वह नगण्य है क्योंकि आमतौर पर एम 1 एम 2 की तुलना में नगण्य है।

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

संपादित करें:

जैसा कि कार्यान्वयन पर कुछ संकेत चाहिए। आपको चाहिये होगा:

  • एक वेक्टर लाइब्रेरी
  • इंजन का मॉडल
  • फिजिक्स मॉडल
  • टक्कर की पहचान हुई है
  • यूजर इंटरफेस (इनपुट और ग्राफिक रेंडरिंग)

सबसे पहले वेक्टर लाइब्रेरी: आपका गेम मोनो / बाय / ट्री / फोर ... डायमेंशनल हो सकता है, जहां तक ​​आप अपने मामले को 3 डी शब्द, फिजिकल रूल्स होल्ड का प्रोजेक्शन मानते हैं।

यदि n आपके द्वारा चुने गए आयाम (शायद आपके मामले में 2 या 3) है, तो पुस्तकालय में होना चाहिए:

  • वेक्टर भंडारण इकाई (प्रत्येक वेक्टर के लिए एन फ्लोटिंग पॉइंट नंबरों की एक सूची)
  • एक राशि ऑपरेटर (घटक द्वारा योग घटक)
  • एक स्केलर गुणन ऑपरेटर (प्रत्येक घटक एक फ्लोट द्वारा गुणा किया जाता है)
  • वैक्टर के बीच एक डॉट-गुणा (घटक द्वारा घटक को गुणा करें और सभी को योग करें)
  • सदिश लंबाई (एक सदिश बिंदु का वर्गमुटी-स्वयं द्वारा गुणा)

आप एक पुस्तकालय का उपयोग कर सकते हैं जो ऐसा करता है या अपने आप से एक को लागू करता है; एक वेक्टर एक संरचना या एक वर्ग हो सकता है, चुनाव आपका है।

प्रत्येक इंजन द्वारा वर्णित किया जाना चाहिए:

  • एक वेक्टर अपनी जोर शक्ति और दिशा को दर्शाता है
  • एक स्केलर जो पूर्ण शक्ति पर होने पर प्रति सेकंड ईंधन उपयोग को इंगित करता है;

आपके उपयोगकर्ता इनपुट का उपयोग प्रत्येक इंजन को एक नंबर प्रदान करने के लिए किया जाएगा जो 0 (अप्रयुक्त इंजन) और 1 (पूर्ण शक्ति) के बीच होगा: इंजन (उपयोग) कारक।

इंजन के वास्तविक विश्वास को प्राप्त करने और सभी उपलब्ध इंजनों के सभी परिणामों को प्राप्त करने के लिए अपने जोर वेक्टर के लिए इंजन कारक को गुणा करें; यह आपको दूसरे चरण का F देगा ।

आपके इंजन कारक का उपयोग प्रत्येक इंजन के लिए वास्तविक ईंधन उपयोग को जानने के लिए किया जा सकता है: ईंधन के उपयोग से इंजन का गुणन और dt द्वारा तात्कालिक ईंधन उपयोग को जानने के लिए; आप इस मूल्य को कुल ईंधन क्षमता चर से हटा सकते हैं (यह आपको ईंधन द्रव्यमान के काफी होने पर अपने कुल द्रव्यमान m को अद्यतन करने का अवसर देता है)।

अब आप नई स्थिति की गणना करने के लिए एकीकरण का उपयोग करके आगे बढ़ सकते हैं, अपने ग्रह की सतह के साथ टकराव की जांच कर सकते हैं; यदि कोई हो, तो लैंडिंग वेक्टर की लंबाई का उपयोग यह कहने के लिए करें कि क्या लैंडिंग एक सफलता या आपदा थी।

जाहिर है कि अन्य टकराव की जांच की जा सकती है / होनी चाहिए, कुछ सतह संस्थाओं को लैंडिंग बिंदु के रूप में अनुमति नहीं दी जा सकती है, इसलिए हर टक्कर एक घातक है।

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


यह बहुत अच्छा है, लेकिन कुछ विचारों को कोड में कैसे लागू किया जाए, यह बहुत अच्छा होगा।
डिवॉले

1
जहाँ मैंने भौतिकी सीखी shiffman.net/teaching/nature
मिंग-तांग

यह आदमी अपने भौतिकी जानता है!
एमजीजेरो

7

जैसा कि अन्य उत्कृष्ट जवाब थोड़ा सैद्धांतिक लगता है, यहाँ सरल कोड संस्करण है:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}

2
इसे सरल रखना। मुझे उम्मीद है कि यह उन बातों के साथ है जो वह खोज रहा था।
बेस्का

2

दुर्भाग्य से, यहाँ गणित बालों वाला हो जाता है। FxIII का उत्तर गिरने वाली वस्तु के सामान्य मामले के लिए ठीक है लेकिन आप एक रॉकेट के बारे में बात कर रहे हैं - और रॉकेट ईंधन से जलते हैं।

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


ईंधन से बाहर जाना बस एक गिरते हुए पैरामीटर का प्रतिनिधित्व करता है। यह केवल घटते मूल्य के साथ एक सदिश बल है। क्या मै गलत हु? एक साधारण मामले में आपके पास G के विपरीत F है, जहाँ F रॉकेट का इंजन है और G पृथ्वी का गुरुत्वाकर्षण है: इस मामले में आपको बस दोनों को एक दूसरे के विरुद्ध मापना है, इसलिए यदि कोई ईंधन शेष न हो तो F 0 पर गिर जाता है अपनी वस्तु के लिए जी को वेक्टर बल के रूप में लागू करना होगा। एफ के हर मूल्य के लिए काम करता है। जब तक एफ> = जी वस्तु "एफ की दिशा में आगे बढ़ना चाहिए"
डेमनोफायर 300

2
@ daemonfire300: आप गलत समझ रहे हैं - मैं ईंधन से बाहर चलने के प्रभाव के बारे में बात नहीं कर रहा हूं, लेकिन ईंधन जलाने का प्रभाव। आपके इंजन पर एक निरंतर थ्रॉटल सेटिंग एक निरंतर चढ़ाई त्वरण आंकड़ा पैदा करता है, एक निरंतर त्वरण एक निरंतर घटती ईंधन जलने की दर का उत्पादन करता है। इसका मतलब है कि FxIII जो सरल गणना करता है, वह गलत ईंधन उपयोग संख्याओं का उत्पादन करेगा।
लोरेन Pechtel

ए = एफ / एम से त्वरण लाभ की मात्रा के रूप में ईंधन जला दिया जाता है एक नगण्य मूल्य होने जा रहा है जब तक कि वाहन के लिए ईंधन द्रव्यमान का अनुपात बेतुका उच्च या ईंधन जला दर समान रूप से अधिक नहीं होता है। यह एक खेल है, सब के बाद।
पैट्रिक ह्यूजेस

@ पैट्रिक ह्यूजेस: किसी भी सच्चे रॉकेट लैंडर (मैं मंगल एरोब्रेक / रॉकेट हाइब्रिड मामलों की गिनती नहीं कर रहा हूं) द्वारा किए गए ईंधन की मात्रा कुल वजन का एक बड़ा हिस्सा है। ईंधन को मानते हुए: त्वरण अनुपात को ठीक किया जाना बहुत गलत उत्तर देगा।
लोरेन Pechtel

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