具有向量的 3D 点的正射投影
Ortho projection of 3D points with a vector
我有 3D 点,我需要将它们进行 2D 正交投影到由原点和法线定义的平面上 n
。这个的意思基本上是从顶部看点(给定垂直向量)。我该怎么做?
我的想法是:
- 将点 P 投影到 3D 平面上:
P - P dot n * n
- 从 "back" 看 3D 平面相对于法线(不确定如何定义)
- 使用平面中各点的最大-最小坐标进行正射投影以定义剪裁
我正在与 iOS 合作。
一种方法是:
- 旋转坐标系,使感兴趣平面位于x-y平面,法向量
n
与z轴对齐
- 通过将点的 z 分量设置为
0
将点投影到 x-y 平面上
设置坐标变换
这个问题有无限多种解法,因为我们总是可以在 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坐标现在是平面中的二维坐标系。
如果需要取回3D空间坐标,用P_space = M_transpose*P_plane
进行逆向变换即可。
我有 3D 点,我需要将它们进行 2D 正交投影到由原点和法线定义的平面上 n
。这个的意思基本上是从顶部看点(给定垂直向量)。我该怎么做?
我的想法是:
- 将点 P 投影到 3D 平面上:
P - P dot n * n
- 从 "back" 看 3D 平面相对于法线(不确定如何定义)
- 使用平面中各点的最大-最小坐标进行正射投影以定义剪裁
我正在与 iOS 合作。
一种方法是:
- 旋转坐标系,使感兴趣平面位于x-y平面,法向量
n
与z轴对齐 - 通过将点的 z 分量设置为
0
将点投影到 x-y 平面上
设置坐标变换
这个问题有无限多种解法,因为我们总是可以在 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坐标现在是平面中的二维坐标系。
如果需要取回3D空间坐标,用P_space = M_transpose*P_plane
进行逆向变换即可。