मैं भौतिकी इंजन में वस्तुओं को "पॉपिंग" या घबराना कैसे ठीक कर सकता हूं?


11

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

मुझे यह समस्या हुई है कि वस्तुओं के ढेर में शीर्ष वस्तुएं बहुत अधिक दबाव लागू करती हैं (यह स्पष्ट रूप से मौजूद है, एल्गोरिथ्म में कोई दबाव मॉडलिंग नहीं है), ढेर के नीचे की वस्तुओं पर, जिसके परिणामस्वरूप उन्हें फर्श के माध्यम से धकेल दिया जाता है, आदि।

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

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

केवल आपको स्रोत कोड दिए बिना - यह क्या हो सकता है?


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

@TravisG आपने समस्या का समाधान कैसे किया? मैं एक बहुत ही सरल भौतिकी इंजन को लागू करने की कोशिश करते समय एक समान समस्या को देख रहा हूं।
चीजस

1
@cheeesus जब से मैंने इस पर काम किया है, तब से कुछ समय हो गया है, लेकिन मेरा मानना ​​है कि मैंने अभी छोटे समय के साथ अधिक पुनरावृत्तियों का उपयोग किया है।
ट्रैविसग

जवाबों:


5

स्थिति सुधारने का उपयोग करते समय मैंने जो एक समाधान पाया है, उसमें कुछ पुनरावृत्तियों के लिए है और प्रत्येक पुनरावृत्ति के साथ ताकत बदलती है।

doPhysics();

int num_iterations = 5;
for(int iteration=0; iteration<num_iterations; ++iteration)
{
    float strength = float(iteration+1)/num_iterations;
    correctPositions(strength);
}

तो पहले पुनरावृत्ति में 1 / संख्या_ की ताकत होती है और अंतिम में 1 की ताकत होती है। यह मेरे सिमुलेशन को एक निश्चित संख्या के साथ पुनरावृत्तियों की संख्या का उपयोग करने की तुलना में अधिक चिकनी और अधिक स्थिर बनाता है।


2
अच्छा समाधान है, लेकिन यह काम क्यों करता है?
गुस्तावो मैकील

5

आपकी समस्या इस तथ्य में है कि आपके पास अपने शरीर के लिए "आराम" राज्य नहीं है। किसी भी भौतिकी प्रणाली में ऊर्जा की मात्रा होती है, जो गतिज, उष्मीय और इसी तरह की हो। वास्तव में, ठोस वस्तु थोड़ा विकृत हो जाती है, और कुछ गतिज ऊर्जा को गर्मी में बदल देती है, हालांकि यह शायद ही औसत दर्जे का है। यह भी ध्यान देने योग्य है कि वास्तव में पूरी तरह से ठोस वस्तु जैसी कोई चीज नहीं है। यहां तक ​​कि हीरे की तरह घनी सामग्री, परमाणुओं के बीच में जगह होती है, जो परमाणु संरचना कक्ष को फ्लेक्स में देती है, और गतिज ऊर्जा को अवशोषित करती है।

इसे प्रासंगिक बनाने के लिए, आराम करने वाले निकाय एक ऐसी स्थिति में हैं, जहां प्रभाव में एकमात्र बल "सामान्य बल" है, जो कहना है, वह बल जो निकायों को एक दूसरे के माध्यम से तैरने से रोकता है। उस सामान्य बल का परिमाण, वस्तुओं के घनत्व के समानुपाती होता है, और वे एक दूसरे से कितनी दूर तक प्रवेश कर चुके होते हैं।

भौतिकी इंजन इस मूल्य को "स्लोप" कहते हैं।

यहां चाल है: ढलान की गणना करें, और निकायों की स्थिति को ठीक करें, और दो निकायों के सापेक्ष वेग के आधार पर, सामान्य बल लागू करें। स्वयं निकायों के अद्यतन के दौरान, प्रत्येक शरीर की गतिज ऊर्जा की गणना करें। यदि यह एक न्यूनतम मूल्य से कम है, तो शरीर को सोने के लिए रख दें, जब तक कि उस पर पर्याप्त परिमाण का बल लागू न हो जाए। (आमतौर पर दो बार न्यूनतम मूल्य)।


0

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

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