【问题标题】:Ortho projection of 3D points with a vector使用向量对 3D 点进行正射投影
【发布时间】:2015-05-08 16:45:50
【问题描述】:

我有 3D 点,我需要将它们进行 2D 正交投影到由原点和法线 n 定义的平面上。这基本上是从顶部看点(给定垂直向量)。我该怎么做?

我的想法是:

  1. 将点 P 投影到 3D 平面上:P - P dot n * n
  2. 相对于法线从“背面”查看 3D 平面(不确定如何定义)
  3. 使用平面中点的最大-最小坐标进行正射投影以定义剪裁

我正在使用 iOS。

【问题讨论】:

  • P - P dot n * n 应该足以将点投影到平面上。也许我错过了什么?
  • @eigenchris 我需要将二维坐标系放在该平面上,以便比较点的 x 和 y 坐标
  • 我明白了。我会写一个答案。

标签: ios math geometry


【解决方案1】:

一种方法是:

  1. 旋转坐标系,使关注平面位于 x-y 平面,法向量n与z轴对齐
  2. 通过将点的 z 分量设置为 0 将点投影到 x-y 平面上

设置坐标变换

这个问题有无限多的解决方案,因为我们总是可以在 x-y 平面上旋转一个解决方案来获得另一个有效的解决方案。

为了解决这个问题,让我们选择一个向量v,它位于转换后将与 x 轴对齐的平面中。任何向量都可以;让我们取平面中坐标为x=1y=0 的向量。

由于我们的平面与原点相交,其方程为:

x*n1 + y*n2 + z*n3 = 0
z = -(x*n1 + y*n2)/n3

替换x=1y=0后,我们看到

v = [1 0 -n1/n3]

我们还需要确保v被规范化,所以设置

v = v/sqrt(v1*v1 + v2*v2 + v3*v3)

编辑:在n3=0 的情况下,上述方法将失败。找到v 的另一种方法是从我们的点集中取一个随机点P1,它不是n 的标量倍数并计算v = P1 - P1 dot n * n,这是@ 的投影987654337@上飞机。继续搜索您的积分,直到找到满足 (P1 dot n/norm(n)) != P1 的积分,这保证有效。

现在我们需要一个向量u,它将在转换后与 y 轴对齐。我们从nv 的叉积得到这个:

u = n cross v

如果nv 被规范化,那么u 被自动规范化。

接下来,创建矩阵

M = [ v1 v2 v3 ]
    [ u1 u2 u3 ]
    [ n1 n2 n3 ]

转换点

现在给定一个 3×N 点数组P,我们只需按照上面的两个步骤进行

  1. P_transformed = M*P
  2. P_plane = set the third row of P_transformed to zero

P_plane 的 x-y 坐标现在是平面中的二维坐标系。

如果您需要取回 3D 空间坐标,只需使用 P_space = M_transpose*P_plane 进行反向转换即可。

【讨论】:

  • v 是否相当于 up 向量?
  • @aledalgrande vu 是平面的坐标轴。您可以将它们视为平面内的新 xy 轴。我不确定您所说的 up vector 是什么意思。
  • 我明白了,你对我的想法采取了不同的方式。谢谢!
  • @aledalgrande 没问题。也可以先使用P - P dot n * n,然后然后变换,但是变换后置零的方法更简单。
  • 一个问题,如果法线是[0 -1 0]怎么办?
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 2011-07-29
  • 2010-09-12
  • 1970-01-01
  • 2015-03-07
  • 2015-09-05
  • 2014-05-18
  • 2018-06-20
相关资源
最近更新 更多