एक गेंद कोने से टकराती है, जहां यह विक्षेपण करेगा


46

मुझे अपनी त्रिकोणमिति को ब्रश करने की आवश्यकता है और आशा है कि आप यहां एक सरल गणितीय मॉडल के साथ मदद कर सकते हैं। यहाँ मेरा मॉडल संलग्न छवि में अब तक है। मुझे पता है कि फ्रेम एनीमेशन में अन्य समस्याएं हैं जब गेंद बहुत तेजी से आगे बढ़ रही है, लेकिन अभी के लिए मुझे बस बॉलडैक्स और बैले की गणना करने की आवश्यकता है। यह भी संभव है कि बॉलडैक्स = 0 (केवल लंबवत गति), लेकिन जब गेंद डिफ्लेक्ट करती है तो बॉलडैक्स को एक अलग मूल्य मिल सकता है।

गेंद और ठोस असमान वस्तु के कोने के बीच 2 डी टक्कर


22
क्या इसे "कॉर्नर केस" कहते हैं?
एंड्रयू ग्रिम

2
निश्चित रूप से, जैसा कि चीजें होती हैं, जल्द ही हम इसे हल करने के लिए सापेक्षता के सिद्धांत को नियोजित कर सकते हैं - समस्या बड़े पैमाने पर हो रही है (ive)।
लूमिस

जवाबों:


45

नोट: निम्नलिखित सभी मानते हैं कि गेंद की सतह घर्षण रहित है (इसलिए यह अलग तरीके से घूमना या पलटना शुरू नहीं करेगा क्योंकि यह है)।

टक्कर के समय, गेंद कोने को छू रही होगी। जब ठोस ऑब्जेक्ट टकराते हैं, तो एक बल तथाकथित सतह के साथ-साथ टकराव के बिंदु पर सतह के लंबवत कार्य करेगा।

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

चलो (nDx, nDy) टक्कर के बाद वेग हो, (oDx, oDy) टक्कर से पहले वेग, और टक्कर के बिंदु पर (x, y) गेंद की स्थिति। चलो आगे मान लें कि जिस कोने से गेंद टकराती है वह (0,0) है।

सूत्र के रूप में अपनी अंतर्दृष्टि व्यक्त करते हुए, हमारे पास:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

जो इसके बराबर है:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

पिछले एक में पहले दो समीकरणों को प्रतिस्थापित करते हुए, हमें यह मिलता है:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

द्विपद वक्ष का उपयोग कर विस्तार

(a+b)^2 = a^2 + 2ab + b^2 

पैदावार:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

इस द्विघात समीकरण के cदो समाधान हैं, जिनमें से एक है। जाहिर है, यह वह समाधान नहीं है जिसमें हम रुचि रखते हैं, क्योंकि आम तौर पर टकराव के परिणामस्वरूप गेंद की दिशा बदल जाएगी। अन्य समाधान प्राप्त करने के लिए, हम दोनों पक्षों को c से विभाजित करते हैं और प्राप्त करते हैं:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

अर्थात्:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

संक्षेप में, हमारे पास है:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

संपादित करें : कोड में:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

कुछ कार्यान्वयन के विचार: जब आप अनुकरण कदम के बाद गेंद की स्थिति के साथ (x, y) अनुमानित कर सकते हैं, तो यह सन्निकटन विक्षेपण के कोण को बदल देगा और इसलिए बहुत ध्यान देने योग्य होगा, इसलिए आपके सिमुलेशन चरणों को बहुत ठीक होने की आवश्यकता है (शायद ऐसा ही) गेंद प्रति चरण 1/20 से अधिक इसके डिमैटर पर नहीं चलती है)। अधिक सटीक समाधान के लिए, आप उस समय की गणना कर सकते हैं जब टक्कर होती है, और उस समय पर उस सिमुलेशन कदम को विभाजित करें, यानी टक्कर के बिंदु तक एक आंशिक कदम और शेष चरण के लिए एक और आंशिक कदम।

संपादन 2: प्रभाव के बिंदु को समझना

आज्ञा देना त्रिज्या, (x0, y0) स्थिति और (dx, डाई) सिमुलेशन कदम की शुरुआत में गेंद का वेग। सादगी के लिए, चलो आगे मान लेते हैं कि प्रश्न में कोने (0,0) पर स्थित है।

हम जानते है:

(x,y) = (x0, y0) + (dx, dy) * t

हम चाहते हैं

length(x,y) = r

अर्थात्

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

यह t में एक द्विघात समीकरण है। अगर इसका भेदभाव है

D = b^2 - 4 * a * c

नकारात्मक है, इसका कोई हल नहीं है, अर्थात गेंद अपने वर्तमान पाठ्यक्रम पर कभी भी कोने से नहीं टकराएगी। अन्यथा, इसके दो समाधान द्वारा दिए गए हैं

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

हम उस समय में रुचि रखते हैं जब टकराव शुरू हुआ, जो पहले का समय है t1

आपकी विधि बन जाएगी:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
इस लायक +1
गतिशील

1
बेझिझक उठो, फिर :-)
मेरिटॉन - हड़ताल पर

3
आप बहुत जल्दी कहते हैं कि At the moment of collision, the ball will be touching the cornerलेकिन मुझे इस सन्निकटन का औचित्य नहीं दिखता (और यह एक सन्निकटन होना चाहिए क्योंकि यह सच नहीं है - गेंद दो स्थानों पर छू रही है , जिनमें से कोई भी कोने नहीं है)।
पीटर टेलर

1
@Peter टेलर: आपने ध्यान दिया कि ओपी ने आयत के बाहर गेंद को खींचा है , और प्रश्न में दिए गए टकराव का पता लगाने का फॉर्मूला यह मानता है? आप यहां बॉक्स के बाहर सोचते हैं :-)
मेरिटॉन - हड़ताल पर

1
इस उत्तर से प्यार करें, लेकिन यह गणित के कुछ $ \ LaTeX $ मार्कअप का उपयोग कर सकता है।
मार्टिन विकमैन

13

यहाँ एक समस्या को देखने का एक दृश्य तरीका है।

मूल समस्या सेट सर्कल बनाम आयत (नीचे की छवि में ग्रे) है। यह पॉइंट बनाम राउंडेड रेक्ट (काले रंग में दिखाया गया है) के बराबर है।

तो यह एक बहु-भाग की समस्या है। आप अपनी बात टकराव बनाम 4 लाइनों (मूल सर्कल के त्रिज्या द्वारा बॉक्स के किनारे से बाहर निकाल) और 4 सर्कल (मूल सर्कल के समान त्रिज्या के कोनों पर) का परीक्षण कर रहे हैं।

आपकी मूल छवि में मोटे वेग के साथ, बिंदु नीचे दाएं कोने के सर्कल से टकराएगा। आपको बस इतना करना होगा कि आप जिस कोने सर्कल से टकराएंगे, उस कोण को परिकलित करें, और उसके बारे में सोचें।

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

मैं पाठक के लिए एक अभ्यास के रूप में उस की व्युत्पत्ति छोड़ दूँगा।


2

मैं एक खेल पर काम कर रहा हूं और यहां फंस गया हूं। लेकिन मुझे लगता है कि यह इस तरह से है:

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

एक और दृश्य है मेरी समस्या यह है कि मुझे नहीं पता कि नए डीएक्स, डाई की गणना कैसे करें (पारंपरिक गणित का उपयोग करने के लिए मुझे बहुत अधिक गणनाओं की आवश्यकता है)।


मेरा दृष्टिकोण दूसरे लिंक में एक से भिन्न है, क्योंकि मुझे नहीं लगता कि नया वेग वेक्टर ब्लॉक के केंद्र पर निर्भर करता है। मेरे भाई ने मुझे बताया कि गेंद पुरानी दिशा में वापस जाएगी (dx = -dx && dy = - dy) लेकिन मुझे ऐसा लगता है।
रिसा

यदि गेंद कोने से टकराती है और कोने से बॉलएक्स की दूरी 1/4 बॉलवे से कम होती है तो वह वापस उछल जाएगी, अन्यथा यह दाईं ओर आगे झुक जाएगी। यह एक सरल मॉडल है जिसका मैं इस समय उपयोग कर रहा हूं, जो सटीक कोण खोजने के लिए ठीक नहीं है।
लुमिस

0

किनेमैटिक्स सही चुनने के बारे में है, जैसा कि गणना के लिए सबसे सुविधाजनक है, संदर्भ का फ्रेम।

यहाँ हम पहले परिवर्तन टी को परिभाषित करेंगे जो हमारे अक्षों को समानांतर ( x ' ) और लंब ( y' ) में गेंद के केंद्र और कोने के बीच की रेखा तक ले जाती है। उलटा परिवर्तन टी * हमारे मूल समन्वय प्रणाली को बहाल करेगा।

संदर्भ के इस नए फ्रेम में, प्रतिबिंब द्वारा (और भौतिकी के समय और स्थान समरूपता), हमारे पास संपर्क एम (एक बिंदु आवेग ) का वेग परिवर्तन है, जो कि एक्स ' घटक को उलट देता है और वाई घटक को अपरिवर्तित छोड़ देता है । में मैट्रिक्स शर्तों इस विकर्ण पर साथ विकर्ण मैट्रिक्स -1 और 1 है।

फिर टक्कर के बाद वेग बस है: V ' = T *एमटीVo

प्रभाव टी का समय तो बस ( टी) के लिए समाधान हैडू ) + ( एक्सटीवो । ) ( टी ) = आर के जहां एक्स एक्स-एक्सिस प्रोजेक्शन ऑपरेटर है और आर बॉल की त्रिज्या है। पुन: व्यवस्थित, हम प्राप्त
टी = ( आर - ( टीDo )) / (( एक्सटीवो ) ( टी ))

इसके पास सभी जटिल गणित को कठोरता से लिखित, परीक्षण और डीबग किए गए मानक ग्राफिक्स लाइब्रेरी में दफनाने का विशिष्ट लाभ है। यह समाधान 2 डी और 3 डी स्थितियों के लिए भी समान है - बस ग्राफिक्स लाइब्रेरी स्विच करें। अंत में, यह रेखांकित करता है कि किसी भी भौतिकी समस्या से निपटने से पहले पहले संदर्भ के उपयुक्त फ्रेम के बारे में सोचना चाहिए । हमेशा NIH प्रलोभन होता है, लेकिन सच है कि बग के लिए सिर्फ एक नुस्खा है जब अधिक रसीला समाधान उपलब्ध हैं।

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