坐标系变换,3d投影到2d平面
Coordinate system transformation, 3d projection to 2d plane
我有一个全局坐标系(X、Y、Z)和一个带点的三角形(A、B、C 和中心)。我知道这些点的所有坐标。
- 我需要将全局坐标系从 (0; 0; 0) 移动到三角形中心,以便所有点:A、B、C 和中心都有新的坐标,其中 Z = 0。之后我需要知道那些点的新坐标与新坐标系的关系。新坐标系的方向不重要
- 此外,如果有可能将 3D 点(三角形点)转换为 2D 平面而不丢失其几何形状(大小)。应该不是二维平面的投影。
>> 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
问题可以表示为找到 3×3 矩阵 M
使得点 P
的坐标可以在旧坐标系(P_old
, 3 行) 和新坐标系 (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
由新基在旧系统中的坐标组成,每列一个基向量。现在必须找到这样一个基础。
这个依据可以取自(这都是伪代码):
重新规范化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)
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
的乘积
可以取叉积得到笛卡尔坐标系的第三个向量:
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|
则M可以取为|V1 V2 V3|
(每个Vx
在3行),然后用公式(2)计算其逆。
此转换(使用倒置的 M)应该为三角形平面上第三轴为 0 的点生成新坐标(使其成为该平面上的二维坐标),并保持大小根据欧几里得范数。
我有一个全局坐标系(X、Y、Z)和一个带点的三角形(A、B、C 和中心)。我知道这些点的所有坐标。
- 我需要将全局坐标系从 (0; 0; 0) 移动到三角形中心,以便所有点:A、B、C 和中心都有新的坐标,其中 Z = 0。之后我需要知道那些点的新坐标与新坐标系的关系。新坐标系的方向不重要
- 此外,如果有可能将 3D 点(三角形点)转换为 2D 平面而不丢失其几何形状(大小)。应该不是二维平面的投影。
>> 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
问题可以表示为找到 3×3 矩阵 M
使得点 P
的坐标可以在旧坐标系(P_old
, 3 行) 和新坐标系 (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
由新基在旧系统中的坐标组成,每列一个基向量。现在必须找到这样一个基础。
这个依据可以取自(这都是伪代码):
重新规范化
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)
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
的乘积
可以取叉积得到笛卡尔坐标系的第三个向量:
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|
则M可以取为|V1 V2 V3|
(每个Vx
在3行),然后用公式(2)计算其逆。
此转换(使用倒置的 M)应该为三角形平面上第三轴为 0 的点生成新坐标(使其成为该平面上的二维坐标),并保持大小根据欧几里得范数。