反射矩陣(reflection matrix)推導


設平面為(nx,ny,nz,d),則以此平面為鏡面的列主序反射矩陣如下:

推導如下:

一,平面的表示:

如圖所示,過點p,法向量為n的平面,可表示為:

np+d=0

其中d為平面到原點的有向距離。如果平面面向原點,則d為正,如果平面背向原點,則d為負。

於是平面可以表示為四維向量(nx,ny,nz,d)。

二,reflection matrix推導:

如圖平面為np+d=0,Q為空間任一點,Q'為Q在平面上的投影,Q''為Q關於平面的對稱點,有如下關系:

r=Q-p

a=(rn)n

b=r-a

c=-a

Q'=p+b

Q''=Q'+c

np+d=0

綜合以上各式,得:

Q''=Q-2(Qn+d)n

寫成分量形式即:

Q''x=Qx-2(Qx*nx+Qy*ny+Qz*nz+d)*nx

Q''y=Qy-2(Qx*nx+Qy*ny+Qz*nz+d)*ny

Q''z=Qz-2(Qx*nx+Qy*ny+Qz*nz+d)*nz

整理得:

Q''x=Qx(1-2nx*nx)+Qy(-2ny*nx)+Qz(-2nz*nx)-2d*nx

Q''y=Qx(-2nx*ny)+Qy(1-2ny*ny)+Qz(-2nz*ny)-2d*ny

Q''z=Qx(-2nx*nz)+Qy(-2ny*nz)+Qz(1-2nz*nz)-2d*nz

寫成矩陣形式即:

這樣就得到了reflection matrix。

unity standard assets里的Water.cs中有下面一段計算reflection matrix的代碼,與上面結果一致:

 // Calculates reflection matrix around the given plane
        static void CalculateReflectionMatrix(ref Matrix4x4 reflectionMat, Vector4 plane)
        {
            reflectionMat.m00 = (1F - 2F * plane[0] * plane[0]);
            reflectionMat.m01 = (- 2F * plane[0] * plane[1]);
            reflectionMat.m02 = (- 2F * plane[0] * plane[2]);
            reflectionMat.m03 = (- 2F * plane[3] * plane[0]);

            reflectionMat.m10 = (- 2F * plane[1] * plane[0]);
            reflectionMat.m11 = (1F - 2F * plane[1] * plane[1]);
            reflectionMat.m12 = (- 2F * plane[1] * plane[2]);
            reflectionMat.m13 = (- 2F * plane[3] * plane[1]);

            reflectionMat.m20 = (- 2F * plane[2] * plane[0]);
            reflectionMat.m21 = (- 2F * plane[2] * plane[1]);
            reflectionMat.m22 = (1F - 2F * plane[2] * plane[2]);
            reflectionMat.m23 = (- 2F * plane[3] * plane[2]);

            reflectionMat.m30 = 0F;
            reflectionMat.m31 = 0F;
            reflectionMat.m32 = 0F;
            reflectionMat.m33 = 1F;
        }

 參考:http://www.euclideanspace.com/maths/geometry/affine/reflection/matrix/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM