दीवार टकराव के परिणामी कोण का निर्धारण करें


14

इसलिए मेरे पास एक निश्चित क्षैतिज या ऊर्ध्वाधर दीवार की ओर एक वस्तु चलती है। मैं कोण की गणना कैसे करता हूं कि वस्तु को ऊपर उछालना चाहिए? ऑब्जेक्ट दीवार पर एक मनमाने कोण पर आ सकता है।

जवाबों:


18

यदि आप दीवार के सामान्य वेक्टर को जानते हैं और ऑब्जेक्ट के लिए एक आने वाली दिशा है, तो आप जो चाहते हैं वह एक विमान में वेक्टर का प्रतिबिंब है

यदि n एक सामान्यीकृत वेक्टर है, और वी है भेजे दिशा, तो क्या आप चाहते हैं है - (2 ( एन · v ) n - वी )। इस तथ्य के लिए माइनस साइन होता है कि प्रतिबिंब सूत्र वास्तव में दिशा को उल्टा नहीं करता है, क्योंकि ऑब्जेक्ट का वेग उल्टा होगा।

यह उत्तर वेक्टर गणित के संदर्भ में दिया गया है, न कि किसी कोण से, क्योंकि यह आमतौर पर बेहतर होता है यदि आपके पास कोण का उपयोग करने का कोई स्पष्ट कारण नहीं है। ध्यान दें कि यदि आपको कोणों के बारे में बात करनी है, तो प्रतिबिंब का कोण घटना के कोण के बराबर है। यदि कोण सामान्य से मापा जाता है, तो आउटगोइंग कोण आने वाले कोण का निषेध है; यदि कोण को दीवार से मापा जाता है, तो यह आने वाले कोण का पूरक है।


महान व्याख्या। यह मेरे लिए बहुत अच्छा काम किया! धन्यवाद!
DRFFTy

13

यदि यह एक 2D या 3D गेम था, तो आपने निर्दिष्ट नहीं किया। लेकिन अगर यह 2 डी गेम है और आपकी दीवारों को क्षैतिज या ऊर्ध्वाधर होने की गारंटी है और आप बस उनसे वस्तु को उछालना चाहते हैं, तो प्रतिबिंबों से निपटने की तुलना में बहुत आसान तरीका है।

किसी ऊर्ध्वाधर दीवार से टकराते समय, या क्षैतिज दीवार से टकराते समय वस्तु के वेग के Y- घटक से वस्तु के वेग के X- घटक को नकारें। उदाहरण:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

लेकिन यदि आप वास्तव में कोण को जानने की परवाह करते हैं, तो सामान्य शब्दों में, प्रतिबिंब का कोण घटना के कोण के समान है। यह कोण दीवार की सामान्य के संबंध में मापा जाता है। यहाँ एक तस्वीर है जो इसे स्पष्ट करना चाहिए:

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

यदि आपको कभी भी मनमानी दीवारों के लिए इसे संभालने की आवश्यकता होती है, तो आपको एक वेक्टर को प्रतिबिंबित करने के तरीके पर ध्यान देना होगा। यह वास्तव में सिर्फ एक छोटा सूत्र है जो दीवार के सामान्य और घटना वेक्टर को लेता है, और आपके लिए प्रतिबिंबित वेक्टर लौटाता है। यहाँ सूत्र XNA का उपयोग करता है:

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

और 2 डी के लिए आप बस कर सकते हैं:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}

इसके बारे में क्षमा करें, यह एक 2D गेम है। मैं इसे कोण पर आधारित रखना चाहूंगा क्योंकि जैसे आपने कहा कि मैं किसी भी दीवार का उपयोग करने में सक्षम होना चाहूंगा। धन्यवाद!
DRFFTy

मैंने इसे 2 डी को भी कवर करने के लिए संपादित किया। वास्तव में, यह केवल 2 डी वैक्टर, समान संचालन और सूत्र के साथ समान है
गुस्तावो मैकिएल

2 डी गेम में एक दीवार को कोण दिया जा सकता है, इसलिए कथन if it's a 2D game and your walls are guaranteed to be horizontal or verticalसही नहीं है। उत्तर का दूसरा भाग सही कार्यान्वयन को मानता है। IMHO, भागों के क्रम को उलट दिया जाना चाहिए, सामान्य समाधान को पहले और एन्फैसिस में प्रस्तुत करना, जबकि समकोण समाधान को असाधारण मामले के लिए सरलीकरण के रूप में प्रस्तुत किया गया है।
XenoRo

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