2012-12-23 11 views
5

मैं एक "डंपिंग" संपत्ति का उपयोग करके, किसी ऑब्जेक्ट की गति को धीरे-धीरे कम करने की कोशिश कर रहा हूं। उसके बाद, मैं वेग का उपयोग कर ऑब्जेक्ट की स्थिति को स्थानांतरित करना चाहता हूं। यह इस तरह दिखता है:डेल्टाटाइम के साथ गति को कम करना?

velocity.x *= velocity.damping; 
velocity.y *= velocity.damping; 
x += velocity.x; 
y += velocity.y; 

नहीं कर सके कि तुलना में बहुत सरल हो सकता है और यह ठीक काम करता है, लेकिन यहाँ है मेरी समस्या: मैं एक deltaTime चर, कि (सेकंड में) समय की मात्रा में होता है उपयोग कर रहा हूँ , कि मेरे गेम-लूप का अंतिम अपडेट लिया गया। वेग को लागू करने के लिए पर्याप्त आसान है:

x += velocity.x * deltaTime; 
y += velocity.y * deltaTime; 

लेकिन मैं deltaTime के लिए खाते में कैसे जब मैं उदासीनता संपत्ति गुणा कर सकते हैं? मेरा विचार था, एक्स या y में विस्थापन का पता लगाने और उस के लिए deltaTime गुणा, इस तरह के:

velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 
velocity.y += (velocity.y * velocity.damping - velocity.y) * deltaTime; 

बाहर कर देता है कि काम नहीं करता। मैं वास्तव में समझ में नहीं आता क्यों, लेकिन जब मैं इसका परीक्षण करता हूं तो मुझे अलग-अलग परिणाम मिलते रहते हैं। अगर मैं बस डंपिंग को अनदेखा करता हूं या इसे 1.0 पर सेट करता हूं, तो सबकुछ काम करता है, इसलिए समस्या पिछले दो पंक्तियों में होनी चाहिए।

+0

आप अंतिम कोड सेगमेंट में वेग को क्यों कम कर रहे हैं? – Matthias

+0

(velocity.x * velocity.damping) नया velocity.x है। अंतर प्राप्त करने के लिए, मैं उस से मूल velocity.x घटाता हूं। स्पष्टीकरण के लिए – user1925315

उत्तर

8
velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 

इसका मतलब है कि आपके पास लगातार त्वरण होता है, न कि धुंधला होता है।

velocity.x * (1 - velocity.damping) 

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

मान लें कि 0.9 का एक धुंधला कारक मान लें, ताकि आप प्रत्येक बार इकाई में दसवें स्थान की गति को कम कर सकें। यदि आप रैखिक सूत्र का उपयोग करते हैं (deltaTime के साथ गुणा करें), 10 समय इकाइयों के बाद आपका वेग 0 हो जाएगा, और 11 के बाद, यह दिशा बदल जाएगा। आप चरणबद्ध जाते हैं, v_0 = 1 के एक प्रारंभिक वेग से शुरू, आप

v_1 = v_0*0.9 = 0.9 
v_2 = v_1*0.9 = 0.81 
v_3 = v_2*0.9 = 0.729 
v_4 = v_3*0.9 = 0.6561 

आदि, वेग की एक धीमी कमी मिल चाहते हैं। आप v_4 के लिए सूत्र प्रकट हैं, तो आप

v_4 = v_3*0.9 = v_2*0.9*0.9 = v_1*0.9*0.9*0.9 = v_0*0.9*0.9*0.9*0.9 = v_0 * 0.9^4 

तो मिलता है, generalising, आप देखते हैं कि सूत्र होना चाहिए

velocity.x *= Math.pow(velocity.damping, deltaTime); 

(कार्रवाई स्क्रिप्ट मान लिया जाये कि क्या है कि समारोह में ECMA स्क्रिप्ट से अलग नहीं है कहा जाता है।)

इसी तरह velocity.y पाठ्यक्रम के लिए।

+1

धन्यवाद। सही समझ में आता है! :) – user1925315

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