मेरे जवाब के लिए कुछ दोहे हैं, कि मैं पहले रास्ते से हट जाऊंगा: यह केवल नॉन-रोटेटिंग बाउंडिंग बॉक्स से संबंधित है। यह मानता है कि आप टनलिंग के मुद्दों से निपटने की कोशिश कर रहे हैं, यानी वस्तुओं के कारण जो तेज गति से आगे बढ़ रहे हैं।
एक बार जब आप एमटीवी की पहचान कर लेते हैं, तो आप उस किनारे / सतह को सामान्य रूप से जानते हैं जिसके खिलाफ आपको परीक्षण करने की आवश्यकता है। आप इंटरपेंटरेटिंग ऑब्जेक्ट के रैखिक वेग वेक्टर को भी जानते हैं।
एक बार जब आप यह स्थापित कर लेते हैं कि फ्रेम के दौरान किसी बिंदु पर , एक चौराहा हुआ, तो आप निम्न आरंभिक बिंदुओं के आधार पर बाइनरी हाफ स्टेप ऑपरेशन कर सकते हैं: फ्रेम के दौरान पहले घुसे हुए शीर्ष को पहचानें:
vec3 vertex;
float mindot = FLT_MAX;
for ( vert : vertices )
{
if (dot(vert, MTV) < mindot)
{
mindot = dot(vert, MTV);
vertex = vert;
}
}
एक बार जब आपने वर्टेक्स की पहचान कर ली है, तो द्विआधारी आधा कदम बहुत कम महंगा हो जाता है:
//mindistance is the where the reference edge/plane intersects it's own normal.
//The max dot product of all vertices in B along the MTV will get you this value.
halfstep = 1.0f;
vec3 cp = vertex;
vec3 v = A.velocity*framedurationSeconds;
float errorThreshold = 0.01f; //choose meaningful value here
//alternatively, set the while condition to be while halfstep > some minimum value
while (abs(dot(cp,normal)) > errorThreshold)
{
halfstep*=0.5f;
if (dot(cp,normal) < mindistance) //cp is inside the object, move backward
{
cp += v*(-1*halfstep);
}
else if ( dot(cp,normal) > mindistance) //cp is outside, move it forward
{
cp += v*(halfstep);
}
}
return cp;
यह उचित रूप से सटीक है, लेकिन केवल एकल टकराव बिंदु प्रदान करेगा, एक ही मामले में।
बात यह है, यह आमतौर पर अग्रिम में बताने के लिए संभव है कि अगर कोई वस्तु इस तरह से सुरंग में सक्षम होने के लिए प्रति फ्रेम काफी तेजी से आगे बढ़ेगी, तो सबसे अच्छी सलाह यह है कि वेग के साथ अग्रणी कोने की पहचान करें और वेग वेक्टर के साथ एक किरण परीक्षण करें। वस्तुओं को घुमाने के मामले में, आपको सही संपर्क बिंदु का पता लगाने के लिए किसी तरह का बाइनरी हाफस्टेप थप्पड़ मारना होगा।
ज्यादातर मामलों में, हालांकि, यह सुरक्षित रूप से माना जा सकता है कि आपके दृश्य में अधिकांश वस्तुएं इतनी तेजी से आगे नहीं बढ़ेंगी कि एक ही फ्रेम में दूर तक जा सकें, इसलिए कोई भी आधा कदम आवश्यक नहीं है, और असतत टक्कर का पता लगाना पर्याप्त होगा। बुलेट जैसी उच्च गति की वस्तुएं, जो देखने में बहुत तेज चलती हैं, संपर्क बिंदुओं के लिए फिर से जांच की जा सकती हैं।
दिलचस्प बात यह है कि यह आधा रास्ता विधि आपको (लगभग) सटीक समय भी दे सकती है कि ऑब्जेक्ट फ्रेम के दौरान हुआ था:
float collisionTime = frametimeSeconds * halfstep;
यदि आप किसी प्रकार की भौतिकी टक्कर संकल्प कर रहे हैं, तो आप A की स्थिति को सही कर सकते हैं:
v - (v*halfstep)
तब आप अपना भौतिकी सामान्य रूप से वहां से कर सकते हैं। नकारात्मक पक्ष यह है कि यदि वस्तु यथोचित रूप से तेज चलती है, तो आप इसे वेग वेक्टर के साथ वापस टेलीपोर्टिंग देखेंगे।