首先,除非在平面方程中,d = 0,否则不能应用线性变换.您需要执行仿射变换.
一种方法是确定一个角度和矢量,使其旋转以使您的点集位于与XY平面平行的平面中(即,变换点集的Z分量都具有相同的值).然后你只需删除Z组件.
为此,让V为包含点的平面的标准化平面法线.为方便起见,从Ax + By + Cz + d = 0上方的平面方程定义:
V = (A, B, C) V' = V / ||V|| = (A', B', C') Z = (0, 0, 1)
哪里
A' = A / ||V|| B' = B / ||V|| C' = C / ||V|| ||V|| = (A2+B2+C2)1/2
角度将简单地是:
θ = cos-1(Z?V / ||V||) = cos-1(Z?V') = cos-1(C')
绕其旋转的轴R只是归一化平面法线V'和Z的叉积.那是
R = V'×Z = (B', -A', 0)
现在,您可以使用此角度/轴对来构建将数据集中的所有点旋转到与XY平面平行的平面所需的四元数旋转.然后,我先前说过,只需放下Z分量即可在XY平面上执行正交投影.
更新: antonakos 在使用采用轴/角度对的API之前,对R的归一化提出了一个很好的观点.