मैं ओपनजीएल में 2 डी, टॉप डाउन, स्टाइल कैमरा बनाने की कोशिश कर रहा हूं। मैं मॉडल-व्यू-प्रोजेक्शन मैट्रिसेस का उपयोग करने के सम्मेलन के साथ रहना चाहता हूं, ऐसा इसलिए है कि जब मैं एप्लिकेशन चलता हूं तो मैं 3 डी व्यू और टॉप डाउन व्यू के बीच स्विच कर सकता हूं। मैं वास्तव में दृश्य मैट्रिक्स बनाने के लिए glm::lookAt विधि का उपयोग कर रहा हूं।

हालाँकि मेरी समझ में कुछ कमी है। मैं स्क्रीन पर एक त्रिकोण प्रस्तुत कर रहा हूं, [इस ट्यूटोरियल के बहुत करीब] [1], और यह पूरी तरह से ठीक काम करता है (इसलिए विंडोिंग, डिस्प्ले लूप, वर्टेक्स बफर, आदि के साथ कोई समस्या नहीं है)। त्रिभुज (0, 0) पर केंद्रित है, और शिखर -0.5/0.5 पर हैं (इसलिए पहले से ही एनडीसी में)।

फिर मैंने वर्टेक्स शेडर में एक uniform mat4 mpv; जोड़ा। अगर मैं एमपीवी मैट्रिक्स को इस पर सेट करता हूं:

glm::vec3 camera_pos = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 target_pos = glm::vec3(0.0f, 0.0f, 0.0f);
glm::mat4 view = glm::lookAt(camera_pos, target_pos, glm::vec3(0.0f, 1.0f, 0.0f));

मुझे वही, अनमॉडिफाइड त्रिकोण मिलता है जैसा कि अपेक्षित है (मेरी समझ से) ओपनजीएल के लिए डिफ़ॉल्ट मान।

अब मैंने सोचा कि अगर मैंने कैमरे की स्थिति के Z मान को बदल दिया है तो इसका ज़ूम इन और आउट के समान प्रभाव होगा, हालांकि मुझे केवल स्पष्ट रंग मिलता है, कोई त्रिकोण प्रदान नहीं किया जाता है।

    // Trying to simulate zoom in and out by changing z value of camera
    glm::vec3 camera_pos = glm::vec3(0.0f, 0.0f, -3.0f);
    glm::vec3 target_pos = glm::vec3(0.0f, 0.0f, 0.0f);
    glm::mat4 view = glm::lookAt(camera_pos, target_pos, glm::vec3(0.0f, 1.0f, 0.0f));

तो मैंने दृश्य मैट्रिक्स मुद्रित किया, और देखा कि मैं जो कुछ कर रहा था वह Z मान का अनुवाद कर रहा था, जो समझ में आता है।

मैंने फिर एक ऑर्थो प्रोजेक्शन मैट्रिक्स जोड़ा, यह सुनिश्चित करने के लिए कि सब कुछ एनडीसी में है, लेकिन मुझे अभी भी कुछ नहीं मिलता है।

  // *2 cause im on a Mac/high-res screen and the frame buffer scale is 2.
  // Doing projection * view in one step and just updating view uniform until I get it working.
  view = glm::ortho(0.0f, 800.0f * 2, 0.0f, 600.0f * 2, 0.1f, 100.0f) * view;

मेरी गलतफहमी कहाँ हो रही है। मैं:

  1. एक टॉप डाउन व्यू का अनुकरण करें जहां मैं लक्ष्य पर ज़ूम इन और आउट कर सकता हूं।
  2. एक 2D कैमरा बनाएं जो एक लक्ष्य (रेसिंग कार) का अनुसरण करता है, इसलिए कैमरा_पॉज़ XY और target_pos XY समान होंगे।
  3. अंत में एक मानक रेसिंग गेम तीसरे व्यक्ति के दृश्य की तरह एक 3D निम्नलिखित कैमरे पर स्विच करने का विकल्प जोड़ें, इसलिए एमपीवी बनाम केवल सरल अनुवादों का उपयोग करना। [1]: https://learnopengl.com/Getting-started/Hello-Triangle
1
user2840470 8 जिंदा 2021, 03:35
सामान खींचते समय वर्टेक्स ट्रांसफ़ॉर्मेशन (मैट्रिक्स द्वारा) लागू किया जाता है। यदि आप ऐसा महसूस करते हैं, तो आप प्रत्येक त्रिभुज को एक ही फ्रेम में परिवर्तन मैट्रिक्स का अपना सेट दे सकते हैं। परिवर्तनों को "स्विच" करने की क्षमता इस बात से पूरी तरह से स्वतंत्र है कि आप अपनी परिवर्तन पाइपलाइन को कैसे लेआउट कर रहे हैं।
 – 
datenwolf
8 जिंदा 2021, 15:54

1 उत्तर

सबसे बढ़िया उत्तर

शीर्ष निर्देशांक [-0.5, 0.5] की सीमा में हैं, लेकिन ऑर्थोग्राफिक प्रोजेक्शन क्यूबॉइड वॉल्यूम को बाएं, नीचे, निकट बिंदु _(0, 0, 0.1) और दाएं, ऊपर, दूर बिंदु ( व्यूपोर्ट का 800.0 * 2, 600.0 * 2, 100)
इसलिए, त्रिभुज जाल केवल व्यूपोर्ट के निचले बाएँ भाग में एक टुकड़े को कवर करता है।

ऑर्थोग्राफिक प्रोजेक्शन बदलें:

view = glm::ortho(0.0f, 800.0f * 2, 0.0f, 600.0f * 2, 0.1f, 100.0f) * view;

view = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.1f, 100.0f) * view;
1
Rabbid76 8 जिंदा 2021, 10:05