最近公司游戏正在准备上线,所以FlasCC也就没有研究了,偶尔有闲功夫,也是玩玩3DMAX和UNITY3D。 感觉不会3DMAX,是一种局限。
回到主题,记录一下镜面反射矩阵的推导。
在用Irrlicht和RTT做镜面效果的时候,用到了反射矩阵。 就是需要把摄相机镜像,渲染一个RT,贴到镜面模型上。这个其实还纠结了许久,因为之前做水面渲染的时候,水面是平的,很好计算摄相机在水面以下的位置。 但是换成镜面,就不一样了,因为镜面可能是任意面。 于是就需要一个通用的反射矩阵。
反射矩阵的计算是基于平面的,因为,任何反射,都需要一个反射面。
所以,我们先给出平面表示 Plane(nx,ny,nz,d); 其中(nx,ny,nz)已经单位化。
然后,我们假设空间中有任意一点P(x,y,z,1)
设这个点P以Plane为反射面的镜像点为P1(x1,y1,z1,w)。
---------------------------------------------
根据定理,我们知道, 若两个点以某一点为镜像,则两个点的坐标之和除以2,就刚好是中点。
这个理论我们用到这里的话, 那这个中点就刚好是平面上的一个点。 平面上的这个点就是 P(x,y,z,1) - (nx,ny,nz,0)*D . 其中D就是点P到平面的距离
而D=Plane dot P = (x*nx+y*ny+z*nz+d);
由上面的描述,我们马上想到,那么要求点P1的话,就是这样
(P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D
=> P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D
=>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d)
换成矩阵形式则为
|1-2*nx*nx -2*nx*ny -2*nx*nz 0 |
| -2*ny*nx 1 - 2*ny*ny -2*ny*nz 0 |
P1 = {x,y,z,1} x | -2*nz*nx -2*nz*ny 1-2*nz*nz 0 |
| -2*d*nx -2*d*ny -2*d*nz 1 |
大功告成
btw:这是行主矩阵表示法