【问题标题】:Program to convert points on 3D plane to 2D points将 3D 平面上的点转换为 2D 点的程序
【发布时间】:2018-06-28 09:39:54
【问题描述】:

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

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

我的问题的示例平面。

我正在为我正在使用 Google ARcore 统一开发的应用程序这样做

【问题讨论】:

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

标签: algorithm unity3d 3d geometry arcore


【解决方案1】:

好的,我已投入大量时间来寻找解决此问题的方法。当我使用 ARCore(Google 提供的增强现实 SDK) 进行此操作时,我想出了一个使用 ARcore 解决此问题的简单解决方案。对于那些想要在不使用 ARcore 的情况下实现这一点的人,请参考这些问题Question 1Question 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 个坐标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多