程序将3D平面上的点转换为2D点

时间:2018-06-28 09:39:54

标签: algorithm unity3d 3d geometry arcore

我有平面的法线向量。我想将3D点转换为2D平面,并保持它们之间的距离相同。基本上,我想做的是使平面上所有点的z坐标相等。 如何实现该目标并为此编写程序(最好是C#)? 。有什么好用的库吗? 这个库对您有用吗Point Cloud Library

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

我的问题的一个例子。 enter image description here

我正在使用Google ARcore统一开发的应用程序执行此操作

1 个答案:

答案 0 :(得分:2)

好吧,我已经花了很多时间来找到解决这个问题的方法。我使用ARCore(由Google提供的增强现实SDK)来解决此问题时,找到了一个简单的解决方案。对于那些想要在不使用ARcore的情况下实现此目的的人,请参考以下问题Question 1 Question 2,其中必须创建新的正交基准或必须旋转平面以与默认平面对齐。

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

如果要在平面上投影3d点,则需要考虑2d坐标系。自然的是由全局轴定义的平面,但是它对于一种平面(例如水平)而不是另一种平面(例如垂直)会很好地工作。 坐标的另一种选择是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);

如果您需要一个在各帧之间保持一致的2d坐标系,则可能希望将锚点附加到任何感兴趣的平面上,例如在DetectedPlane.CenterPose处,并执行与上述相同的数学运算,但是锚点旋转而不是飞机旋转。锚点的x轴和z轴将提供一个2d坐标帧,这些坐标在帧之间是一致的。

因此,在这里,在平面中心创建了一个新的局部轴,并且获得的点将只有2个坐标。