美文网首页
镜面反射矩阵的推导

镜面反射矩阵的推导

作者: 光棍狗没有可持续发展 | 来源:发表于2018-08-16 11:27 被阅读0次

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定,根据反射平面先推导出反射位置,再进行旋转即可得到反射矩阵。
    反射位置:

    b00c349b033b5bb56e0f044b31d3d539b700bc67.jpg
    aca3033b5bb5c9eabd2b2756d239b6003bf3b367.jpg
    反射方向:
    9b035bb5c9ea15ce9f36c4bcb1003af33b87b267.jpg
    c38dc9ea15ce36d37fdca7853df33a87e850b167.jpg
    第二点是根据投影向量获得
    U_proj_on_V_readme.JPG
    n向量是单位向量所以投影向量公式的分母可以去掉。
    M1M2即得到反射矩阵。
    static Matrix4x4 CalculateReflectionMatrix (Matrix4x4 reflectionMat, Vector4 plane)
    {
    reflectionMat.m00 = (1.0F - 2.0F
    plane[0]plane[0]);
    reflectionMat.m01 = ( - 2.0F
    plane[0]plane[1]);
    reflectionMat.m02 = ( - 2.0F
    plane[0]plane[2]);
    reflectionMat.m03 = ( - 2.0F
    plane[3]*plane[0]);
        reflectionMat.m10 = (   - 2.0F*plane[1]*plane[0]);
        reflectionMat.m11 = (1.0F - 2.0F*plane[1]*plane[1]);
        reflectionMat.m12 = (   - 2.0F*plane[1]*plane[2]);
        reflectionMat.m13 = (   - 2.0F*plane[3]*plane[1]);
    
        reflectionMat.m20 = (   - 2.0F*plane[2]*plane[0]);
        reflectionMat.m21 = (   - 2.0F*plane[2]*plane[1]);
        reflectionMat.m22 = (1.0F - 2.0F*plane[2]*plane[2]);
        reflectionMat.m23 = (   - 2.0F*plane[3]*plane[2]);
    
        reflectionMat.m30 = 0.0F;
        reflectionMat.m31 = 0.0F;
        reflectionMat.m32 = 0.0F;
        reflectionMat.m33 = 1.0F;
        
        return reflectionMat;
    }
    

    其中代码中4维数组plane存的是点法线式平面方程的参数。

    相关文章

      网友评论

          本文标题:镜面反射矩阵的推导

          本文链接:https://www.haomeiwen.com/subject/xbrwbftx.html