Algorithm 将三维平面上的点转换为二维点的程序

Algorithm 将三维平面上的点转换为二维点的程序,algorithm,unity3d,3d,geometry,arcore,Algorithm,Unity3d,3d,Geometry,Arcore,我有平面的法向量。我想将三维点转换为二维平面,保持它们之间的距离相同。基本上我想做的是使平面上所有点的z坐标相等。 我该如何实现这一点并为此编写程序(最好是C#)。有什么好的图书馆我可以用吗。 这个图书馆有用吗 我这样做的目的是在三维空间中有几条线(在同一平面上),我想在二维空间中表示这些线及其测量值 我的问题的一个例子 我这样做是为了我正在unity中使用Google ARcore开发的一个应用程序好的,我已经投入了相当多的时间来寻找这个问题的解决方案。我用ARcore(谷歌提供的增强现实SD

我有平面的法向量。我想将三维点转换为二维平面,保持它们之间的距离相同。基本上我想做的是使平面上所有点的z坐标相等。 我该如何实现这一点并为此编写程序(最好是C#)。有什么好的图书馆我可以用吗。 这个图书馆有用吗

我这样做的目的是在三维空间中有几条线(在同一平面上),我想在二维空间中表示这些线及其测量值

我的问题的一个例子


我这样做是为了我正在unity中使用Google ARcore开发的一个应用程序

好的,我已经投入了相当多的时间来寻找这个问题的解决方案。我用ARcore(谷歌提供的增强现实SDK)解决了这个问题。对于那些希望在不使用ARcore的情况下实现这一点的人,请参考以下问题:必须创建新的正交基,或者必须旋转平面以与默认平面对齐

对于那些在unity中使用ARcore的人,在我创建的GitHub上有一个更简单的解决方案。基本上,我们可以轻松地在3D平面上创建新轴,并从新创建的坐标系记录坐标

如果要在平面上投影三维点,需要考虑二维坐标系。自然平面是由全局轴定义的平面,但它适用于一种平面(如水平平面),而不适用于另一种平面(如垂直平面)。 另一种坐标选择是由CenterPose定义的,但它可以更改每一帧。因此,如果您只需要1帧的2d点,可以将其写成:

x_local_axis = DetectedPlane.CenterPose.rotation * Vector3.forward;
z_local_axis = DetectedPlane.CenterPose.rotation * Vector3.right;
// loop over your points
x = Vector3.Dot(your_3d_point, x_local_axis);
z = Vector3.Dot(your_3d_point, z_local_axis);
如果需要帧之间一致的二维坐标系,可能需要将锚点附着到任何感兴趣的平面,可能位于DetectedPlane.CenterPose,并执行与上面相同的数学运算,但使用锚点旋转而不是平面旋转。锚的x轴和z轴将提供一个二维坐标系,该坐标系在各坐标系之间保持一致


在这里,在平面的中心创建了一个新的局部轴,得到的点只有2个坐标。

你使用Unity吗?所以你可以应用我从链接问题中得到的答案,不是吗?如果平面不平行于任何轴,那么如何使所有Z坐标相等?还有,可能对你有用。即使OP想要在平面上投影他的向量,id并不意味着她需要这样做才能获得想要的效果。当然,首选的解决方案是使用局部2D坐标,并使用变换组件应用所需的变换。我以前做过这两件事,我发誓我知道我在说什么。