通过平面反射场景 - 在openGL中镜像

时间:2018-02-04 22:09:26

标签: opengl math matrix opentk mirror

我正在尝试使用模板缓冲区创建具有平面平面镜的场景。当我试图在第二次渲染过程中反映我的视点时,我已经陷入了困境,如https://www.opengl.org/archives/resources/code/samples/advanced/advanced97/notes/node90.html所描绘的那样。我需要在viewmatrix上应用哪些转换才能达到预期效果?为了简化我试图在XY平面上设置平面并按(1,1,-1)缩放视图矩阵,但它不能按我的预期工作。可以指出我如何反映这个视图矩阵,以便我可以渲染镜像场景或有其他方法吗?

1 个答案:

答案 0 :(得分:0)

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

它使用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;
}