坐标系转换,3d投影到2d平面

时间:2016-07-26 11:36:21

标签: c++ matlab math coordinates coordinate-systems

我有一个全局坐标系(X,Y,Z)和一个带点(A,B,C和中心)的三角形。我知道那些点的所有坐标。

  1. 我需要将全局坐标系从(0; 0; 0)移动到三角形中心,这样所有的点:A,B,C和Center都会有新坐标,其中Z = 0.之后我需要知道与新坐标系的关系中那些点的新坐标。新坐标系的方向并不重要。
  2. 此外,如果有可能将3D点(三角形点)转换为2D平面而不会丢失其几何形状(大小)。它不应该是2D平面的投影。
  3. >> A=[10.63307; -7.72528; 21.26636];
    B=[4.06139; -12.49988; 21.26636];
    C=[-6.57172; -20.22529; 13.14344];
    Centr=[-4.38113; -13.48349; 18.55872];
    
    >> V1=(B-A)/(norm(B-A))
    
    V1 =
    
       -0.8090
       -0.5878
             0
    
    >> V2=((C-A)-(dot((C-A),V1)*V1))/(norm((C-A)-(dot((C-A),V1)*V1)))
    
    V2 =
    
        0.0000
       -0.0000
       -1.0000
    
    >> V3=cross(V1,V2)
    
    V3 =
    
        0.5878
       -0.8090
        0.0000
    
    >> M=[V1,V2,V3]
    
    M =
    
       -0.8090    0.0000    0.5878
       -0.5878   -0.0000   -0.8090
             0   -1.0000    0.0000
    
    >> Anew=inv(M)*(A-Centr)
    
    Anew =
    
      -15.5313
       -2.7076
        4.1666
    
    >> Bnew=inv(M)*(B-Centr)
    
    Bnew =
    
       -7.4083
       -2.7076
        4.1666
    
    >> Cnew=inv(M)*(C-Centr)
    
    Cnew =
    
        5.7350
        5.4153
        4.1666

    这就是我得到的: From this

    To this

1 个答案:

答案 0 :(得分:2)

问题可以表示为找到3乘3矩阵M,以便可以在旧坐标系(P,3之间转换点P_old的坐标行)和新的坐标系(P_new,3行)。这是一个仿射变换:

P_old = Center + M * P_new     (1)

使用M的(矩阵向量)乘法将其定向回旧系统,并添加Center的坐标将其转换回旧原点。

然后可以将等式(1)变为:

P_new = M^{-1} * (P_old - Center)     (2)

其中M^{-1}M的倒数,用于计算旧坐标的新坐标(如果该点属于三角形平面,则第三行将为0)。

矩阵M由旧系统中新基础的坐标构成,每列中有一个基础向量。现在必须找到这样的基础。

这个基础可以从(这是所有伪代码)中获取:

  1. 重整归一化AB

           AB
    V1 = ______
        || AB ||
    
    • AB此处为向量AB(顶部带箭头):

      |b_x - a_x|
      |b_y - a_y|
      |b_z - a_z|
      
    • || . ||是欧几里德规范(^2表示正方形,而不是 xor ):

      || V || = sqrt(V_x^2 + V_y^2 + V_z^2)
      
  2. AC(也是一个矢量,定义为AB),但减去V1上的投影,使其与V1正交,并重新规范化(此如果三角形实际上不是三角形,则会以零除零失败):

            AC - (AC.V_1) V1
    V2 = _______________________
         || AC - (AC.V_1) V1 ||
    
    • M.N是标量产品:

      M.N = M_x * N_x + M_y * N_y + M_z * N_z
      
    • (AC.V_1) V1只是标量(AC.V_1)的产物,带有向量,V1

  3. 第三个矢量,可以作为交叉乘积来得到笛卡尔坐标系:

    V3 = V1 x V2
    
    • 交叉产品定义为:

                |V1_y*V2_z - V1_z*V2_y|
      V1 x V2 = |V1_z*V2_x - V1_x*V2_z|
                |V1_x*V2_y - V1_y*V2_x|
      
  4. 然后M可以被视为|V1 V2 V3|(每个Vx在3行上),然后它的逆计算使用公式(2)。

    这种变换(倒M)应该为三角平面上的点生成新坐标,第三轴上有0(这使得它在该平面上具有2D坐标),并保留大小欧几里得规范。