首页 > 解决方案 > 将 3D 平面上的点转换为 2D 点的程序

问题描述

我有飞机的法线向量。我想将 3D 点转换为保持它们之间相同距离的 2D 平面。基本上我想要做的是使平面上所有点的 z 坐标相等。 我该如何实现这一目标并为其编写程序(最好是 C#)?. 有没有我可以使用的好库。这个库有用吗点云库

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

我的问题的示例飞机。在此处输入图像描述

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

标签: algorithmunity3d3dgeometryarcore

解决方案


好的,我已经投入了大量时间来寻找解决这个问题的方法。当我使用 ARCore(Google 提供的增强现实 SDK) 执行此操作时,我想出了一个使用 ARcore 解决此问题的简单解决方案。对于那些想要在不使用 ARcore 的情况下实现这一点的人,请参阅这些问题问题 1 问题 2,其中必须创建新的正交基础或必须旋转平面以与默认平面对齐。

对于那些统一使用 ARcore 的人,我在 GitHub 上的这个问题中给出了一个更简单的解决方案。基本上,我们可以轻松地在 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 个坐标。


推荐阅读