我有3D点,我需要将它们的2D正投影投影到由原点和普通n
定义的平面上。这意味着基本上从顶部看(点给定垂直向量)。我该怎么办?
我在想的是:
P - P dot n * n
我正在使用iOS。
答案 0 :(得分:0)
这样做的一种方法是:
n
与z轴对齐0
设置坐标转换
这个问题有很多解决方案,因为我们总是可以在x-y平面上旋转解决方案以获得另一个有效的解决方案。
要解决这个问题,让我们选择一个位于平面中的向量v
,该向量将在转换后与x轴对齐。任何矢量都可以;让我们在坐标为x=1
和y=0
的平面中拍摄矢量。
由于我们的平面与原点相交,其等式为:
x*n1 + y*n2 + z*n3 = 0
z = -(x*n1 + y*n2)/n3
在替换x=1
,y=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轴对齐。我们从n
和v
:
u = n cross v
如果n
和v
已标准化,则u
会自动归一化。
接下来,创建矩阵
M = [ v1 v2 v3 ]
[ u1 u2 u3 ]
[ n1 n2 n3 ]
转换积分
现在给出一个3乘N的点P
数组,我们只需按照上面的两个步骤进行操作
P_transformed = M*P
P_plane = set the third row of P_transformed to zero
P_plane
的x-y坐标现在是平面中的2D坐标系。
如果您需要返回3D空间坐标,只需使用P_space = M_transpose*P_plane
进行反向转换。