अपनी गति बढ़ने पर कम वेग खोने के लिए वस्तु कैसे प्राप्त करें


11

मैं फ्लैश में एक गेम विकसित कर रहा हूं और मुझे थोड़ी मदद की जरूरत है। इसे गणित की समस्या माना जा सकता है।

मेरी वस्तु गति से उड़ रही है Xऔर मेरी वस्तु पत्थरों से टकरा सकती है। जब यह एक पत्थर से टकराता है, तो मुझे पत्थर को तोड़ने और जारी रखने के लिए मेरी वस्तु की आवश्यकता होती है, लेकिन कम वेग के साथ। इसे कठिन-कोड करना आसान है और कुछ लिखना है: myVelocity -= 10;लेकिन मेरी मुख्य समस्या यह है कि मैं चाहता हूं कि यह कम वेग खो दे , प्रारंभिक वेग जितना अधिक होता है।

उदाहरण के लिए: यदि वेग 300 है तो मैं चाहता हूं कि यह 10 से खो जाए और यदि यह 200 था तो मैं चाहता हूं कि यह 20 से हार जाए।

क्या यह किसी तरह के फॉर्मूले के साथ किया जा सकता है?


1
कैसे के बारे में कुछ सरल की तरह log(myVelocity + 1) * N?
जोनाथन कोनेल

जवाबों:


6

मैं आपकी गति को उलटा करूँगा और आपके द्वारा पसंद की जाने वाली चीज़ों से गुणा करूँगा:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

यह उदाहरण देता है ये प्रभाव:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"बहाली" क्या है?
jprete

बहाली उछल रही है। जो यथार्थवादी है।
मार्टिग्न कोर्टको

30

उन प्रणाली को आप और अन्य लोग वर्णन करते हैं जो वास्तविक दिखने वाले भौतिकी को उत्पन्न नहीं करेंगे। जब भी वस्तु कहीं टकराती है, तो मुख्य सूत्र 0.5 * m * v ^ 2 (गतिज ऊर्जा) को निरंतर मूल्य से कम करना है।

इसलिए अगर वज़न के साथ कोई वस्तु 2Kg को ब्लॉक कर देती है, जिसे तोड़ने से पहले 16j ऊर्जा की आवश्यकता होती है: ऑब्जेक्ट की गति इस तालिका के अनुसार बदल जाएगी:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
इसे स्वीकार किया जाना चाहिए - यह सही, यथार्थवादी, लागू करने में आसान है, और ऑब्जेक्ट के सभी मामलों को संभाल लेगा और द्रव्यमान और वेग को अवरुद्ध करेगा।
टेस्सेरेक्स

3
जब तक आपके पास एक विशिष्ट 'कार्टून भौतिकी' प्रभाव नहीं होता जिसे आप प्राप्त करना चाहते हैं, अधिक यथार्थवादी प्रणाली के साथ जाना लगभग हमेशा एक अच्छा विचार है; यह सुनिश्चित करने के लिए कुछ बेहतर तरीके हैं कि आपको संभावित इंजन-ब्रेकिंग एज मामले नहीं मिलेंगे।
स्टीवन स्टडनिक

1
यह उत्तर अच्छा था, मुझे पता है। लेकिन मेरा खेल एक कार्टून की दुनिया में सेट है और इसे यथार्थवादी होने की आवश्यकता नहीं है। प्रश्न पूछते समय मुझे अधिक विशिष्ट होना चाहिए।
अफरा

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

1
@ रीचर्ड दूसरा उपाय हैक नहीं है क्योंकि यह यथार्थवादी भौतिकी का उपयोग नहीं करता है, क्या Tetris हैकी है क्योंकि ब्लॉक आसानी से नहीं गिरते हैं? यदि लोग मान लेते हैं कि एक स्वीकृत उत्तर 'बेहतर' है, तो यह मानने के बजाय कि यह उत्तर पूछने वाले को संतुष्ट करता है, यह उनकी गलती है। सभी जवाब और वोट अभी भी स्पष्ट हैं।
सिस्कोआईपीपोन

2

आपको वास्तव में यह बताने के लिए पर्याप्त जानकारी नहीं दी गई है कि आप किस प्रकार की सीमा चाहते हैं, अर्थात क्या यह छाया हुआ है, क्या आप ज्यामितीय प्रगति चाहते हैं, आदि।

पहली चीज जो आप करना चाहते हैं, वह है कि आप जिस गति को खोना चाहते हैं, उसकी संख्या के अनुपात में एक संख्या है (यह उतना ही नहीं है, लेकिन इसे घटाना चाहिए क्योंकि यह गति आपके नुकसान के आनुपातिक बनाने के लिए बढ़ जाती है)। मानक तरीका यह है कि पारस्परिक लेना है :

temp = 1 / currentVelocity;

अब, 100 के लिए आपके पास 0.01, 200 के लिए आपके पास 0.005, 300 के लिए आपके पास 0.0033 और इतने पर होंगे।

अब आपको बस उस नंबर को समायोजित करने की आवश्यकता है जो आप वास्तव में चाहते हैं, इसे गुणा करके। इसलिए

k = 3000;
newVelocity = temp * k;

आपको 300 के लिए अपना 20 देगा, लेकिन यह आपको 10. के बजाय 200 के लिए 15 देगा। यह आपके लिए ठीक हो सकता है, उस स्थिति में आपको आगे पढ़ने की आवश्यकता नहीं है। आप अपनी इच्छानुसार कश्मीर को समायोजित कर सकते हैं लेकिन आपको संख्याएँ तब तक नहीं मिल सकती हैं जब तक आप उन्हें पसंद नहीं करते हैं जब तक कि आप थोड़ा अधिक नहीं करते हैं, जैसे कि ज्यामितीय प्रगति को लागू करना, या वृद्धि के लिए आधार को बदलना। मैं यहाँ ज्यामितीय प्रगति में नहीं जा रहा हूँ, लेकिन यदि आप आधार बदलना चाहते हैं, तो आप इसे निम्नानुसार करते हैं:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

यह आपको आपके सवाल के मूल रूप से आपके द्वारा पूछे गए रेंज के साथ प्रदान करेगा, 300 -> 10 का नुकसान, 200 -> 20 का नुकसान। FYI करें 100 -> 40 का नुकसान, और 50 -> 80 का नुकसान (!) जिसका अर्थ है आप अपने घटाव को प्रतिबंधित करने की आवश्यकता है - जो मैंने लाइनों (1) और (2) में किया है।

इस पूरी समस्या से निपटने के अन्य तरीके भी हैं, निश्चित रूप से, मुझे यकीन है कि मैं की तुलना में उन गणितीय रूप से अधिक अनुकूल हूं, यहां पोस्ट करूंगा।


0

मुझे लगता है, आप बस सरल विभाजन का उपयोग वेग से कर सकते हैं। उदाहरण के लिए: खो दिया है = 3 000 / मायवेलेन्स। जब वेग 300 होता है, तो आप 10 खो देंगे, जब यह 200 होगा, तो आप खो देंगे 15. यह सही स्थिरांक चुनने के लिए आप पर निर्भर है।

यदि आप चाहें, तो आप अधिक जटिल सूत्र का उपयोग कर सकते हैं, जैसे: स्थिर / (स्थिरांक * वेग ^ 2 + स्थिर 3 * वेग)। फिर से - बस स्थिरांक चुनें, जो आपके अनुरूप होगा।


यह पूरी तरह से उलट है कि उसने क्या पूछा और वास्तविक भौतिकी में क्या होता है।
अली

मैं तुम्हें नहीं समझता। क्या उलटा हुआ है?
zacharmarz

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