2015-05-08 61 views
2

我有3D点,我需要将它们的2D正投影投影到由原点和正常的n定义的平面上。这个的含义基本上是,看上面的点(给出垂直向量)。我该怎么做?带有矢量的3D点的正投影

我在想什么是:

  1. 项目点P到3D平面:P - P dot n * n
  2. 看看从“回来”的3D平面中相对于正常(不知道如何定义这一点)
  3. 使用点的最大最小坐标平面定义裁剪

我与iOS的工作做一个邻投影。要做到这一点

+0

'P - P点n * n'应该足以将点投影到飞机上。也许我错过了什么? – eigenchris

+0

@eigenchris我需要将二维坐标系置于该平面上,以便我可以比较点的x和y坐标 – aledalgrande

+0

我明白。我会写一个答案。 – eigenchris

回答

0

一种方法是:

  1. 旋转,以便感兴趣的平面位于xy平面坐标系统,以及法线n与Z轴对准
  2. 通过他们的z分量设置为0

设置的坐标投影点到xy平面inate转换

由于我们总是可以在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,这是P1到平面的投影。只要继续搜索你的积分,直到找到满足(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 ] 

变换点

现在给出乘N阵列点P的3中,我们只需按照上述

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

P_plane的x-y坐标现在是平面中的2D坐标系。

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

+0

'v'等价于_up_矢量吗? – aledalgrande

+0

@aledalgrande'v'和'u'是飞机的坐标轴。你可以把它们想象成飞机内新的'x'和'y'轴。我不确定你的意思是* up vector *。 – eigenchris

+0

我明白了,你去了一个与我脑海中不同的方式。谢谢! – aledalgrande