वास्तव में बड़े डेल्टा समय (घंटों से सप्ताह) के लिए कौन से भौतिकी सिमुलेशन तरीके सबसे उपयुक्त हैं?
इसके अलावा, क्या मुझे बड़े और छोटे डेल्टा समय के लिए अलग-अलग तरीकों के संयोजन में किसी भी समस्या का सामना करना पड़ेगा?
वास्तव में बड़े डेल्टा समय (घंटों से सप्ताह) के लिए कौन से भौतिकी सिमुलेशन तरीके सबसे उपयुक्त हैं?
इसके अलावा, क्या मुझे बड़े और छोटे डेल्टा समय के लिए अलग-अलग तरीकों के संयोजन में किसी भी समस्या का सामना करना पड़ेगा?
जवाबों:
आप इन बड़े समय स्पैन (जो शून्य त्वरण हो सकते हैं) के लिए निरंतर त्वरण का उपयोग कर रहे हैं। समय के संबंध में निरंतर त्वरण का व्युत्पन्न 0. है। इसका मतलब यह है कि यह समय के संबंध में नहीं बदलता है, इसलिए इससे कोई फर्क नहीं पड़ता कि आपका डेल्टा समय कितना बड़ा है।
समय के संबंध में यह थोड़ा एकीकरण आपके लिए आवश्यक समीकरण प्रदान करता है।
a = a
v = at + v0
s = .5at^2 + v0*t + s0
जहाँ: a = त्वरण, v = वेग, v0 = प्रारंभिक वेग, s = स्थिति, s0 = प्रारंभिक स्थिति, t = समय
इस रणनीति का उपयोग करके आप कई बार मिलीसेकंड से हफ्तों तक स्पैन का उपयोग कर सकते हैं यदि आप चाहते थे। इन्हें मिलाकर समीकरण के मापदंडों v0
और s0
मानकों का ध्यान रखा जाएगा ।
टक्करों को संभालने के लिए आपको उच्च गति वाली छोटी वस्तुओं के लिए उपयोग की जाने वाली रणनीतियों को लागू करना होगा । पहले उपरोक्त समीकरण का उपयोग करके नई स्थिति की गणना, फिर सभी वस्तुओं के लिए पुरानी और नई स्थिति के बीच व्यापक। चूंकि उन वस्तुओं में से कोई भी एक-दूसरे को (मिनट या दिन पहले) एक दूसरे से अलग कर सकता था, इसलिए यह बहुत जटिल हो सकता है। यह संभावना है कि आपके पास इतने बड़े डेल्टा समय हैं, उम्मीद है कि आपके पास इन संभावित टकरावों को संसाधित करने के लिए बहुत समय होगा।
गुरुत्वाकर्षण के साथ एक उदाहरण लेते हैं।
नीचे दिए गए फ़ंक्शन में, मान लें कि हमारे पास स्थिति और वेग के लिए वर्ग सदस्य चर हैं। हमें प्रत्येक dt सेकंड के गुरुत्वाकर्षण बल के कारण उन्हें अपडेट करने की आवश्यकता है।
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
जैसे-जैसे dt
छोटा और छोटा होता जाता है, हमारा अनुकरण अधिक से अधिक सटीक होता dt
जाता है (हालाँकि यदि बहुत छोटा हो जाता है तो हम बड़ी संख्या में छोटी संख्या जोड़ते समय सटीक त्रुटियों का सामना कर सकते हैं)।
मूल रूप से, आपको यह तय करना होगा कि dt
आपका अनुकार कितना अच्छा परिणाम प्राप्त कर सकता है। और अगर dt
वह अंदर आता है तो बहुत बड़ा है, तो बस सिमुलेशन को छोटे चरणों में तोड़ दें, जहां प्रत्येक चरण dt
आपके द्वारा अनुमत अधिकतम है।
void update( float dt )
{
acceleration = G * m / r^2;
velocity = velocity + acceleration * dt;
position = position + velocity * dt;
}
// this is the function we call. The above function is a helper to this function.
void updateLargeDt( float dt )
{
const float timeStep = 0.1;
while( dt > timeStep )
{
update( timeStep );
dt -= timeStep ;
}
update( dt ); // update with whatever dt is left over from above
}
तो इस रणनीति के साथ, आप केवल timeStep
जो भी निष्ठा की आवश्यकता है, उसे समायोजित कर सकते हैं (इसे एक दूसरा, मिनट, घंटा, या जो कुछ भी आवश्यक है भौतिकी का सटीक प्रतिनिधित्व प्राप्त करने के लिए आवश्यक है।
अधिकांश खेल आगे एकीकरण की सरल यूलर विधि का उपयोग करते हैं (जो कि समय के साथ वेग को एकीकृत करता है, और त्वरण को वेग में एकीकृत करता है)। दुर्भाग्य से, यूलर विधि केवल बहुत छोटे समय और छोटे रन के लिए उपयुक्त है।
अधिक जटिल विधियां हैं जो बहुत लंबे समय के तराजू पर अधिक सटीक हैं। लागू करने के लिए सबसे लोकप्रिय और सबसे आसान शायद रनगे-कुटे -४ है । RK4 अतीत और प्रक्षेप में चार पदों और वेगों का नमूना लेकर भविष्य में स्थिति निर्धारित करता है। यह समय के पैमाने पर यूलर विधि की तुलना में बहुत अधिक सटीक है, लेकिन अधिक कम्प्यूटेशनल रूप से महंगा है।
उदाहरण के लिए, यदि आप वास्तविक-परिक्रमा करने वाले ग्रह की भौतिकी को वास्तविक समय के हर कुछ दिनों में अद्यतन करना चाहते हैं, तो यूलर विधि ग्रह को संख्यात्मक त्रुटियों के कारण केवल कुछ कक्षाओं के बाद अंतरिक्ष में शूट करने का कारण बनेगी। RK4 आम तौर पर बहुत अधिक त्रुटि जमा करने से पहले ग्रह की परिक्रमा लगभग हजारों बार एक ही आकार में करता रहेगा।
हालांकि, आरके 4 में टकराव को लागू करना बहुत चुनौतीपूर्ण हो सकता है ...