2011-12-15 32 views
7

में स्ट्रैफ़िंग/साइड स्टेपिंग को संभालना मैं गेम विकास के लिए काफी नया हूं और सफलतापूर्वक एक 3 डी इलाके का मॉडल किया है, और एक कैमरा है जो गेम की दुनिया में आसानी से घूमने में सक्षम है, हालांकि मैं एक झटके में भाग गया हूं कि मैं समझने में असमर्थ हूं।एक 3 डी गेम

वर्तमान में, आगे बढ़ने के लिए/पीछे की ओर मैं इस प्रकार के तरीकों है:

void Player::moveForward(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw)); 
    float sinYaw = sinf(degreesToRadians(m_yaw)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 

कहाँ Vector3 एक सरल पहला, दूसरा, जेड struct, और रेडियंस में डिग्री है:

inline float degreesToRadians(const float degrees) { 
    const float PIOver180 = 3.14159f/180.0f; 
    return degrees * PIOver180; 
} 
करने के लिए

आगे बढ़ने के लिए मैं तर्क में एक सकारात्मक फ्लोट रखता हूं, और पीछे की ओर एक नकारात्मक फ्लोट स्थानांतरित करता हूं।

यह मुझे आगे बढ़ने और पीछे की ओर जाने की इजाजत देता है - मैं स्थिति के pos.y को बदलकर ऊपर की तरफ बढ़ सकता हूं, हालांकि मैं यह नहीं समझ सकता कि चरण/स्ट्रैफ़ को बाएं और दाएं कैसे करें।

में मुझे प्रदान की विचलन 360/0, 270, 180 या 90 तथापि बीच कहीं उन्हें कोण है ओर कदम करने में सक्षम होने x और z परिणाम Flipping आगे-से बचने/पिछड़े-से बचने या आगे बढ़ने के लिए कैमरा का कारण बनता है/पीछे की ओर।

वैसे भी, यह मुझे परेशान कर रहा था कर दिया गया तो मैं कागज पर एक समाधान खोजने के लिए प्रयास किया है - यह काम किया:

inline float degreesToStrafe(const float degrees) 
{ 
    const float PIOver90 = 3.14159f/90.0f; 
    return degrees * PIOver90; 
} 

हालांकि, खेल में यह वास्तव में x और z परिणाम की अदला-बदली के समान है।

किसी भी मदद की सराहना की जाएगी; मैं इस बारे में वेब पर कुछ भी खोजने के लिए संघर्ष कर रहा था, हालांकि यह संभव है कि मैं गलत तरीके से खोज रहा था!

उत्तर

6

मुझे नहीं लगता कि आप केवल एक्स और जेड परिणामों को स्वैप कर सकते हैं। उस मामले पर विचार करें जहां cosYaw == sinYaw: उन्हें फ़्लिप करने के परिणामस्वरूप एक ही दिशा में असफल हो जाएगा, जो स्पष्ट रूप से अवांछित व्यवहार है क्योंकि आप वेक्टर को 90 डिग्री तक ले जाने की कोशिश कर रहे हैं, एक ही दिशा में नहीं जाते हैं।

इसके बजाए, आप वही काम करना चाहते हैं जो आप MoveForward के लिए कर रहे हैं, बस अपने yaw को 90 डिग्री पहले घुमाएं। आप मूल रूप से ज्ञात परिणामी वेग को अपने एक्स और जेड घटकों में तोड़ रहे हैं, और आप ऐसा कर सकते हैं क्योंकि आप कोण को जानते हैं। यदि आप आगे बढ़ने और स्ट्रैफ़िंग के बीच कोण में अंतर मानते हैं, तो यह 90 डिग्री है, इसलिए बस अपने यॉ में 9 0 डिग्री घटाएं या फिर उसी गणित का उपयोग करें।

void Player::strafe(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw - 90.f)); 
    float sinYaw = sinf(degreesToRadians(m_yaw - 90.f)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 
+0

आपको बहुत बहुत धन्यवाद! – krslynx

+0

बिल्कुल सही। धन्यवाद =] – Hobbes

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