1. 程式人生 > >計算機圖形學:任意點相對於任意平面的反射矩陣

計算機圖形學:任意點相對於任意平面的反射矩陣

問題:已知空間中任意平面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 );