मेरी वस्तु ९ ० डिग्री की तुलना में ४५ डिग्री पर तेजी से क्यों चलती है?


32

मेरे पास मेरे गेम में ऑब्जेक्ट हैं जो 45 डिग्री पर फिर 90 डिग्री पर तेजी से आगे बढ़ते हैं।

प्रत्येक वस्तु है

  • बिंदु (x, y) स्थिति
  • वेक्टर 2 डी (एक्स, वाई) दिशा
  • इंट स्पीड

और एक अद्यतन के दौरान मैं क्या करता हूं कि नई स्थिति की गणना इस प्रकार की जाती है:

position.x += direction.x * speed
position.y += direction.y * speed

मैं इसे कैसे ठीक करूं? मैं चाहता हूं कि यह किसी भी कोण पर समान गति के साथ आगे बढ़े।


8
उपयोग से पहले अपनी दिशा वेक्टर को सामान्य करें; समस्या सुलझ गयी।
डेसीलरेटेडकविवर

1
Google को सामान्य बनाने के लिए :) को यह उपयोगी साइट fundza.com/vectors/normalize/index.html मिली
जेसन94

और यदि आप इस ऑब्जेक्ट को नियंत्रित करने के लिए उपयोगकर्ता इनपुट का उपयोग कर रहे हैं, तो XNA देवों के लिए यहां बताए गए अनुसार 12,3,6,9 दिशाओं पर ताला लगाने के बारे में जागरूक रहें: xona.com/2010/05/03.html । यह कुछ ऐसा हो सकता है जो आप चाहते हैं (जैसे कि आरपीजी गेम में) या नहीं (जैसे कि ज्यामिति युद्धों शैली के खेल में)।
Xonatron

पुराने गेम डीसेंट में , यह एक विशेषता थी
जे। होम्स

@ ३२ बिटकॉइन हाँ, कयामत को
२०:४२ पर bobobobo

जवाबों:


55

इसे पायथागॉरियन प्रमेय के साथ समझाया जा सकता है , जो निम्न सूत्र है:

a² + b² = c²

आपके मामले में, दाएं चलते समय, आप उपयोग कर रहे हैं (x: 1, y: 0) जो हमें देता है

c² = 1 + 0 = 1
c = sqrt(1) = 1.00

ऊपर और दाईं ओर जाते समय, आप (x: 1, y: 1) का उपयोग कर रहे हैं, जो हमें देता है

c² = 1 + 1 = 2
c = sqrt(2) = 1.41

तो जैसा कि आप देख सकते हैं, लंबाई तिरछे कार्डिनल कुल्हाड़ियों पर लंबाई से अधिक लंबी है।

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

var normalizedDirection = direction;
normalizedDirection.Normalize();
position += normalizedDirection * speed

मैं अपने प्रश्न में आपकी मदद के लिए आपको +1 दे रहा हूं :)
मार्टिन।

12

उपयोग से पहले अपनी दिशा वेक्टर को सामान्य करें।

जैसा कि माइंडवोरएक्स द्वारा समझाया गया है, इसे बस समझा जा सकता है, यदि आपकी दिशा वैक्टर के बारे में आपकी चिंता संभवतः आपको दु: ख दे रही है, तो सुनिश्चित करें कि वे यूनिट वैक्टर हैं (परिमाण / लंबाई 1)।

Length(Vector2(1, 1)) == 1.4142135623730951 // first hint of grief
Length(Vector2(1, 0)) == 1

Vector2(1, 1) * 2 == Vector2(2, 2)
Vector2(1, 0) * 2 == Vector2(2, 0)

Length(Vector2(2, 2)) = 2.8284271247461903 // second hint
Length(Vector2(2, 0)) = 2

यदि सामान्यीकृत:

normal(Vector2(1, 1)) == Vector2(0.707107, 0.707107)
Length(Vector2(0.707107, 0.707107)) == 1 // perfect

14
सहायक उत्तर नहीं। यदि प्रश्नकर्ता जानता था कि "आपकी दिशा वेक्टर को सामान्य करता है" का अर्थ है, तो उसने प्रश्न नहीं पूछा होगा।
क्रिस्टोफर जॉनसन

@ क्रिस्टोफरजॉनसन यह स्पष्ट नहीं कर रहे थे कि प्रश्नकर्ता को यह नहीं पता था कि वेक्टर को कैसे सामान्य किया जाए। यद्यपि प्रश्नकर्ता पर्याप्त संसाधन लगता है कि यह वैसे भी मायने नहीं रखता था।
deceleratedcaviar

2
@ क्रिस्टोफर जॉनसन: यदि प्रश्नकर्ता को यह नहीं पता था कि "आपकी दिशा वेक्टर को सामान्य करता है" का अर्थ क्या है, तो उसे केवल Google पर अपनी भाषा का नाम टाइप करना होगा, और स्पष्टीकरण के साथ एक कोड प्राप्त करना होगा।
लीन रयान

6

आप अपनी दिशा की गणना कैसे कर रहे हैं? यदि 45 डिग्री है (1,1), तो यह निश्चित रूप से 90 डिग्री से अधिक तेज होने वाला है (1,0)

मेरा सुझाव है कि आप कुछ इस तरह का उपयोग करें:

direction.x = Math.Cos(angleInRadians);
direction.y = Math.Sin(angleInRadians);

रेडियंस में कोण प्राप्त करने के लिए, आपको अपनी डिग्री के साथ PI / 180या उससे भी बेहतर उपयोग करना होगा MathHelper। उदाहरण के लिए।

angleInRadians = 45.0 * Math.PI / 180.0; // first method
angleInRadians = MathHelper.ToRadians(45f); //second method

6

जेसन,

तीन ऑब्जेक्ट विशेषताओं के बजाय,

  • बिंदु (x, y) स्थिति
  • वेक्टर 2 डी (एक्स, वाई) दिशा
  • इंट स्पीड

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

  • बिंदु (x, y) स्थिति
  • वेक्टर 2 डी (एक्स, वाई) वेग

अद्यतन स्थिति

जब आपको ऑब्जेक्ट की स्थिति को अपडेट करने की आवश्यकता होती है, तो यह उतना ही सरल है:

position.x += velocity.x * Δt;
position.y += velocity.y * Δt;

Δtआपका समय कहां है - या समय अंतर - या समय कदम।

स्थिति और वेग को अद्यतन करना

त्वरण को संभालने के लिए यह बहुत आसान है (जैसे कि गुरुत्वाकर्षण से)। यदि आपके पास त्वरण वेक्टर है, तो आप इस तरह वेग और स्थिति को एक साथ अपडेट कर सकते हैं:

position.x += (velocity.x * Δt) + (0.5 * acceleration.x * Δt * Δt);
position.y += (velocity.y * Δt) + (0.5 * acceleration.y * Δt * Δt);

velocity.x += acceleration.x * Δt;
velocity.y += acceleration.y * Δt;

(यह मूल रूप से भौतिकी 101 से s = vt + isat from सूत्र है।)

एक गति लागू करना

यदि आप किसी सामान्य दिशा में दिए गए गति को लागू करना चाहते हैं, तो आप इस तरह से वेग निर्धारित कर सकते हैं:

velocity.x = normalizedDirection.x * speed;
velocity.y = normalizedDirection.y * speed;

एक गति प्राप्त करना

और अगर आपको रिवर्स वेग वेक्टर से गति और दिशा प्राप्त करने की आवश्यकता है - तो आप बस पाइथागोरस प्रमेय या .Length()विधि का उपयोग कर सकते हैं :

speed = velocity.Length();

और एक बार गति ज्ञात हो जाने के बाद, सामान्य दिशा को गति द्वारा वेग को विभाजित करके गणना की जा सकती है (शून्य से विभाजित होने से बचने के लिए सावधान रहना):

if (speed != 0) {
    normalizedDirection.x = velocity.x / speed;
    normalizedDirection.y = velocity.y / speed;
} else {
    normalizedDirection.x = 0;
    normalizedDirection.y = 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.