2011-08-10 19 views
8

मैं एक मुक्त गिरावट और जमीन के साथ टकराव अनुकरण करना चाहता हूं (उदाहरण के लिए एक बाउंसिंग बॉल)। वस्तु एक वैक्यूम में गिर जाएगी - एक हवा प्रतिरोध छोड़ा जा सकता है। जमीन के साथ टक्कर से कुछ ऊर्जा हानि होनी चाहिए ताकि अंत में वस्तु आगे बढ़ना बंद कर दे। मैं जॉयएल का उपयोग उस बिंदु को प्रस्तुत करने के लिए करता हूं जो मेरी गिरती वस्तु है। एक गुरुत्वाकर्षण स्थिर है (-9.8 मीटर/एस^2)।गुरुत्वाकर्षण सिमुलेशन

deltaTime = currentTime - previousTime; 
vel += acc * deltaTime; 
pos += vel * deltaTime; 

लेकिन मैं कर रहा हूँ कुछ गलत:

मैं बिंदु की एक नई स्थिति की गणना करने के लिए एक यूलर विधि पाया। बिंदु कुछ बार उछालता है और फिर यह नीचे जा रहा है (बहुत धीमी)।

display() 
{ 
    calculateDeltaTime(); 
    velocity.y += gravity * deltaTime; 
    pos.y += velocity.y * deltaTime; 

    if(pos.y < -2.0f) //a collision with the ground 
    { 
     velocity.y = velocity.y * energyLoss * -1.0f; 
    } 

} 

:

यहाँ एक स्यूडोकोड (प्रारंभिक स्थिति = (0.0f, 2.0f, 0.0f), प्रारंभिक वेल (0.0f, 0.0f, 0.0f), गुरुत्वाकर्षण = -9.8f) है यथार्थवादी प्रभाव प्राप्त करने का सबसे अच्छा तरीका क्या है? यूलर विधि निरंतर त्वरण समीकरणों का संदर्भ कैसे देती है?

+0

क्या होता है यदि आप केवल समीकरण से ऊर्जा हानि लेते हैं? – redbmk

+0

योचई के उत्तर के अलावा, आप क्लिपिंग त्रुटियों से बचने के लिए अपने टक्कर के मामले में 'pos.y' को ग्राउंड लेवल पर सेट करने पर विचार कर सकते हैं –

+0

ऊर्जा हानि के बिना बिंदु कुछ समय के बाद भी उछाल बंद कर देता है और यह बहुत धीमा हो रहा है। – Vert

उत्तर

6

क्योंकि फ़्लोटिंग पॉइंट अच्छी तरह से गोल नहीं होते हैं, तो आप कभी भी एक वेग नहीं प्राप्त करेंगे जो वास्तव में 0 है। आपको शायद -0.00000000000001 या कुछ ऐसा मिलता है।

आपको इसे बंद करने के लिए इसे 0.0 बनाने की आवश्यकता है। (कुछ डेल्टा परिभाषित करते हैं।)

2

ऊपर मेरी टिप्पणी पर विस्तार करने के लिए, और Tobias जवाब देने के लिए, मैं यहाँ एक पूरा जवाब जोड़ देंगे।

प्रारंभिक निरीक्षण पर, मैंने निर्धारित किया कि आप तेजी से वेग से खून बह रहे थे। सीधे शब्दों में कहें, गतिज ऊर्जा और वेग के बीच के रिश्ते E = m v^2 /2 है, इसलिए वेग के संबंध में व्युत्पन्न लेने के बाद आप

delta_E = m v delta_v 

तब मिलता है, energyloss कैसे परिभाषित किया गया है के आधार पर आप delta_E और energyloss के बीच संबंध स्थापित कर सकते हैं। उदाहरण के लिए, ज्यादातर मामलों energyloss = delta_E/E_initial में, फिर ऊपर संबंध

delta_v = energyloss*v_initial/2 

यह मानते हुए है जो उस समय अंतराल छोटे आप v_initial साथ पहले समीकरण में v को बदलने के लिए अनुमति देता है के रूप में सरल किया जा सकता है, तो आप में सक्षम होना चाहिए अपने काम के लिए इसके साथ दूर हो जाओ। स्पष्ट होने के लिए, delta_v आपके टकराव ब्लॉक के अंदर velocity.y से घटाया गया है जो आपके पास है।

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

difference in time with and without air-drag vs. drop height

कम ऊर्जा नुकसान सामग्री (80 के लिए - 90 + % ऊर्जा बरकरार रखी गई), मैं इसे 10 मीटर, और उच्च, ड्रॉप ऊंचाई में जोड़ने पर विचार करता हूं। लेकिन, यदि बूंदें 2 - 3 मीटर से कम हैं, तो मैं परेशान नहीं होगा।

यदि कोई गणना चाहता है, तो मैं उन्हें साझा करूंगा।

+0

+1 इस उत्तर के लिए धन्यवाद। मुझे लगता है कि यह भी एक अच्छा समाधान है। वर्ट के मूल टकराव के कार्यान्वयन के विपरीत आपका "नरम" टकराव के लिए है जहां शरीर फर्श के साथ टकराता है और वहां आराम करता है (शायद एक तकिया की तरह) जबकि वर्ट का संस्करण एक हानिकारक उछाल है। चुनने के लिए कौन सा भौतिक व्यवहार वांछित पर निर्भर करता है। और आप सही हैं, हवा घर्षण समेत अधिक होगा। –

+0

@ टोबियास, यह एक हानिकारक बाउंस भी है, जो बाउंस का थोड़ा सा नरम है। – rcollyer

+0

@ वर्ट, मैंने इसे पोस्ट करते समय कभी नहीं देखा, लेकिन मैंने 'delta_v' के लिए अपने परिणाम से 'energyloss' गिरा दिया। यह अभी तय है। – rcollyer

संबंधित मुद्दे