我有3D点,我需要将它们的2D正投影投影到由原点和正常的n
定义的平面上。这个的含义基本上是,看上面的点(给出垂直向量)。我该怎么做?带有矢量的3D点的正投影
我在想什么是:
- 项目点P到3D平面:
P - P dot n * n
- 看看从“回来”的3D平面中相对于正常(不知道如何定义这一点)
- 使用点的最大最小坐标平面定义裁剪
我与iOS的工作做一个邻投影。要做到这一点
我有3D点,我需要将它们的2D正投影投影到由原点和正常的n
定义的平面上。这个的含义基本上是,看上面的点(给出垂直向量)。我该怎么做?带有矢量的3D点的正投影
我在想什么是:
P - P dot n * n
我与iOS的工作做一个邻投影。要做到这一点
一种方法是:
n
与Z轴对准0
设置的坐标投影点到xy平面inate转换
由于我们总是可以在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 ]
变换点
现在给出乘N阵列点P
的3中,我们只需按照上述
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
进行逆向转换即可。
'v'等价于_up_矢量吗? – aledalgrande
@aledalgrande'v'和'u'是飞机的坐标轴。你可以把它们想象成飞机内新的'x'和'y'轴。我不确定你的意思是* up vector *。 – eigenchris
我明白了,你去了一个与我脑海中不同的方式。谢谢! – aledalgrande
'P - P点n * n'应该足以将点投影到飞机上。也许我错过了什么? – eigenchris
@eigenchris我需要将二维坐标系置于该平面上,以便我可以比较点的x和y坐标 – aledalgrande
我明白。我会写一个答案。 – eigenchris