प्लेयर ऑब्जेक्ट्स के साथ काम करते समय मुझे वेग बनाम एडफ़ोर्स का उपयोग कब करना चाहिए?


18

मैं एकता ढांचे में इन दो तरीकों के बारे में उलझन में हूं। दोनों ही खिलाड़ी को वस्तु की चाल, रुकने, बदलने की दिशा इत्यादि बनाते हैं, जब एक को दूसरे पर इस्तेमाल किया जाना चाहिए और एक को कब उपयुक्त होना चाहिए?



@ बाइट 56 दोनों सवाल अलग-अलग चीजों के बारे में पूछ रहे हैं
रॉबर्ट

1
अलग, लेकिन संबंधित। इसलिए वे केवल लिंक किए गए हैं और डुप्लिकेट नहीं हैं। दिखाएँ यह दाईं ओर लिंक किए गए कॉलम में दिखाई देता है।
MichaelHouse

जवाबों:


13

आप velocityएक स्थिर दर (उदाहरण के लिए एक बुलेट) पर ऑब्जेक्ट को स्थानांतरित करने और AddForce()आंदोलन को जोड़ने के लिए उपयोग करेंगे (उदाहरण के लिए एक स्पेसशिप थ्रस्टर)। यह भी ध्यान दें कि आंदोलन के दो "प्रकार" हैं; बल और आवेग। एक अंतरिक्ष यान के लिए आप आवेग का उपयोग करेंगे।


4
क्या आप बता सकते हैं कि आप स्पेसशिप थ्रस्टर के लिए आवेग क्यों पसंद करेंगे? यह वास्तव में एक गैर-आदर्श फिट हो सकता है यदि आप समय के साथ क्रमिक त्वरण को लागू कर रहे हैं, बजाय हथियार के प्रभावों जैसी चीजों के कारण गति में तात्कालिक परिवर्तन। आप आम तौर पर बल चाहता हूँ, जबकि तत्क्षण आप आवेग का उपयोग करेंगे (या त्वरण यदि आप बड़े पैमाने पर एक कारक हो नहीं करना चाहती) एक समय खिड़की पर लागू (या, तदनुसार, velocityChange)
DMGregory

@DMGregory हाँ, यह इस बात पर निर्भर करता है कि आप किस प्रकार का बल जोड़ना चाहते हैं। स्पेसशिप थ्रस्टर के मेरे उदाहरण में, जो ऊर्जा का एक क्षणिक फट है तो आवेग सही विकल्प है।
ट्रोजनफॉ

2
यह तुरंत स्पष्ट नहीं था कि क्या आपका मतलब एक रवैये वाले जेट की छोटी गोलीबारी या मुख्य इंजन के निरंतर जलने ("थ्रस्टर" का उपयोग कई बार विज्ञान-फाई में उदारतापूर्वक किया जाता है), इसलिए मैंने सोचा कि मुझे यह स्पष्ट करना चाहिए कि कोई व्यक्ति कोशिश करे रॉकेट बूस्टर के लिए आवेगों का उपयोग करना। ;)
DMGregory

@DMGregory वास्तव में; मेरी स्पेस टेक शब्दावली काफी हद तक फिल्मों पर आधारित है :)
ट्रोजनफ़े

@trojanfoe गो KSP खेलते हैं। अभी की तरह।
user253751

21

हालाँकि पहले से ही एक स्वीकृत उत्तर है, मुझे लगता है कि कुछ अतिरिक्त विवरण हैं जो कवर करने लायक हैं।

वेग का उपयोग करना

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

  • यदि कई स्रोत / स्क्रिप्ट उसी Rigidbody के वेग को सीधे (यानी body.velocity = foo) सेट करके संशोधित करने का प्रयास करते हैं , तो जो भी अंतिम जीत हासिल करता है, और दूसरों पर शून्य प्रभाव पड़ता है। यह अपडेट बग के आदेश को जन्म दे सकता है, विशेष रूप से संस्थाओं को मँडरा या धीरे-धीरे गिरने के कारण (क्योंकि गुरुत्वाकर्षण के कारण नीचे त्वरण जमा हो सकता है इससे पहले कि यह जम जाए)

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

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

AddForce और मित्र

इसके विपरीत, AddForce और इसी तरह के सहायक कार्यों को भौतिकी की दुनिया में चल रही हर चीज के साथ सहयोग करने के लिए बनाया गया है। यदि कई स्रोत / लिपियाँ AddForce एक Rigidbody के लिए हैं, तो उन सभी प्रभावों को एक साथ जोड़ा जाता है ताकि ऑब्जेक्ट की गति में शुद्ध परिवर्तन हो सके (जो कि इसकी गणना कैसे की जाती है, इसके आधार पर भी ऑर्डर-स्वतंत्र हो सकता है)। यह एक स्क्रिप्ट को पूरी तरह से कुछ अन्य भौतिकी प्रभाव से पेट भरने में मदद करता है।

AddForce वैकल्पिक फ्लेमोड पैरामीटर निर्दिष्ट करके चार स्वादों में आता है , जो विभिन्न चीजों के लिए उपयोगी होते हैं:

ForceMode       |   Use
-----------------------------------------------------------------------
Force (default) |   Accelerate an object over 1 time step, based on its mass.
                |   Units: Newtons = kg * m/s^2
                |
Acceleration    |   Accelerate an object over 1 time step, ignoring its mass. (like gravity)
                |   Units: m/s^2
                |
Impulse         |   Instantaneously propel an object, based on its mass
                |   Units: N * s = kg * m/s
                |
VelocityChange  |   Instantaneously propel an object, ignoring its mass
                |   (like body.velocity = foo, except multiple scripts can stack)
                |   Units:  m/s

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

यदि आप गति में अचानक, तेज बदलाव की शूटिंग कर रहे हैं, जैसे कि गोली चलाना, विस्फोट से फिर से गिरना, या किसी अवरोध से उछलना, तो आप अधिक संभावना इम्पल्स या वेलोस चेंज चाहते हैं।

AddForce का उपयोग करने से आपको अधिक भौतिक यथार्थवाद प्राप्त करने में मदद मिलती है, लेकिन यह भी आवश्यक हो सकता है कि आप अपने व्यवहार के भौतिकी के माध्यम से सोचने में अधिक समय व्यतीत करें। उदाहरण के लिए, यदि आप चाहते हैं कि आपके शरीर में लक्ष्य की गति तक सीमित त्वरण हो, ताकि यह हर फ्रेम को स्थापित करने की तुलना में टकराव के लिए अधिक वास्तविक रूप से प्रतिक्रिया दे, तो आप संभवतः इस सहायक फ़ंक्शन के समान गणना चाहते हैं:

public static void AccelerateTo(this Rigidbody body, Vector3 targetVelocity, float maxAccel)
{
    Vector3 deltaV = targetVelocity - body.velocity;
    Vector3 accel = deltaV/Time.deltaTime;

    if(accel.sqrMagnitude > maxAccel * maxAccel)
        accel = accel.normalized * maxAccel;

    body.AddForce(accel, ForceMode.Acceleration);
}

इन सभी "हेल्पर फ़ंक्शंस" को कॉल करने का कारण यह है कि तकनीकी रूप से आप सभी समान सिरों को प्राप्त कर सकते हैं:

 body.velocity += suitablyCalculatedDeltaV;

( मुझे लगता है कि यह संभव है कि यूनिटी की PhysX / Box2D- आधारित भौतिकी सॉल्वर अलग-अलग AddForce के माध्यम से बदल जाए, लेकिन मैंने इसके स्पष्ट परिणाम नहीं देखे हैं)

इसलिए दिन के अंत में, इन कार्यों से हमें वास्तव में क्या प्राप्त होता है, यह इरादे की स्पष्टता है । जब मैं एक क्रमिक बल लागू करना चाहता हूं, मुझे अपने डेल्टा को Time.deltaTime द्वारा गुणा करने और द्रव्यमान से विभाजित करने के लिए याद रखने की आवश्यकता नहीं है, मैं बस कहता हूं कि मैं ForceMode.Force चाहता हूं और इसे सही और सुसंगत तरीके से नियंत्रित किया जाता है। और जब मैं या कोई और बाद में अपने कोड पर पुनरावृति करने के लिए आता है, तो यह तुरंत स्पष्ट हो जाता है कि मेरा क्या मतलब है, इसे पता लगाने के लिए समय और बड़े पैमाने पर गणना को डिकोड किए बिना।


6

ट्रोजनफू के जवाब के अलावा , एंग्री बर्ड्स बनाम कार रेसिंग। इन विधियों के दो प्रमुख और अलग-अलग उदाहरण ( AddForceऔर velocityक्रमशः)। उदाहरण के लिए, एंग्री बर्ड्स में वेग का उपयोग थोड़ा अधिक मुश्किल है क्योंकि आपको प्रोजेक्टाइल प्रक्षेपवक्र को अपने स्वयं के द्वारा सेट करना होगा, जैसे,

जब मैं गुस्से में पक्षियों में AddForce का उपयोग करता हूं, तो मैं उपयोग करूंगा,

_birdRigidbody.AddForce(new Vector2(5,5));

जब मैं वेग का उपयोग करता हूं तब मैं प्रक्षेपवक्र का उपयोग कर संभालता हूं

x = v*t*Cos(theta) y = v*t*Sin(theta) - 0.5 * g * t *t

या इस तरह का कुछ।

जबकि कार रेसिंग गेम में आपको हर समय गति को नियंत्रित करना होगा, न कि एंग्री बर्ड्स यानी शूट और सभी। तो उस परिदृश्य में हैंडल velocityकी तुलना में अधिक उपयोगी है AddForce

उम्मीद है आप समझ गए होंगे। कम से कम थोड़ा सा।


1
आपके एंग्रीबर्ड्स उदाहरण को संभवतः गति में एक तात्कालिक परिवर्तन का उपयोग करना चाहिए (जैसे। आवेग या वेग-परिवर्तन) जब स्लिंगशॉट जारी किया जाता है, बजाय डिफ़ॉल्ट ForceMode.Force की तुलना में जो एक समय खिड़की पर इसके प्रभाव का अनुकरण करता है। आप समान दृष्टिकोण से समान व्यवहार प्राप्त करने के लिए संख्याओं को ट्यून कर सकते हैं, लेकिन यदि आप अपना निश्चित समय बदलते हैं तो बल समाधान का एक अलग आउटपुट होगा (क्योंकि यह अधिक लंबे या छोटे समय अंतराल पर बल को एकीकृत कर रहा है) जबकि आवेग समान रहता है वांछित, क्योंकि यह रिलीज के क्षण का प्रतिनिधित्व करता है।
DMGregory

0

Rigidbody वेग और Rigidbody Addforce एकता 3 डी में दो भ्रमित करने वाले कार्य हैं और अक्सर शुरुआती लोग अपने अंतर को समझने में विफल रहते हैं। इस अनुच्छेद में, हम RigidBody.velocity और RigidBody.addforce के बीच अंतर पर चर्चा करने जा रहे हैं।

दोनों मामलों में, चाहे वह Addforce या वेग फ़ंक्शन हो, हम उन्हें समझाने के लिए शब्द बल का उपयोग करने जा रहे हैं।

जब हम Rigidbody.velocity का उपयोग कर रहे हैं, तब, उस स्थिति में, हम अपनी वस्तु में बल जोड़ रहे हैं, लेकिन यह बल केवल तब तक वस्तु को हिलाएगा, जब तक कि हम बल नहीं लगाते।

उदाहरण के लिए

body.velocity = नया वेक्टर 3 (0,0,5);

मान लें कि आपने z पोजीशन में 5f जोड़ दिया है और जब आप W कुंजी दबाएंगे तो वह बल जुड़ जाएगा। इसलिए जब आप W कुंजी को दबाएंगे तो वस्तु तुरंत 5. की गति से शुरू हो जाएगी। यह उसी तरह है यदि आप कार में इस फ़ंक्शन का उपयोग करके बल जोड़ रहे हैं, तो वह कार 5 की गति से शुरू होगी।

body.velocity = नया वेक्टर 3 (0,0,200);

और अगर आप कहते हैं कि मान को 200 में बदल दें और फिर प्रेस करने के बाद डब्ल्यू। कार शुरू होने से 200 की गति से चलने लगेगी, जो वास्तविक दुनिया में संभव नहीं है।

अब अगर आप Rigidbody.addforce के बारे में बात करते हैं

हमारे कार उदाहरण को जारी रखकर। यदि आप कार में 200 का बल जोड़ते हैं

body.addforce (0,0,200);

यदि हम W दबाते हैं तो कार 200 की गति से चलना शुरू नहीं करेगी लेकिन यह धीमी गति से शुरू होती है और फिर ड्रैग के मान के अनुसार इसकी गति को बढ़ाती है और रुक जाती है।

Rigidbody.addforce धीमी गति से शुरू होता है और फिर गति करता है, जैसे आप किसी भारी मेज को खींच रहे हैं, सबसे पहले आप उस मेज को धक्का देना शुरू करेंगे, मेज बस अपनी स्थिति से थोड़ा सा आगे बढ़ेगी लेकिन अगर आप उस तालिका को धक्का देते रहेंगे तो वह हिलना शुरू कर देगी और यदि आप उस तालिका को छोड़ देते हैं, तो यह सतह के आधार पर कुछ दूरी को कवर करेगा और यह एक ही rigidbody.addforce करते हैं।

आप Rigidbody.velocity का उपयोग कर सकते हैं, जहां आप बस खिलाड़ी कूद की तरह तुरंत प्रतिक्रिया करने के लिए अपनी वस्तु को स्थानांतरित करना चाहते हैं और उस बल का परिणाम कूदने के तुरंत बाद गायब हो जाएगा और आप Rigidbody.addforce का उपयोग कर सकते हैं जहां आपको धीमी शुरुआत और फिर निरंतर आंदोलन की आवश्यकता होती है जैसे एक रॉकेट। यदि आप कूदने में Rigidbody.addforce का उपयोग करते हैं, तो प्लेयर / ऑब्जेक्ट थोड़ी देर के लिए अंतरिक्ष में रहेगा और फिर वापस जमीन पर आ जाएगा।

(स्रोत)


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