从2D投影映射回3D点云

时间:2011-04-04 21:56:11

标签: opengl 3d projection raytracing hittest

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我的(可能是天真的)想法是创建一个顶点数组,然后按照它们的距离(或距离平方,速度)对它们进行排序,一旦投影到屏幕点。列表中的第一项将是最接近的。对于 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

答案 2 :(得分:1)

除了本·沃格特的回答:

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

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