2 डी भौतिकी इंजन में, जब वस्तुएं आराम से आती हैं तो मैं बेकार टकराव के प्रस्तावों से कैसे बचता हूं?


9

प्रेम -२ डी का उपयोग करते हुए (सीखने के लिए) एक भौतिकी इंजन में , मैंने इस तरह टकराव के प्रस्तावों को लागू किया है:

FixedUpdate(dt)  // I use fixed timestep
 foreach collide c1 in allNotStaticColliders
   c1.integartePhysic // i.e. apply gravitational force..
   foreach collider c2 "near" c1 // "near"= I use spatial hashing 
      if collide(c1,c2)
        resolve collision (c1,c2)  // the heavy operation
        collison callbacks c1
        collison callbacks c2
        ...

गिरने और बसने के लिए वस्तुओं का एनीमेशन

जैसा कि आप जिफ एनीमेशन के अंत में देख सकते हैं, एक एफपीएस क्षय है जब सभी कोलाडर लगभग एक स्थिर वस्तु पर आधारित होते हैं।

2 एफपीएस के साथ अंतिम स्थिर राज्य

ऐसा इसलिए है क्योंकि टकराव के प्रस्तावों की संख्या बढ़ जाती है क्योंकि वस्तुओं को छूने में अधिक समय व्यतीत होता है क्योंकि वे बस जाते हैं। हालांकि, कई गणना "बेकार" हैं क्योंकि ऑब्जेक्ट पहले से ही एक दूसरे के खिलाफ स्थिर स्थिति में बस गए हैं।

इन "बेकार" टकराव से बचने के लिए सबसे अच्छा अभ्यास (उम्मीद है कि भौतिकी की डिग्री की आवश्यकता नहीं है) क्या है?

संपादित करें: DMGregory संकेत स्वीकार किए जाते हैं और इस परिणाम पर आते हैं (अभी तक इष्टतम नहीं)

यहाँ छवि विवरण दर्ज करें

(रेड = स्टैटिक, ब्लू = एक्टिव, ग्रीन = स्लीपिंग)


1
सामान्य दृष्टिकोण "नींद" वस्तुओं के लिए है जो आराम करने के लिए आते हैं, और नींद / स्थैतिक वस्तुओं के बीच बातचीत पर विचार नहीं करते हैं (लेकिन एक सो रही वस्तु को अभी भी एक गतिशील वस्तु से बातचीत द्वारा जगाया जा सकता है जो अभी भी जाग रही है और चलती है)। दुर्भाग्य से यह केवल तब मदद करता है जब एक वस्तु पूरी तरह से आराम पर होती है। यदि मैं आपके उदाहरण को सही ढंग से पढ़ रहा हूं, तो ऐसा लगता है कि आपके प्रदर्शन की परेशानी तब शुरू होती है जब ऑब्जेक्ट अभी भी निपट रहे हैं और थोड़ा आगे बढ़ रहे हैं। मैं यहाँ क्या करने के लिए सोच सकता हूं कि सिस्टम में अधिक घर्षण / भिगोना है (संभवतः एक वेग थ्रेशोल्ड के साथ) ताकि छोटे आंदोलनों को तेजी से सही आराम करने के लिए क्षय हो।
DMGregory

@DMGregory एक अच्छे उत्तर की तरह लगती है। इसे जोड़ें?
एको

जवाबों:


9

मुझे शक था कि ओपी पहले से ही इस दृष्टिकोण को जानता था इसलिए मैंने इसे एक टिप्पणी के रूप में सिर्फ एक शुरुआती बिंदु के रूप में उल्लेख किया, लेकिन मैं इसे थोड़ा दूर करने की कोशिश करूंगा ...

अधिकांश भौतिकी इंजन गतिशील वस्तुओं को दो समूहों में विभाजित करते हैं, " जागृत ," और " सो "।

जब वे आराम से बैठते हैं, और जब वे बाहर के किसी प्रभाव में चले जाते हैं या तेजी से उठते हैं, तो वस्तुएँ सो जाती हैं।

एक नींद वाली वस्तु ज्यादातर मामलों में एक स्थिर वस्तु की तरह व्यवहार करती है - इसका आंदोलन समय के साथ एकीकृत नहीं होता है (क्योंकि यह बाकी है, इसलिए इसमें कोई हलचल नहीं है) और इंजन उन वस्तुओं के बीच टकराव को अनदेखा करता है जो सो रही हैं या स्थिर हैं।

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

तो, केवल कम से कम एक जागृत गतिशील वस्तु से जुड़े टकरावों की जाँच की जानी चाहिए:

Collisions    Static          Sleeping           Awake
          ------------------------------------------------
Awake     |    Check        Check & Wake         Check
Sleeping  |     No               No
Static    |     No

यह नाटकीय रूप से उन वस्तुओं की संख्या को कम कर सकता है जिन्हें सक्रिय सिमुलेशन की आवश्यकता होती है, विशेष रूप से बवासीर में, जो कि प्रश्न में सचित्र है, बहुत कम टकराता है, ताकि कोई शुद्ध आंदोलन न हो।

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

कुछ चीजें जो आप जल्द आराम करने के लिए कर सकते हैं:

  • एक नॉनज़रो न्यूनतम गति या गति है, और जो कुछ भी नीचे गिरता है उसे शून्य पर जकड़ें। (यह मूल रूप से एक एप्सिलॉन है, आमतौर पर इसकी तुलना तैरने में की जाती है)

  • सिस्टम से ऊर्जा को बाहर निकालने के लिए घर्षण, भिगोना और इनलेस्टिक टकराव का उपयोग करें और इसे समग्र रूप से तेजी से पहुंचने में मदद करें।

  • बढ़ाएँ घर्षण / उदासीनता / लोचहीनता चुनिंदा के लिए धीमी गति से चलती वस्तुओं उन्हें और अधिक ऊर्जावान शरीर के व्यवहार को प्रभावित किए बिना देते हैं, कि अंतिम कुहनी से हलका धक्का आराम करने के लिए।


अच्छा उत्तर। आप अच्छे विचारों की एक उछाल की ओर इशारा करते हैं। नींद / जागने की जाँच के लिए मैं 2 कमजोर बिंदुओं को देखता हूं: 1) अगर नींद की वस्तु ओ 1 के नीचे ओ 1 ओ 2 से दूर जा रहा है, तो यह ओ 2 नहीं जागता है; 2) अगर मैं सो रही वस्तु के नीचे एक स्थिर प्लेटफ़ॉर्म निकालता हूँ, तो वह वस्तु जागृत नहीं होती (गुरुत्वाकर्षण बल के तहत)
dnk drone.vs.drones

1
@ dnkdrone.vs.drones अच्छा अवलोकन। अपने आप को कभी भी भौतिकी इंजन नहीं लिखा, मुझे यकीन नहीं है कि यह सामान्य रूप से कैसे संभाला जाता है। एक संभावना यह है कि, जब किसी वस्तु को सोने के लिए सेट किया जाता है, तो हम उन वस्तुओं की एक सूची संग्रहीत करते हैं जो इसे छू रही है (या इसे वस्तुओं के स्थानीय समूह में जोड़ें)। जब हम नींद की वस्तु को जगाते हैं, तो हम उसकी सूची / क्लस्टर में भी सब कुछ जगाते हैं। अधिक सुरुचिपूर्ण विकल्प हो सकते हैं, जैसे जागने के क्षण में आस-पास के संपर्कों की जांच करना (इससे पहले कि यह दूर हो जाए)।
DMGregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.