【问题标题】:Transform 3D points to 2D将 3D 点转换为 2D
【发布时间】:2011-06-07 11:42:58
【问题描述】:

我有一组点 (x1, x2,..xn) 位于由 Ax+ By+Cz+d=0 定义的平面上。 我想找到转换矩阵来平移和旋转到 XY 平面。因此,新的点坐标将为 x1'=(xnew, ynew,0)。

很多答案给出四元数、点或叉积矩阵。我不确定哪个是正确的方法。

谢谢

【问题讨论】:

  • 在我看来,似乎没有单一的变换矩阵——你不知道围绕表面法线(A、B、C)的旋转。如果您的表面是大头针上的便利贴(大头针是表面法线)并且我在不移动大头针的情况下旋转了便利贴,则不会记录下来。那么您是否只是在寻找任何保留距离和角度的变换?或者例如你有一对特定的点,你知道它们都在 x 轴上吗?

标签: math matrix 3d


【解决方案1】:

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

绕其旋转的轴R只是归一化平面法线V'Z的叉积。那是

R = V'×Z
  = (B', -A', 0)

您现在可以使用这个角度/轴对来构建 quaternion rotation,将数据集中的所有点旋转到平行于 XY 平面的平面。然后,我之前说过,只需放下 Z 分量即可在 XY 平面上执行正交投影。

更新: antonakos 在使用 API 获取轴/角度对之前对 R 进行规范化提出了一个很好的观点。

【讨论】:

  • 符号问题:R = V' × Z,而不是 R = Z × V'。另外值得注意的是,许多轴/角度 API 需要对 R 进行规范化(目前还没有)。
  • @antonakos:已更新。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多