परावर्तन का कोण


11

मेरे पास यह "ब्रेकआउट स्टाइल" गेम है।

मेरे पास केंद्र में एक तोप है, तोप के चारों ओर ब्लॉक और ब्लॉकों के आसपास पैड हैं। इस तरह से खेल दिखता है:

एक परिपत्र ब्रेकआउट खेल

मैं प्रति पिक्सेल टकराव प्राप्त करने में कामयाब रहा हूं और मेरी गेंद निम्नलिखित गणित के साथ ब्लॉक के संपर्क पर " प्रतिबिंबित " करती है :

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

प्रतिबिंब गणना के कोण को दर्शाने वाली छवि

जहाँ नीली रेखा गेंद की दिशा है, और काली रेखा (बेस लाइन) ब्लॉक सतह है।

दिशा रेडियन में व्यक्त कोण है (जो डिग्री में परिवर्तित किया जा सकता है, निश्चित रूप से)।
गेंद द्वारा ले जाया जाता है:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

अब तक सब ठीक है।

मेरी समस्या अब आती है, पैड के साथ (छोटे रंग के ब्लॉक के चारों ओर 3 गहरे और बड़े ब्लॉक)।

जैसा कि वे चारों ओर मुड़ते हैं, सतह कोण बदल जाता है।
इससे अधिक, गेंद को पक्षों पर भी मारना चाहिए, इसलिए, मैं गेंद की गति और गेंद की गति की नई दिशा को कैसे माप सकता हूं?

ps : यदि आवश्यक हो, तो मैं कोड और एक बजाने वाला swf की आपूर्ति कर सकता हूं।


संपादित करें

ठीक है, कोणों के साथ समस्या वैक्टर के साथ हल हो गई थी , लेकिन मुझे अभी भी पक्षों और पीठ की टक्कर के साथ समस्या है।

मैं उसके लिए एक और प्रश्न खोलूंगा और इसे यहां लिंक करूंगा।


3
यदि आप अपने खातों को पुन: व्यवस्थित करते हैं, तो आपको +100 प्रतिष्ठा बोनस मिलना चाहिए। यह आपके प्रोफाइल के आपके अकाउंट टैब में एक विकल्प होना चाहिए। इस बीच, हालांकि, मैं आपके लिए उन चित्रों को पोस्ट करूंगा।
ग्रेस नोट

मैं इकट्ठा करता हूं कि आपकी दिशा 0 और 360 के बीच का कोण है और उस गेंद को स्थानांतरित करने के लिए जिसे आप त्रिकोणमिति का उपयोग कर रहे हैं?
जोनाथन कॉननेल

@ अनुग्रह, छवियों के लिए बहुत बहुत धन्यवाद ... @ 3nixios, मैंने कोण और गति के बारे में अधिक जानकारी जोड़ी है।
नेमोसेटिन

यदि आप प्रति ब्लॉक केवल एक "दिशा" स्टोर करते हैं, तो शायद आप प्रत्येक ब्लैक ब्लॉक को चार अलग-अलग ब्लॉकों के समूह के रूप में फिर से जोड़ते हैं, जहां "दिशा" का चेहरा हमेशा बाहर की ओर होता है। संभवतः चार कोनों पर किनारे के मामले होंगे।
क्षितिज

जवाबों:


8

मुझे यकीन नहीं है कि अगर मैंने आपकी समस्या को सही ढंग से समझा, लेकिन मैंने मान लिया कि आप जो करना चाहते हैं, वह टक्कर के बाद आपको गेंद का परिणामी दिशा मिल जाएगा।

यहाँ मेरे सफेद बोर्ड पर एक त्वरित ड्राइंग है जो उसके लिए एक संभावित समाधान दिखाता है:

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

हरे तीर गेंद के वेग (वेक्टर के रूप में) का प्रतिनिधित्व करते हैं, नीले ब्लॉक आपके बड़े काले ब्लॉकों का प्रतिनिधित्व करते हैं और लाल तीर परिणामी वेक्टर होता है।

पहले मामले पर, ब्लू ब्लॉक में 30 डिग्री का झुकाव होता है। टक्कर की समस्या को ठीक करने का एक तरीका क्षैतिज अक्ष पर सब कुछ वापस लाना है। आपको जो करने की आवश्यकता है वह सब कुछ 30 डिग्री (ब्लॉक के झुकाव) द्वारा घुमाया जाता है (आप उसके लिए मैट्रिस का उपयोग कर सकते हैं)।

फिर, आप जाँच करें कि टक्कर कहाँ से थी । यदि टक्कर क्षैतिज थी, तो वेग के x घटक को उल्टा करें। यदि यह लंबवत था (जैसे इस मामले में), y घटक ( ball.Velocity.Y = -ball.Velocity.Y)। यह कोनों को हिट करने पर गेंद को सही ढंग से काम भी करेगा (यह दोनों घटकों को उलट देगा)। उसके बाद, आपको बस वास्तविक स्थिति (जो ड्राइंग पर नहीं है) पर वापस घुमाना होगा

दूसरे मामले में, यह एक ही बात है, सिवाय इसके कि गेंद का वेग ब्लॉक के लिए लंबवत नहीं है। आप 70 डिग्री तक घूमते हैं, जांचें कि टक्कर कहां से थी, और उपयुक्त घटकों को उल्टा कर दें। इसके बाद, आप अपनी वास्तविक स्थिति में वापस आ जाते हैं।

नोट: मैंने देखा कि आप वेक्टर के बजाय दिशा का प्रतिनिधित्व करने के लिए कोण का उपयोग कर रहे हैं। आप इन गणनाओं के लिए एक वेक्टर बना सकते हैं या समान सामान्य विचार रख सकते हैं लेकिन कोणों के साथ काम कर सकते हैं।

यह निश्चित रूप से जाने का सबसे अच्छा तरीका नहीं है और मुझे यकीन है कि आप इसे किसी तरह से गणना कर सकते हैं, लेकिन मुझे लगता है कि यह आपकी समस्या का एक संभावित समाधान है।


धन्यवाद ... आपका बोर्ड पसंद आया। मैं एक मिनट में कोशिश करूँगा ... आह, और क्या आपको लगता है कि वैक्टर को बनाए रखने / साथ काम करने के लिए बेहतर हो सकता है ??
निमोसेटिन

हाहा ने मेरे खराब ड्राइंग कौशल को क्षमा कर दिया।
जेसी एमोंड

उफ़, मैं वास्तव में ड्राइंग करते समय एक महत्वपूर्ण कदम भूल गया था .. आपको -block inclination angleएक उचित टक्कर की प्रतिक्रिया के लिए वापस घुमाने की आवश्यकता है .. मुझे मूर्खतापूर्ण।
जेसी एमोंड

मुझे लगता है कि यह व्यक्तिगत प्राथमिकताओं के बारे में है, लेकिन मैं वैक्टर को बहुत पसंद करता हूं। आपको ज्यादातर समय उनके पीछे के गणित के बारे में सोचने की ज़रूरत नहीं है और यह आमतौर पर कोड क्लीनर बनाता है। तो आप एक Direction(एक वेक्टर के रूप में) रख सकते हैं और गेंद की स्थिति को अपडेट कर सकते हैं जैसे ball.Position += ball.Direction * ball.Speed;:।
जेसी इमोंड

@ जेसे, मैं अब तक ऐसा करने में सक्षम नहीं था। मैंने आपकी विधि को पूरी तरह से समझा, लेकिन इसे लागू नहीं कर सका। ऐसा करने के लिए मुझे पूरे हिस्से को फिर से लिखना होगा जो वैक्टर का उपयोग करने के लिए रेडियन कोण का उपयोग करते हैं (यह वास्तव में बहुत अधिक नहीं है)। अभी के लिए मैं अन्य विकल्पों की कोशिश करूँगा, और यदि आपके पास एक और एक है, तो मुझे कोशिश करने में खुशी होगी। धन्यवाद।
नेमोस्टाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.