本文已参与[新人创作礼]活动,一起开启掘金创作之路
图形学的数学基础(十八):几何图元-平面(下)
转载请注明出处
上章推导了平面方程的定义。这章介绍几种和平面有关的常见求交和计算点到平面距离的方法。
平面距原点的最短(垂直)距离
如果平面的法线是单位矢量,则平面方程的常数项d是原点到平面的有符号距离。

假设单位矢量n^ ⎣⎡abc⎦⎤,则平面上的一点P1可以写成⎣⎡DaDbDc⎦⎤的形式,D是从原点到平面的垂直有符号距离。因此我们可以将平面方程重写如下:
⎣⎡abc⎦⎤⋅⎣⎡x−Day−Dbz−Dc⎦⎤=0
a(x−Da)+b(y−Db)+c(z−Dc)=0
ax+by+cz−D(a2+b2+c2)=0
ax+by+cz−D∣∣n∣∣=0
因此原点到平面的垂直有符号距离 D=∣∣n∣∣d,其中d为平面方程的常数项。
任意点到平面的最短(垂直)距离
很多时候我们可能会有一个平面和一个不在平面内的点q,然后想要计算从该平面到q的距离。如果该距离为负数,则q在平面的背面,反之在正面。为此我们假设平面中的一个点p,它是该平面中与q最近的点,显然从p到q的矢量垂直于平面,因此它是an的另外一种形式。
对于平面ax+by+cz+d=0,任意一点q到平面的最短距离推导如下:
p+an=q
(p+an)⋅n=q⋅n
p⋅n+an⋅n=q⋅n
d∣∣n∣∣+a∣∣n∣∣2=q⋅n
d∣∣n∣∣+a∣∣n∣∣2=q⋅n^∣∣n∣∣
d+a∣∣n∣∣=q⋅n^
a=∣∣n∣∣q⋅n^−d
对于单位矢量则有:
a=q⋅n^−d
求解三平面的交点
求解三平面相交交点,我们只需要解三个平面方程组成的线性方程组即可:
⎩⎨⎧a1x+b1y+c1z+d1=0a2x+b2y+c2z+d2=0a3x+b3y+c3z+d3=0
可以写成矩阵的形式:
⎣⎡a1a2a3b1b2b3c1c2c3⎦⎤⎣⎡xyz⎦⎤=⎣⎡−d1−d2−d3⎦⎤
平面直线相交
空间中的平面和直线可能会相较于某一点,交点可以通过平面和直线的线性方程组求解:
{PlaneLineax+by+cz+d=0p1+tv=(x1+tvx,y1+tvy,z1+tvz)
t=avx+bvy+cvz−(ax1+by1+cz1+d)=n⋅v−(n⋅p1+d)
克莱默法则(Cramer′sRule)
克莱默法则,用于求解具有n个线性方程的方程组。
⎩⎨⎧a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2.........................................an1x1+an2x2+...+annxn=bn
若线性方程组的系数行列式不等于0,即detA=∣∣a11...a1n............an1...ann∣∣!=0
则线性方程组的解可以用行列式来表示:
x1=detAdetA1,x2=detAdetA2,xn=detAdetAn
其中detAn是把行列式detA中第n列的所有元素,依次用方程组右端的常数项替换。
求解线性方程组
根据克莱默法则,可知:
x=detAdetAx,y=detAdetAy,z=detAdetAz
detA=∣∣a1a2a3b1b2b3c1c2c3∣∣
detAx=∣∣−d1−d2−d3b1b2b3c1c2c3∣∣,detAy=∣∣a1a2a3−d1−d2−d3c1c2c3∣∣,detAz=∣∣a1a2a3b1b2b3−d1−d2−d3∣∣
p=n1⋅(n2×n3)−d1(n2×n3)−d2(n3×n1)−d3(n1×n2)
求两平面相交的直线方程
两个非平行平面会相交与一条线,直线方程可以用一个方向矢量v和一个点po来表示:po+tv,
v垂直于两个平面的法线n1和n2,因此v=n1×n2
现在需要找到直线上的任意一点po,根据上节内容,三个平面相交于一点,因此我们只需要构造出第三个平面(法线为v并且d = 0),因此第三个平面方程为:
vxx+vyy+vzz=0
根据上节三平面求交点公式:
po=n1⋅(n2×n3)−d1(n2×n3)−d2(n3×n1)−d3(n1×n2)
po=n1⋅(n2×v)−d1(n2×v)−d2(v×n1)
po=v⋅v(−d1n2+d2n1)×v
Line=po+tv=v⋅v(−d1n2+d2n1)×v+tv
参考
《3D数学基础》图形和游戏开发(第二版)
songho-openGL
克莱默法则