我有一组点(x1,x2,... xn)位于由Ax + By + Cz + d = 0定义的平面上。 我想找到转换矩阵来平移和旋转到XY平面。因此,新的点坐标将是x1'=(xnew,ynew,0)。
许多答案给出了四元数,点数或交叉积矩阵。我不确定哪一个是正确的方法。
谢谢
答案 0 :(得分:8)
首先,除非在您的平面方程式中,d = 0,否则您无法应用linear transformation。您需要执行affine transformation。
执行此操作的一种方法是确定要旋转的角度和矢量,以使您的点集位于与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平面平行的平面所需的quaternion rotation。然后,我先前说过,只需放下Z分量即可在XY平面上执行正交投影。
更新:在使用采用轴/角度对的API之前,antonakos对于 R 的标准化提出了一个很好的观点。