यह सवाल टकराव का पता लगाने और समाधान के बारे में मेरे पिछले एक से एक "अनुवर्ती" सवाल है, जिसे आप यहां पा सकते हैं ।
यदि आप पिछले प्रश्न को नहीं पढ़ना चाहते हैं, तो मेरा भौतिकी इंजन कैसे काम करता है, इसका संक्षिप्त विवरण यहाँ है:
प्रत्येक भौतिक इकाई को SSSPBody नामक एक वर्ग में संग्रहीत किया जाता है।
केवल AABB का समर्थन किया जाता है।
हर SSSPBody SSSPWorld नामक एक वर्ग में संग्रहीत है, जो हर शरीर को अपडेट करता है और गुरुत्वाकर्षण को संभालता है।
हर फ्रेम, SSSPWorld हर बॉडी को अपडेट करता है।
प्रत्येक अद्यतन निकाय एक स्थानिक हैश में आस-पास के शवों की तलाश करता है, जांच करता है कि क्या उन्हें उनके साथ टकराव का पता लगाने की आवश्यकता है। यदि हाँ, तो वे "टकराव" की घटना को रोकते हैं और जाँचते हैं कि क्या उनके साथ टकराव को हल करने की आवश्यकता है। यदि हाँ, वे पैठ वेक्टर और दिशात्मक ओवरलैप की गणना करते हैं, तो पैठ को हल करने के लिए अपनी स्थिति को बदल दें।
जब कोई शरीर दूसरे से टकराता है, तो वह अपने वेग को दूसरे के पास स्थानांतरित कर देता है, बस शरीर के वेग को अपने आप ही सेट कर देता है।
एक शरीर का वेग 0 पर सेट होता है जब उसने अंतिम फ्रेम से स्थिति नहीं बदली है। यदि यह एक गतिशील पिंड के साथ भी टकराता है (जैसे कि एक लिफ्ट या एक गतिशील प्लेटफ़ॉर्म) तो यह लिफ्ट के संचलन अंतर की गणना करता है कि यह देखने के लिए कि क्या पिंड अपनी अंतिम स्थिति से स्थानांतरित नहीं हुआ है।
इसके अलावा, एक निकाय एक "कुचल" घटना को आमंत्रित करता है जब इसके सभी एएबीबी कोनों को एक फ्रेम में कुछ ओवरलैप किया जाता है।
यह मेरे खेल का पूर्ण स्रोत कोड है। यह तीन परियोजनाओं में विभाजित है। SFMLStart इनपुट, ड्राइंग और संस्थाओं के अद्यतन से निपटने के लिए एक सरल पुस्तकालय है। SFMLStartPhysics सबसे महत्वपूर्ण है, जहां SSSPBody और SSSPWorld कक्षाएं हैं। PlatformerPhysicsTest गेम प्रोजेक्ट है, जिसमें सभी गेम लॉजिक हैं।
और यह SSSPBody वर्ग में "अपडेट" विधि है, टिप्पणी और सरलीकृत। आप केवल इस पर एक नज़र डाल सकते हैं यदि आपको संपूर्ण SFMLStartSimplePhysics प्रोजेक्ट को देखने का मन नहीं है। (और यदि आप करते हैं, तब भी आपको टिप्पणी करने के बाद भी इस पर एक नज़र रखना चाहिए।)
.Gif दो समस्याओं को दिखाता है।
- यदि निकायों को एक अलग क्रम में रखा जाता है, तो अलग परिणाम होते हैं। बाईं ओर के बक्से दाईं ओर के बक्से के समान हैं, केवल उलटा क्रम (संपादक में) में रखा गया है।
- दोनों क्रेट्स को स्क्रीन के शीर्ष की ओर ले जाना चाहिए। बाईं ओर की स्थिति में, कोई भी टोकरा प्रवृत्त नहीं होता है। दाईं ओर, उनमें से केवल एक है। दोनों ही स्थितियाँ अनायास ही हैं।
पहली समस्या: अपडेट का क्रम
यह समझने में काफी सरल है। बाईं ओर की स्थिति में, सबसे ऊपरी टोकरा दूसरे से पहले अद्यतन किया जाता है। भले ही तल पर टोकरा दूसरे के लिए "वेग" स्थानांतरित करता है, इसे स्थानांतरित करने के लिए अगले फ्रेम की प्रतीक्षा करने की आवश्यकता है। चूंकि यह नहीं चला, इसलिए नीचे के टोकरे का वेग 0 पर सेट है।
मुझे यह पता नहीं है कि इसे कैसे ठीक किया जाए। मैं अपडेट सूची में "सॉर्टिंग" पर निर्भर नहीं होने के समाधान को प्राथमिकता दूंगा, क्योंकि मुझे लगता है कि मैं पूरे भौतिकी इंजन डिजाइन में कुछ गलत कर रहा हूं।
प्रमुख भौतिकी इंजन (Box2D, बुलेट, चिपमंक) अपडेट ऑर्डर को कैसे संभालते हैं?
दूसरी समस्या: केवल एक टोकरा छत की ओर प्रवृत्त होता है
मुझे अभी तक समझ नहीं आया कि ऐसा क्यों होता है। "स्प्रिंग" इकाई क्या करती है, शरीर के वेग को -4000 पर सेट कर देती है और इसे स्प्रिंग के ऊपर स्थित कर देती है। भले ही मैं पुन: स्थिति कोड को अक्षम कर दूं, फिर भी समस्या होती है।
मेरा विचार यह है कि जब नीचे का टोकरा शीर्ष टोकरा से टकराता है, तो इसका वेग 0. पर सेट होता है, मुझे यकीन नहीं है कि ऐसा क्यों होता है।
पहली समस्या को छोड़ देने वाले किसी व्यक्ति की तरह दिखने की संभावना के बावजूद, मैंने पूरे प्रोजेक्ट स्रोत कोड को ऊपर पोस्ट किया। मेरे पास इसे साबित करने के लिए कुछ भी नहीं है, लेकिन मेरा विश्वास करो, मैंने इसे ठीक करने की बहुत कोशिश की, लेकिन मुझे इसका कोई हल नहीं मिला और मेरे पास भौतिकी और टकरावों का कोई पिछला अनुभव नहीं है। मैं इन दोनों समस्याओं को एक सप्ताह से अधिक समय से हल करने की कोशिश कर रहा हूं और अब मैं हताश हूं।
मुझे नहीं लगता कि मैं खेल से बाहर कई विशेषताओं को हटाए बिना अपने आप पर एक समाधान पा सकता हूं (उदाहरण के लिए स्थानांतरण और स्प्रिंग्स, उदाहरण के लिए)।
इस प्रश्न को पढ़ने में बिताए गए समय के लिए बहुत बहुत धन्यवाद, और इससे भी अधिक धन्यवाद यदि आप भी समाधान या सुझाव के साथ आने की कोशिश करते हैं।