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

我有一个由点顶点(XYZ)和最终三角形面组成的3D模型。 使用OpenGL或相机视图矩阵投影我可以将3D模型投影到2D平面,即视图窗口或具有m * n分辨率的图像。 问题是如何确定来自2D投影计划的像素与其与原始3D模型相对应的顶点(或面)之间的对应关系。 也就是说, 2D投影中给定像素的3D模型中最接近的顶点是什么? 这听起来像是在openGL或光线追踪问题中挑选。是否有任何简单的解决方案? 对于光线跟踪的想法,它实际上是关于从视点找到与光线相交的第一个顶点/面。有人能给我看一些教程或例子吗?我想找到一个独立于使用OpenGL的算法。     
已邀请:
通常在没有光线追踪的情况下完成OpenGL中的命中测试。相反,在渲染每个图元时,输出中的平面用于存储图元的唯一ID。然后,命中测试就像在光标位置读取ID平面一样简单。     
我的(可能是天真的)想法是创建一个顶点数组,然后按照它们的距离(或者距离平方,速度)对它们进行排序。一旦投影到屏幕点。列表中的第一项将是最接近的。对于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
    
除了本·沃格特的回答: 如果对可拾取对象进行单独传递,则可以将视口设置为仅包含要读取的单个像素。 您还可以使用几何着色器(
gl_PrimitiveID
)对三角形ID进行编码。     

要回复问题请先登录注册