अधिकतम 30 ऑब्जेक्ट्स के साथ, आपको एक ही फ्रेम में एक से अधिक बार एक दूसरे के खिलाफ एक ही दो जोड़े की जांच न करने के अलावा अन्य सभी पर बहुत अनुकूलन की आवश्यकता नहीं होनी चाहिए। नीचे दिए गए कोड नमूने को कवर किया जाएगा। लेकिन अगर आप अलग-अलग अनुकूलन में दिलचस्प हैं जो एक भौतिकी इंजन का उपयोग करेंगे तो इस पोस्ट के बाकी हिस्सों के माध्यम से पढ़ना जारी रखें।
आपको जो आवश्यकता होगी वह एक स्थानिक विभाजन कार्यान्वयन है, जैसे कि एक ओक्ट्री (3 डी गेम के लिए) या क्वाडट्री (2 डी गेम के लिए)। ये दुनिया को उप-वर्गों में विभाजित करते हैं, और फिर प्रत्येक उप-खंड को एक ही जागीर में विभाजित किया जाता है, जब तक कि वे न्यूनतम आकार में विभाजित नहीं हो जाते। यह आपको बहुत जल्दी जांच करने की अनुमति देता है कि दुनिया के समान क्षेत्र में कौन सी अन्य वस्तुएं हैं, जो उन टकरावों की मात्रा को सीमित करती हैं, जिनके खिलाफ आपको जांच करनी चाहिए।
स्थानिक विभाजन के अलावा, मैं आपकी प्रत्येक भौतिक वस्तुओं के लिए एक AABB ( एक्सिस-संरेखित बाउंडिंग बॉक्स ) बनाने की सलाह दूंगा । यह आपको किसी वस्तु के एएबीबी को दूसरे के खिलाफ जांचने की अनुमति देता है, जो वस्तुओं के बीच एक विस्तृत प्रति-पॉली चेक की तुलना में बहुत तेज है।
यह जटिल या बड़ी भौतिकी वस्तुओं के लिए एक और कदम उठाया जा सकता है, जहां आप भौतिकी जाल को स्वयं विभाजित कर सकते हैं, प्रत्येक उप-आकार को अपना एएबीबी दे सकते हैं जिसे आप केवल तभी जांच सकते हैं जब दो ऑब्जेक्ट के एएबीबी अतिव्यापी हो।
एक बार आराम करने पर अधिकांश भौतिकी इंजन भौतिकी निकायों पर सक्रिय भौतिकी सिमुलेशन को निष्क्रिय कर देंगे। जब एक भौतिकी निकाय को निष्क्रिय कर दिया जाता है, तो उसे प्रत्येक एएबीबी के खिलाफ टक्कर के लिए केवल जांच की आवश्यकता होती है, और यदि एएबीबी के साथ कुछ भी टकराता है, तो यह फिर से सक्रिय हो जाएगा और अधिक दानेदार टक्कर की जांच करेगा। इससे अनुकरण समय नीचे रहता है।
इसके अलावा, कई भौतिकी इंजन 'सिमुलेशन द्वीप' का उपयोग करते हैं, जो कि जहां भौतिकी निकायों का एक समूह होता है जो एक साथ समूहबद्ध होते हैं। यदि सिमुलेशन द्वीप में सब कुछ आराम पर है तो सिमुलेशन द्वीप स्वयं निष्क्रिय हो जाता है। सिमुलेशन द्वीप का लाभ यह है कि द्वीप के निष्क्रिय होने के बाद इसके अंदर के सभी पिंड टकरावों की जाँच करना बंद कर सकते हैं, और केवल प्रत्येक फ्रेम को यह देखना है कि क्या कुछ द्वीप के AABB में प्रवेश किया है। केवल एक बार कुछ द्वीप के AABB में प्रवेश करता है, द्वीप के भीतर के प्रत्येक निकायों को टकरावों की जांच करने की आवश्यकता होती है। सिमुलेशन द्वीप भी प्रतिक्रिया करता है अगर उसके अंदर कोई भी शरीर अपने आप फिर से चलना शुरू कर देता है। यदि कोई समूह समूह के केंद्र से काफी दूर चला जाता है, तो उसे द्वीप से हटा दिया जाता है।
अंत में आप कुछ इस तरह से छोड़ते हैं (छद्म कोड में):
// Go through each leaf node in the octree. This could be more efficient
// by keeping a list of leaf nodes with objects in it.
for ( node in octreeLeafNodes )
{
// We only need to check for collision if more than one object
// or island is in the bounds of this octree node.
if ( node.numAABBsInBounds > 1)
{
for ( int i = 0; i < AABBNodes.size(); ++i )
{
// Using i+1 here allows us to skip duplicate checks between AABBS
// e.g (If there are 5 bodies, and i = 0, we only check i against
// indexes 1,2,3,4. Once i = 1, we only check i against indexes
// 2,3,4)
for ( int j = i + 1; j < AABBNodes.size(); ++j )
{
if ( AABBOverlaps( AABBNodes[i], AABBNodes[j] ) )
{
// If the AABB we checked against was a simulation island
// then we now check against the nodes in the simulation island
// Once you find overlaps between two actual object AABBs
// you can now check sub-nodes with each object, if you went
// that far in optimizing physics meshes.
{
}
}
}
}
मैं इस तरह के छोरों के भीतर इतने सारे छोरों को नहीं रखने की भी सिफारिश करूंगा, ऊपर का नमूना सिर्फ इतना था कि आपको यह विचार मिला, मैं इसे कई कार्यों में तोड़ दूंगा जो आपको वही कार्यक्षमता प्रदान करते हैं जैसे कि ऊपर दिखाया गया है।
इसके अलावा, सुनिश्चित करें कि इसके माध्यम से लूप करते समय AABBNodes कंटेनर को बदलना न पड़े, क्योंकि इसका मतलब टकराव की जांच से चूक सकता है। यह सामान्य ज्ञान की तरह लग सकता है, लेकिन आप आश्चर्यचकित होंगे कि टकरावों पर प्रतिक्रिया देने वाली चीजें आपके द्वारा अनुमानित नहीं होने के कारण परिवर्तन करना कितना आसान है। उदाहरण के लिए यदि टकराव की वस्तुओं में से एक टकराव की स्थिति के कारण स्थिति को बदलने के लिए पर्याप्त हो तो उन्हें उस ऑक्ट्री नोड के एएबीबी से हटा दें जो आप चेक कर रहे थे तब यह उस कंटेनर को बदल सकता है। इसे हल करने के लिए मैं चेक के दौरान होने वाली सभी टक्कर की घटनाओं की एक सूची रखने की सलाह देता हूं, और फिर सभी जांच पूरी होने के बाद सूची के माध्यम से चला जाता हूं और किसी भी टकराव की घटनाओं को बाहर भेजता हूं।