【Computer Graphics】3D引擎中的几何学:三维空间中的平面及相关计算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LeeXxs/article/details/82871804

内容

  1. 参数化表达式
  2. 求平面法向量
  3. 求点到平面的距离
  4. 求直线与平面交点
  5. 求三个平面斜交

1.  参数化表达式

已知一个三维点 P 与法向量 N,设过点 P 且与 N 垂直的平面为点 Q 的合集,那么 Q 满足:

 \small N\cdot (Q-P)=0

除此之外,平面方程还有一种常用的表达方式:

 \small Ax+By+Cz+D=0

这里的 A,B,C 其实就是法向量 N 的 x,y,z 分量,而 \small D=-N \cdot P


2. 求平面法向量

  • 已知平面上两条不共线的直线 \small a = (l,m,n)\small b=(o,p,q),求法向量:

而根据叉积的定义,两个向量的叉积所得的向量和这两个向量垂直;

根据平面性质,垂直于平面的直线与平面上任何一条直线垂直;

因此,平面上两不共线直线的叉积(两平行直线的叉积为0),就是该平面的法向量,方向遵循右手定则。 

  • 已知平面方程 \small Ax+By+Cz+D=0,求法向量:

上述平面方程的三个系数所组成的向量 \small N =(A,B,C),就是平面的一个法向量,证明如下:

设过平面上一点 \small (x_0,y_0,z_0) 的一个法向量为 \small N =(A,B,C),该向量垂直于面上任意一条直线;

\small (x,y,z) 为平面上任意一点,则平面上的向量均可表示为:\small (x-x_0,y-y_0,z-z_0),

因为向量 \small N =(A,B,C) 与向量 \small (x-x_0,y-y_0,z-z_0)%uFF0C 垂直,所以其数量积为0,即:

\small A(x-x0)+B(y-y0)+C(z-z0)=0

整理得:\small Ax+By+Cz+D=0


3. 求点到平面的距离

对于平面S1,有方程 \small Ax+By+Cz+D=0

之前已经提到了 \small D = -N\cdot P,N为平面的法向量,P是平面S1上一点;

因为N是向量,P是一个点,可以先把 \small N\cdot P 看做是向量N和向量OP的乘积(O为原点),

以下描述和公式中的向量P皆指代向量OP。

设过原点O与S1平行的平面为S0,因为:

\small D=-N\cdot P

\small N\cdot P=|N||P|\cos \theta

其中\small \theta为量N和向量P的夹角,\small |P|\cos \theta 是向量P在法线向量N上投影的矢量大小,也是S0和S1的之间的距离,则:

S0和S1的之间的距离为: \small \left \| P \right \|\cos \theta =\frac{N\cdot P}{\left \| N \right \|}=\frac{|D|}{\left \| N \right \|} 。

同理,设任意一点R,假设过点R且与平面S1,S0平行的平面为S2,则S0和S2之间的距离d2为:

\small \left \| R \right \|\cos \alpha = \frac{ N\cdot R}{ \left \| N \right \|}

若平面法向量N为单位向量,则点R到平面S1的距离为S0和S1之间的距离减去S0和S2之间的距离,即:

\small d=N\cdot Q+D

若d=0,则点R位于平面上;

若d>0,则点R位于平面法向量所指的一侧,称为平面的正向侧

若d<0,则点R位于平面的负向侧


4. 求直线与平面交点

求一条直线和一个平面的交点是3D图形引擎中的普通计算,比如说在多边形裁剪中被广泛使用。

设过点S且与方向V平行的直线的表达式为:\small P(t)=S+tV

设有一法向量为N且到原点的符号距离为D的平面,那么则存在:

\small N\cdot P(t)+D = 0

即存在P(t)直线过该平面的一点(当然也可能直线和平面平行了,没有交点)

解上述关于P(t)的方程,即可获得直线与平面的交点。将P(t)替换为\small S+tV,可得:

\small N\cdot S+(N\cdot V)t +D = 0

求解关于t的方程,可得:

\small t=\frac{-(N\cdot S+D)}{N\cdot V}

将t的值代入直程即可求得交点。

如果 \small N\cdot V=0,则直线与平面平行,且平面法向量N与直线方向向量V垂直,

此时,若\small N\cdot S+D=0,则直线位于平面上,否则无交点。


5. 求三个平面斜交

一个空间的区域通常表示成由一系列平面为边界组成的凸面多面体的形式。该多面体的边和顶点可以通过执行多次三个平面的求交运算得出。

  • 求三个平面交于一点

\small L_1=<N_1,D_1>\small L_2=<N_2,D_2>\small L_3=<N_3,D_3>,为任意三个平面;

通过计算以下方程组的解可以得到同时位于这三个平面的点Q:

\small L_1\cdot Q=0
           \small L_2\cdot Q=0
           \small L_3\cdot Q=0

写成矩阵形式:

\small MQ=\begin{bmatrix} -D_1\\-D_2 \\ -D_3 \end{bmatrix}

其中,矩阵M的表达式如下:

\small M=\begin{bmatrix} (N_1)_x & (N_1)_y& (N_1)_z \\ (N_2)_x & (N_2)_y& (N_2)_z \\ (N_3)_x & (N_3)_y& (N_3)_z \end{bmatrix}

假设矩阵M可逆,计算下式可得到三个平面的唯一交点Q:

\small Q=M^{-1}\begin{bmatrix} -D_1\\-D_2 \\ -D_3 \end{bmatrix}

如果矩阵M是奇异矩阵,即行列式为0:\small detM=0,则这三个平面不相交与一点;

当三个平面法向量位于同一平面时,会出现这种情况,下图所示就是情况之一:

  • 求两个平面交于一条直线

设有两个不平行的平面 \small L_1 = <N_1,D_1>\small L_2 = <N_2,D_2> 相交时,其交于一条直线,如下图所示:

交线的方向V与两个平面的法向量都垂直,可表示为 \small V=N_1\times N_2

已知交线的方向,为了完整获取表达式,还需要知道直线上的一点;

为此,构造经过原点且法向量为V的第三个平面 \small L_3= <V,0>

可以确保三个平面交于一点,该点为平面 \small L_1 和 \small L_2 上的一点;

利用之前推倒的求三个平面的唯一交点的公式,可以得到交点Q:

\small Q=\begin{bmatrix} (N_1)_x &(N_1)_y &(N_1)_z \\ (N_2)_x& (N_2)_y & (N_2)_z\\ V_x& V_y & V_z \end{bmatrix}^{-1}\begin{bmatrix} -D_1\\-D_2 \\ 0 \end{bmatrix}

则平面 \small L_1\small L_2 交线的表达式为 \small P(t) = Q + tV


猜你喜欢

转载自blog.csdn.net/LeeXxs/article/details/82871804