转载请注明出处http://hi.baidu.com/wsliulao5/blog/item/bca731dde0a26cdc8d10291f.html,谢谢。
问题:已知空间中任意平面n*(x-x0,y-y0,z-z0)=0和空间中任意点V,其中n为该平面的法向量,x0,y0,z0为该平面上的一点。
求:该点相对于该平面的镜像点v'和V到V'的转换矩阵,如下图所示:
该平面方程也可以表示为n*p+d=0,其中p=(x,y,z),d= -n*(x0,y0,z0)。假设点V到平面的距离是k,且点V位于平面的正半空间,则由向量知识及上图,我们可知v=v'+2k*n/|n|,于是,v'=v-2k*n/|n|。
下面我们来求点V到平面的距离k:
点V和平面上的点(x0,y0,z0)所形成的向量在平面的法向量上的投影就是k,于是k=n*(Vx-x0,Vy-y0,Vz-z0)=n*V+d
于是v'=v-2(n*v + d)*n/|n|
即(x',y‘,z',1)=(x,y,z,1)- 2n*V*n/|n| - 2d*n/|n|
整理得
x' = x - 2(nx*Vx + ny*Vy + nz*Vz)*nx/|n| - 2d*nx/|n|
y' = y - 2(nx*Vx + ny*Vy + nz*Vz)*ny/|n| - 2d*ny/|n|
x' = z - 2(nx*Vx + ny*Vy + nz*Vz)*nz/|n| - 2d*nz/|n|
其中nx,ny,nz为向量n的各个分量,Vx,Vy,Vz为向量V的各个分量。
于是得转换矩阵为:
| -2nx*nx/|n| + 1 -2ny*nx/|n| -2nz*nx/|n| 0 |
| -2nx*ny/|n| -2ny*ny/|n| + 1 -2nz*ny/|n| 0 |
| -2nx*nz/|n| -2ny*nz/|n| -2nz*nz/|n| + 1 0 |
| -2nx*d/|n| -2ny*d/|n| -2nz*d/|n| 1 |
如果n为单位向量,则上式可以简化为
x' = x - 2(nx*Vx + ny*Vy + nz*Vz)*nx - 2d*nx
y' = y - 2(nx*Vx + ny*Vy + nz*Vz)*ny - 2d*ny
x' = z - 2(nx*Vx + ny*Vy + nz*Vz)*nz - 2d*nz
于是转换矩阵可以简化为:
| -2nx*nx + 1 -2ny*nx -2nz*nx 0 |
| -2nx*ny -2ny*ny + 1 -2nz*ny 0 |
| -2nx*nz -2ny*nz -2nz*nz + 1 0 |
| -2nx*d -2ny*d -2nz*d 1 |
如点V位于平面的负半空间,假设此时平面的法向量为n',n'相对于原点对称的向量为n,则-n'=n,于是我们有v'=V + 2kn'/|n'| = V - 2kn/|n|,根据以上可知结论不变。
如点V位于平面上,则k=n*V+d=0,于是V'=V,故结论不变(以上矩阵由v'=v-2(n*v + d)*n/|n|得出,故x' = x - 2(nx*Vx + ny*Vy + nz*Vz)*nx - 2d*nx=x,于是结论矩阵任然正确)。
D3D中有一个函数用于创建反射矩阵:
D3DXMATRIX *D3DXMxtrixReflect( D3DXMATRIX *pOut, CONST D3DXPLANE *pPlane );