【问题标题】:Reflecting scene by plane - mirror in openGL平面反射场景 - openGL中的镜像
【发布时间】:2018-07-14 18:33:42
【问题描述】:

我正在尝试使用模板缓冲区创建带有平面镜的场景。当我试图反映我的第二个渲染通道的视点时,我被困在了这一点上,如https://www.opengl.org/archives/resources/code/samples/advanced/advanced97/notes/node90.html 所述。我需要在 viewmatrix 上应用什么转换才能达到预期的效果?为了简化事情,我尝试在 XY 平面上设置平面并按 (1, 1, -1) 缩放视图矩阵,但它没有按我预期的那样工作。能否指出我如何反映这个视图矩阵,以便我可以渲染镜像场景或有其他方法吗?

【问题讨论】:

    标签: opengl math matrix opentk mirror


    【解决方案1】:

    这段代码很简单,可能并不完全正确,但对我有用。

    它使用 GLM。如果您不想使用 GLM,可以在线查找有关此方法的信息。

    bool scene::CalcMirrorMatrix (
        const glm::vec3 & eyePos, 
        const glm::vec3 & mirrorPos, 
        const glm::vec3 & mirrorNormal, 
        float mirrorSize, 
        glm::mat4 & outMirrorProjMatrix, 
        glm::mat4 & outMirrorViewMatrix )
    {
        //           Eye   N   R
        //             \   /\ /\
        //              \  |  /
        //               \ | /
        //               \/|/
        //         ----------------- Mirror
        //                / 
        //               / -R
        //              /
        //             \/
        //         MirrorEye
    
        glm::vec3 eyeV (mirrorPos-eyePos);      // eye to mirror center
    
        float dist = glm::length (eyeV);        // dist from eye to mirror
        eyeV = glm::normalize (eyeV);
    
        glm::vec3 N = glm::normalize (mirrorNormal); 
    
        if (glm::dot(N,eyeV) <= 0.0) 
            return false;                       // mirror looking backguards
    
        glm::vec3 R = glm::reflect (eyeV, N);   // reflected light vector, normalized.
    
        // Position of the 'eye' inside the mirror.
        glm::vec3 mirrorEyePos = mirrorPos - (R * dist);
    
        // Mirror camera FOV (perfect square mirror)
        //
        //                     _-| 
        //                  _-   | mirrorSize/2
        //               _-      |
        //   mirrorEye -----------
        //                  dist
        //
        float fovAngleRad = 2.0f * atanf ((mirrorSize/2.0f) / dist);
    
        // Final matrix
        outMirrorProjMatrix = glm::perspective (fovAngleRad, 1.0f, dist, cCamFarP);
        outMirrorViewMatrix = glm::lookAt (mirrorEyePos, mirrorPos, glm::vec3(0.0f,1.0f,0.0f));
    
        return true;
    }
    

    【讨论】:

    • 你能展示你使用这段代码的最终效果吗?我可以让它正常工作,反射越偏斜,效果越明显,我越远离镜子中心的相机。
    • 我还没有上线,方便展示。你的镜子是长方形的吗?如果不是正方形,您应该重复 FOV 计算以获取水平和垂直 FOV(来自水平和垂直镜像大小)。
    • 这不处理向上旋转的向量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多