将3D点转换为2D

8
我有一组点(x1,x2,..xn),这些点位于由Ax+By+Cz+d=0定义的平面上。我想找到转换矩阵,将其平移到XY平面并进行旋转。因此,新的点坐标将为x1'=(xnew, ynew,0)。
很多答案提供四元数、点积或叉积矩阵。我不确定哪一个是正确的方法。
谢谢。

1
对我来说,似乎没有单一的转换矩阵 - 你不知道绕表面法线(A、B、C)旋转的情况。如果你的表面是钉子上的便条纸(钉子是表面法线),而我旋转了便条纸而不移动钉子,那就不会被记录下来。所以你只是在寻找保持距离和角度的任何变换吗?或者例如,你有一对特定的点,你知道它们都在x轴上吗? - Tommy
1个回答

8
首先,除非在你的平面方程中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(ZV / ||V||)
  = cos-1(ZV')
  = cos-1(C')

旋转的轴R就是规范化平面法线V'Z的叉积。即

R = V'×Z
  = (B', -A', 0)
你现在可以使用这个角度/轴对来构建所需的四元数旋转,以将数据集中所有点旋转到与XY平面平行的平面上。然后,就像我之前说的那样,只需删除Z分量即可执行正交投影到XY平面上。 更新: antonakos提出了一个很好的观点,在使用轴/角度对的API之前需要对R进行归一化处理。

1
一个符号问题:R = V' × Z,而不是 R = Z × V'。另外值得注意的是,许多轴/角度API需要将 R 规范化(但它还没有被规范化)。 - antonakos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接