Minkowski राशि का उपयोग करें
(एक अच्छा तरीका इस समस्या को हल करने के लिए प्रस्ताव की एक पंक्ति के बीच चौराहे पर विचार करना है v ) मूल (अनुवाद करने के लिए वी ' ) और मिंकोवस्की राशि का एक मूल (180 डिग्री घुमाया ए' ) और उसके बाधाओं (सिर्फ बी इस मामले में): ए ' ⊕ बी ।
निम्नलिखित तस्वीर में मैं एक मनमाना समन्वय प्रणाली के मूल में एक स्मैक-डेब रखता हूं । द्वारा में 180 डिग्री परिणाम एक घूर्णन के रूप में समझने यह सरल ए ' , और वी मूल करने के लिए अनुवाद के बराबर होती है वी' ।
मिंकोवस्की योग हरे आयत है, और एक चलती के चौराहे अंक एक और एक स्थिर बी करके पाया जा सकता है लाइन AABB चौराहे । इन बिंदुओं को नीले घेरे के साथ चिह्नित किया गया है।
निम्नलिखित तस्वीर में एक अलग मूल का उपयोग किया गया था और समान चौराहे बिंदु पाए जाते हैं।
एकाधिक चलती AABBs
दो एएबीबी के लिए यह काम करने के लिए जो कि एक विशिष्ट अवधि के दौरान एक रैखिक फैशन में चलते हैं आप ए के वेग वेक्टर से बी के वेग वेक्टर को घटाएंगे और लाइन-एएबीबी चौराहे के लिए लाइन सेगमेंट के रूप में उपयोग करेंगे।
छद्म कोड
def normalize(aabb):
return {x1: min(aabb.x1, aabb.x2), x2: max(aabb.x1, aabb.x2),
y1: min(aabb.y1, aabb.y2), y2: max(aabb.y1, aabb.y2),
def rotate_about_origin(aabb):
return normalize({x1: -aabb.x1, x2: -aabb.x2
y1: -aabb.y1, y2: -aabb.y2})
# given normalized aabb's
def minkowski_sum(aabb1, aabb2):
return {x1: aabb1.x1+aabb2.x1, x2: aabb1.x2+aabb2.x2,
y1: aabb1.y1+aabb2.y1, y2: aabb1.y2+aabb2.y2}
def get_line_segment_from_origin(v):
return {x1: 0, y1: 0, x2: v.x, y2: v.y}
def moving_objects_with_aabb_intersection(object1, object2):
A = object1.get_aabb()
B = object2.get_aabb()
# get A'⊕B
rotated_A = rotate_about_origin(A)
sum_aabb = minkowski_sum(rotated_A, B)
# get v'
total_relative_velocity = vector_subtract(object1.get_relative_velocity(), object2.get_relative_velocity())
line_segment = get_line_segment_from_origin(total_relative_velocity)
# call your favorite line clipping algorithm
return line_aabb_intersection(line_segment, sum_aabb)
टकराव की प्रतिक्रिया
गेमप्ले के आधार पर आप या तो अधिक बारीक-बारीक टक्कर का पता लगाने का काम करेंगे (हो सकता है कि एएबीबी की जाली हो), या अगले चरण के लिए आगे बढ़ें: टकराव की प्रतिक्रिया।
जब टकराव होता है तो लाइन-एएबीबी-चौराहे एल्गोरिथ्म या तो 1 या 2 चौराहे के बिंदुओं पर वापस आ जाएगा, यह निर्भर करता है कि ए बी के अंदर अपना आंदोलन समाप्त करता है या क्रमशः इसके माध्यम से गुजरता है। (यह पतित मामलों को छूट दे रहा है, जहां ए चरस बी अपने पक्ष में या अपने संबंधित कोनों में से एक के साथ।)
किसी भी तरह से, लाइन खंड के साथ पहला चौराहा बिंदु टकराव बिंदु है, आप इसे वापस विश्व समन्वय प्रणाली में सही स्थिति में अनुवाद करेंगे (मूल v के साथ दूसरी तस्वीर में पहला हल्का नीला वृत्त , इसे पी कहें ) और फिर तय करें (जैसे, लोचदार टकराव के लिए p पर टकराव सामान्य के साथ v को दर्शाते हुए ) फ्रेम के अंत में A के लिए वास्तविक स्थिति क्या होगी ( At + 1 )।
यदि केवल 2 से अधिक कोलाइडर हैं, तो यह थोड़ा अधिक जटिल हो जाएगा, जैसा कि आप दूसरे, परिलक्षित, v के भाग के लिए भी टकराव का पता लगाना चाहते हैं ।