【问题标题】:Mapping from 2D projection back to 3D point cloud从 2D 投影映射回 3D 点云
【发布时间】:2011-07-29 12:35:29
【问题描述】:

我有一个由点顶点 (XYZ) 和最终三角形面组成的 3D 模型。 使用 OpenGL 或 camera-view-matrix-projection 我可以将 3D 模型投影到 2D 平面,即视图窗口或分辨率为 m*n 的图像。

问题是如何确定 2D 投影平面中的像素与其对应的原始 3D 模型中的顶点(或面)之间的对应关系。

即,
对于 2D 投影中的给定像素,3D 模型中最近的顶点是什么?
这听起来像是选择 openGL 或光线追踪问题。但是有什么简单的解决方案吗?

光线追踪的想法实际上是从一个视点找到与光线相交的第一个顶点/面。有人可以给我看一些教程或例子吗?我想找到一种独立于使用 OpenGL 的算法。

【问题讨论】:

    标签: opengl 3d projection raytracing hittest


    【解决方案1】:

    除了 Ben Voigt 的回答:

    1. 如果您对可拾取对象进行单独传递,则可以将视口设置为仅包含您将读取的单个像素。

    2. 您还可以使用几何着色器 (gl_PrimitiveID) 对三角形 ID 进行编码。

    【讨论】:

      【解决方案2】:

      我的(可能是幼稚的)想法是创建一个顶点数组,然后在投影到屏幕点后按它们的距离(或距离平方,用于速度)对它们进行排序。列表中的第一项将是最接近的。 n 个顶点将是 O(n),但不会更糟。

      编辑:速度和内存更好:只需循环遍历所有顶点并跟踪投影最接近(距离平方)到视口像素的顶点。这假设您能够自己执行投影,而不依赖于 OpenGL。

      例如,在伪代码中:

      function findPointFromViewPortXY( pointOnViewport )
        closestPoint = false
        bestDistance = false
        for (each point in points)
          projectedXY     = projectOntoViewport(point)
          distanceSquared = distanceBetween(projectedXY, pointOnViewport)
          if bestDistance==false or distanceSquared<bestDistance
            closestPoint = point
            bestDistance = distanceSquared
        return closestPoint
      

      【讨论】:

      • 2D 投影中最近的点在 3D 空间中可能很远。
      • @MikeDaniels 我不确定你的意思。是的,它在 3D 空间中可能与飞机上的投影相距甚远,但我认为这并不重要。据我了解,OP 有一个 3D 点云被渲染到屏幕上,用户在屏幕上单击以选择一个点,并且 OP 试图找到最接近(在屏幕上)选择的点的点。
      • 对不起,我无法理解您的想法。我应该计算和排序什么样的距离?
      • @elgcom 我已经用我建议的伪代码更新了我的答案。
      【解决方案3】:

      OpenGL 中的命中测试通常在没有光线追踪的情况下完成。相反,在渲染每个图元时,输出中的一个平面用于存储图元的唯一 ID。命中测试就像在光标位置读取 ID 平面一样简单。

      【讨论】:

      • 嗨。你能详细说明一下吗?我有一个 3D 点云,每个点都有 XYZRGB。在图像上投影点云后,我可以从像素坐标中得到它们的原始 (x,y,z) 吗?我需要所有像素的原始位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2013-11-20
      相关资源
      最近更新 更多