math - drawing a cube with perspective -


छवि दर्ज करें </ P> <p> मेरे पास एक <code> चौड़ाई </ code> * <code> ऊंचाई </ कोड है। > बिटमैप को रेंडर करने के लिए। </ P> <p> प्रत्येक पिक्सेल के लिए, मैं घन की तरफ बढ़ना चाहता हूं: </ p> <pre> <code> स्थिर फ्लोट डो = 0.0f; Eye = glm :: क्लैंप (आंख + 0.005f, 0.0f, 1.0f); // एनिम कॉन्स्ट glm :: mat4 प्रक्षेपण = glm :: परिप्रेक्ष्य (35.0f, (फ्लोट) चौड़ाई / ऊंचाई, 0.1f, 10.0f), मॉडलव्यू = ग्ल्म :: lookAt (glm :: vec3 (कॉस (आंख), पाप (आंख), - 1), GLM :: vec3 (0,0,0), GLM :: vec3 (0,0,1)); Const फ्लोट एपिसिलॉन = sqrt (1.0 एफ / एसटीडी :: अधिकतम (चौड़ाई, ऊंचाई)) / 2.0 एफ; के लिए (int y = 0; y & lt; height; y ++) {के लिए (int x = 0; x & lt; चौड़ाई; x ++) {glm :: vec3 p = glm :: unProject (glm :: vec3 (x, y, 0) (0, चौड़ाई, ऊंचाई)), dir = glm :: unProject (glm :: vec3 (x, y, 1), modelview, प्रक्षेपण, glm :: vec4 (0, 0, चौड़ाई, ऊंचाई)) - पी, पी 0 = पी; // std :: cout & lt; & lt; एक्स एंड एलटी; & lt;

  float DE (glm :: vec3 p) {const float स्केल = -1.77 एफ, फिक्स्ड रेडियस 2 = 1.0 एफ, मिनराडियास 2 = (0.5 एफ * 0.5 एफ); Const glm :: vec3 p0 = p; Float dr = 1.0f; (Int n = 0; n & lt; 13; n ++) के लिए {// चिंतन करें पी = (glm :: क्लैंप (पी, -1.0 एफ, 1.0 एफ) * 2.0 एफ) - पी; // स्पेलर उलटा const float r2 = glm :: dot (p, p); यदि (आर 2 और लेफ्टिनेंट; मिनराडीस 2) {कॉस्ट फ्लोट टी = (फिक्स्ड रेडिअस 2 / मिनराडीस 2); पी * = टी; डॉ * = टी; } और अगर (आर 2 और लेफ्टिनेंट; नियत रेडियस 2) {const float t = (fixedRadius2 / r2); पी * = टी; डॉ * = टी; } // स्केल & amp; पी = पी * स्केल + p0 का अनुवाद करें; Dr = dr * abs (स्केल) + 1.0 एफ; } वापसी glm :: लंबाई (पी) / एबीएस (डॉ); }   

और आउटपुट पूरी तरह से अनबॉक्स-जैसा दिखता है:

मैं नेत्र कैसे बदलूं, ताकि मैं घन को ठीक से देखूं?

यहां छवि विवरण दर्ज करें

मुद्दा यह है कि किरण की लंबाई सामान्यीकृत होनी चाहिए:

  glm :: vec3 p = glm :: unProject (glm :: vec3 (x, Y, 0), मॉडलव्यूव्यू, प्रोजेक्शन, ग्ल्म :: वीसी 4 (0,0, चौड़ाई, ऊंचाई)), डीआईआर = ग्ल्म :: अप्रप्रोजेक्ट (ग्लम :: वीसी 3 (एक्स, वाई, 1), मॉडलव्यू, प्रक्षेपण, ग्ल्म :: vec4 (0,0, चौड़ाई, ऊंचाई)) - p; Const फ्लोट लेन = glm :: लंबाई (डीआईआर); Dir = glm :: सामान्यीकृत (डीआईआर); फ्लोट डी = 0; (इंट आई = 0; आई & lt; MAX_ITER; i ++) के लिए (const + float d = DE (p + dir * D); डी + = डी; अगर (डी & gt; लेन) तोड़; ...    

Comments