2010-06-21 19 views
10

मैं एक्सएनए सीख रहा हूं और लगभग सभी शैक्षणिक किट http://creators.xna.com/en-US/ पर पाए गए हैं। मैं हमेशा वेक्टर पर Normalize() को एक कॉल देखता हूं। मैं समझता हूं कि सामान्य रूप से वेक्टर को इकाई लंबाई में परिवर्तित कर देता है, इसलिए यह सब दिशा देता है।एक वेक्टर को सामान्यीकृत करने के लिए कब?

अब मेरा प्रश्न यह है कि सामान्यीकरण कब और यह वास्तव में मेरी मदद करता है। मैं 2 डी प्रोग्रामिंग कर रहा हूं इसलिए कृपया 2 डी अवधारणाओं में समझाएं और 3 डी नहीं।

संपादित करें: यहाँ XNA किट में कोड है, तो क्यों मानक के अनुसार बुलाया जा रहा है?

if (currentKeyboardState.IsKeyDown(Keys.Left) || 
      currentGamePadState.DPad.Left == ButtonState.Pressed) 
     { 
      catMovement.X -= 1.0f; 
     } 
     if (currentKeyboardState.IsKeyDown(Keys.Right) || 
      currentGamePadState.DPad.Right == ButtonState.Pressed) 
     { 
      catMovement.X += 1.0f; 
     } 
     if (currentKeyboardState.IsKeyDown(Keys.Up) || 
      currentGamePadState.DPad.Up == ButtonState.Pressed) 
     { 
      catMovement.Y -= 1.0f; 
     } 
     if (currentKeyboardState.IsKeyDown(Keys.Down) || 
      currentGamePadState.DPad.Down == ButtonState.Pressed) 
     { 
      catMovement.Y += 1.0f; 
     } 


     float smoothStop = 1; 


     if (catMovement != Vector2.Zero) 
     { 
      catMovement.Normalize(); 
     } 

     catPosition += catMovement * 10* smoothStop; 

}

उत्तर

10

अपने उदाहरण में, कुंजीपटल प्रेस आप एक्स या वाई, या दोनों में आंदोलन दे। एक्स और वाई दोनों के मामले में, जब आप एक ही समय में दाएं और नीचे दबाते हैं, तो आपका आंदोलन विकर्ण होता है। लेकिन जहां अकेले एक्स या वाई में आंदोलन आपको लंबाई 1 का वेक्टर देता है, विकर्ण वेक्टर एक से अधिक लंबा होता है। वह है, लगभग 1.4 (2 की वर्ग जड़)।

आंदोलन वेक्टर को सामान्य किए बिना, तो विकर्ण आंदोलन केवल एक्स या वाई आंदोलन से तेज होगा। सामान्यीकरण के साथ, गति सभी 8 दिशाओं में समान होती है, जो मुझे लगता है कि गेम क्या कहता है।

2

यह क्या आप के लिए वेक्टर का उपयोग कर रहे पर निर्भर करता है, लेकिन अगर आप केवल वैक्टर का उपयोग कर रहे तो एक दिशा एल्गोरिदम और सूत्रों के एक नंबर देने के लिए बस अपने वैक्टर अगर सरल हैं इकाई लंबाई के हैं।

उदाहरण के लिए, कोण: कोण vtheta दो यूनिट के बीच वैक्टर u और सूत्र cos(theta) = u.v (जहां . डॉट उत्पाद है) द्वारा दिया जाता है। गैर-इकाई वैक्टरों के लिए, आपको लंबाई को गणना और विभाजित करना होगा: cos(theta) = (u.v)/(|u| |v|)

एक थोड़ा और अधिक जटिल उदाहरण: एक और पर एक सदिश का प्रक्षेपण। यदि v एक यूनिट वेक्टर है, तो u पर ऑर्थोगोनल प्रक्षेपण v पर (u.v) v द्वारा दिया गया है, जबकि v एक गैर-इकाई वेक्टर है तो सूत्र (u.v/v.v) v है।

दूसरे शब्दों में: सामान्यीकृत करें यदि आपको पता है कि आपको केवल इतना ही दिशा है और यदि आप निश्चित नहीं हैं कि वेक्टर पहले से ही एक इकाई वेक्टर है। यह आपकी मदद करता है क्योंकि आप संभवतः अपने दिशा वैक्टरों को उनकी लंबाई से विभाजित करने जा रहे हैं, इसलिए जब आप वेक्टर बनाते हैं और इसे प्राप्त करते हैं तो आप इसे एक बार भी कर सकते हैं।

संपादित करें: मुझे लगता है कि कारण आपके उदाहरण में सामान्यीकृत कहा जा रहा है ताकि गति की दिशा गति से अलग की जा सके। कोड की अंतिम पंक्ति में, 10 * smoothStop वस्तु की गति है, जो जानने के लिए आसान है। और गति से गति को पुनर्प्राप्त करने के लिए, आपको इकाई दिशा वेक्टर द्वारा गुणा करने की आवश्यकता है।

0

वे प्रत्येक घटक को वेक्टर की परिमाण से विभाजित करके किसी भी वेक्टर को सामान्यीकृत करते हैं, जो घटकों के वर्गों के वर्ग की वर्ग रूट द्वारा दिया जाता है। प्रत्येक घटक के बाद एक परिमाण होता है जो [-1, 1] के बीच भिन्न होता है, और परिमाण एक के बराबर होता है। यह एक इकाई वेक्टर की परिभाषा है।

3

एक वेक्टर सामान्यीकरण की आम उपयोग आप एक दिशा में इकाइयों की संख्या से कुछ ले जाने की आवश्यकता है। उदाहरण के लिए, यदि आपके पास एक ऐसा गेम है जहां एक इकाई ए इकाई इकाई की ओर 5 इकाइयों/सेकंड की गति से आगे बढ़ती है, तो आपको वेक्टर से ए से बी (जो B - A) प्राप्त होगा, आप इसे सामान्य कर देंगे ताकि आप केवल ए के दृष्टिकोण से इकाई बी की ओर दिशा रखें, और फिर आप इसे 5 इकाइयों/सेकंड से गुणा करेंगे। परिणामस्वरूप वेक्टर ए की गति होगी और आप विस्थापन प्राप्त करने के लिए इसे समाप्त कर सकते हैं जिससे आप ऑब्जेक्ट को स्थानांतरित कर सकें।

संबंधित मुद्दे