मुझे पहले व्यक्ति के कैमरे को कैसे लागू करना चाहिए?


12

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

क्या कोई मुझे कैमरे की कक्षा की ओर इशारा कर सकता है जिसका मैं उपयोग कर सकता हूं, या कुछ उपयोगी कोड?


इसे बाहर की जाँच करें learnopengl.com/# -Getting
started/

जवाबों:


7

यहाँ कैमरा रोटेशन (मूसलूक) पर कुछ सुझाव दिए गए हैं। खरोंच से एक कैमरा क्लास को लागू करने के बाद, मैंने पाया कि मुझे अच्छे घूर्णी व्यवहार के लिए कुछ अतिरिक्त ट्वीक करने हैं:

  1. रीसेट माउस प्रत्येक फ्रेम पर केंद्र-से-स्क्रीन के लिए समन्वय करता है, ताकि माउस स्क्रीन सीमाओं पर कभी भी पकड़ा न जाए

  2. कैमरे के "अप" वेक्टर (रोल को अस्वीकृत करें) को बनाए रखें और "बग़ल में" वेक्टर को पुनः स्थापित करें

  3. लंबवत + y अक्ष, या पिछले -y अक्ष के नीचे (बहुत दूर / नीचे) अतीत को देखना छोड़ें

  4. रोटेशन का क्रम सही करें (पहले / नीचे, फिर बाएं / दाएं)

  5. "अप", "उद्देश्य" और "बग़ल में" प्रत्येक फ्रेम को वैक्टर में बदल दें

उम्मीद है कि आप अपने लाभ के लिए इस कोड का उपयोग कर सकते हैं:

    const int mouseDeltaX = mouseAxisX * (input.GetMouseX() - int(app.GetWidth()/2));
    const int mouseDeltaY = -mouseAxisY * (input.GetMouseY() - int(app.GetHeight()/2));  // mouse y-offsets are upside-down!

    // HACK:  reset the cursor pos.:
    app.SetCursorPosition(app.GetWidth()/2, app.GetHeight()/2);

    float lookRightRads = mouseDeltaX * CAMERA_ANGULAR_SPEED_DEG * DEG_TO_RAD;
    float lookUpRads    = mouseDeltaY * CAMERA_ANGULAR_SPEED_DEG * DEG_TO_RAD;

    // Limit the aim vector in such a way that the 'up' vector never drops below the horizon:
    static const float zenithMinDeclination = DEG_TO_RAD * MIN_UPWARDS_TILT_DEG;
    static const float zenithMaxDeclination = DEG_TO_RAD * (180.0f - MIN_UPWARDS_TILT_DEG);

    const float currentDeclination = std::acosf(camera.aim_.y_);  ///< declination from vertical y-axis
    const float requestedDeclination = currentDeclination - lookUpRads;

    // Clamp the up/down rotation to at most the min/max zenith:
    if(requestedDeclination < zenithMinDeclination)
        lookUpRads = currentDeclination - zenithMinDeclination;
    else if(requestedDeclination > zenithMaxDeclination)
        lookUpRads = currentDeclination - zenithMaxDeclination;

    // Rotate both the "aim" vector and the "up" vector ccw by 
    // lookUpRads radians within their common plane -- which should 
    // also contain the y-axis:  (i.e. no diagonal tilt allowed!)
    camera.aim_.rotateAboutAxis(camera.right_, lookUpRads);
    camera.up_.rotateAboutAxis(camera.right_, lookUpRads);
    ASSERT_ORTHONORMAL(camera.aim_, camera.up_, camera.right_);

    // Rotate both the "aim" and the "up" vector ccw about the vertical y-axis:
    // (again, this keeps the y-axis in their common plane, and disallows diagonal tilt)
    camera.aim_.rotateAboutAxis(Y_AXIS, -lookRightRads);
    camera.up_.rotateAboutAxis(Y_AXIS, -lookRightRads);
    camera.updateRightAxis();

ध्यान दें कि:

mouseAxisX और mouseAxisY को +/- 1 के रूप में परिभाषित किया गया है, जो इस बात पर निर्भर करता है कि आप x या y अक्ष मूसलूक को उल्टा चाहते हैं। आमतौर पर खेल इस विकल्प को कम से कम ऊर्ध्वाधर अक्ष के लिए प्रदान करते हैं।

MIN_UPWARDS_TILT_DEG को 1.0 डिग्री परिभाषित किया गया है (इसलिए दर्शक को -89 डिग्री से नीचे +89 डिग्री तक देखने की अनुमति दी जाती है, जो पूरी तरह से 180 डिग्री ऊर्ध्वाधर सीमा की तरह दिखता है - चरम पर लापता 2 डिग्री काफी नगण्य हैं) ।

camera.aim_, camera.right_, और camera.up_ बेशक 3D वैक्टर हैं, और रोटेटअबाउटिस () विधि आप विकिपीडिया और ऑनलाइन स्रोतों की किसी भी संख्या से एक साथ मिल सकते हैं। Y_AXIS एक निश्चित स्थिर (0,1,0) वेक्टर है।

ASSERT_ORTHONORMAL () एक डिबग-मोड-ओनली सैनिटरी चेक है, जो कभी भी अनुकूलित या रिलीज़ मोड में संकलित नहीं होता है।

सी-स्टाइल कोड के लिए अग्रिम में माफी ... फिर से, यहाँ आप मेदियोक्रिटस नामक एक व्यक्ति से सलाह ले रहे हैं! ; ^)


तुम्हारी किस बारे में बोलने की इच्छा थी? सी-स्टाइल कोड हैकर स्पिरिट की आधारशिला है! 8-)
ब्लिसफ्रीक

5

इसके बारे में जाने के कई तरीके हैं (ट्यूटोरियल यहां देखें) , यहाँ और यहाँ गूगल के माध्यम से इंटरनेट पर और अधिक उपलब्ध उदाहरण के लिए, बहुत सारे के साथ)। आपके द्वारा ऑनलाइन संसाधनों में उपयोग की जाने वाली तकनीक थोड़ा भिन्न हो सकती है (D3D, XNA, OpenGL, et cetera के संदर्भ में), लेकिन अंतर्निहित सिद्धांत समान होने जा रहे हैं:

  • आपका कैमरा ऑब्जेक्ट अपनी स्थिति और उसकी दिशा बनाए रखता है, और वैकल्पिक रूप से वैक्टर की एक और जोड़ी, जो दिशा के साथ-साथ, कैमरा के समन्वय प्रणाली के लिए एक ऑर्थोगोनल आधार बनाती है।
  • आपके कैमरे के सार्वजनिक एपीआई ने yawing, पिचिंग के लिए तरीकों को उजागर किया है, और वैकल्पिक रूप से कैमरा को आधार वैक्टर के चारों ओर घुमाया है - कैमरा ओरिएंटेशन को समायोजित करने का कार्य बाद के उपयोग के लिए आधार वैक्टर को अपडेट करेगा।

आप वैक्टर को सीधे स्टोर करने के लिए चुनाव कर सकते हैं, या हर बार अंतर्निहित दृश्य मैट्रिक्स को फिर से जोड़ सकते हैं, जैसा कि आपको ज़रूरत है और पसंद करते हैं। तकनीक के लिए बहुत अधिक लचीलापन है, इसलिए यदि आपको उन सामान्य चरणों से परे मदद की आवश्यकता है जो आप एक नए प्रश्न को अधिक विशिष्ट प्रश्न के साथ पोस्ट करना चाहते हैं।


2

Direct3D का उपयोग करके कैमरा सिस्टम के कार्यान्वयन के लिए एक विशिष्ट संदर्भ के लिए, मैं इस लेख की सिफारिश करता हूं: http://www.toymaker.info/Games/html/camera.html । लेखक अन्य तरीकों और विशेषताओं का भी वर्णन करता है जिनका उपयोग कार्यान्वयन पर विस्तार करने के लिए किया जा सकता है।

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