使用向量

时间:2015-05-08 16:45:50

标签: ios math geometry

我有3D点,我需要将它们的2D正投影投影到由原点和普通n定义的平面上。这意味着基本上从顶部看(点给定垂直向量)。我该怎么办?

我在想的是:

  1. 将投影点P投影到3D平面上:P - P dot n * n
  2. 从"返回"看看3D平面关于正常(不确定如何定义)
  3. 使用平面中点的最大 - 最小坐标进行正射投影以定义剪辑
  4. 我正在使用iOS。

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是:

  1. 旋转坐标系,使感兴趣的平面位于x-y平面,法线向量n与z轴对齐
  2. 通过将点的z分量设置为0
  3. ,将点投影到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 },这是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 ]
    

    转换积分

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

    1. P_transformed = M*P
    2. P_plane = set the third row of P_transformed to zero
    3. P_plane的x-y坐标现在是平面中的2D坐标系。

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