镜面反射矩阵的推导

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

镜面反射矩阵的推导_第1张图片
b00c349b033b5bb56e0f044b31d3d539b700bc67.jpg

镜面反射矩阵的推导_第2张图片
aca3033b5bb5c9eabd2b2756d239b6003bf3b367.jpg

反射方向:
镜面反射矩阵的推导_第3张图片
9b035bb5c9ea15ce9f36c4bcb1003af33b87b267.jpg

c38dc9ea15ce36d37fdca7853df33a87e850b167.jpg

第二点是根据投影向量获得
镜面反射矩阵的推导_第4张图片
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存的是点法线式平面方程的参数。

你可能感兴趣的:(镜面反射矩阵的推导)