計算機圖形學:任意點相對於任意平面的反射矩陣
問題:已知空間中任意平面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 );