5

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

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

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

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

4

3 回答 3

2

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

于 2011-04-04T22:05:07.253 回答
1

除了 Ben Voigt 的回答:

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

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

于 2011-04-05T20:58:17.313 回答
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
于 2011-04-04T22:05:53.140 回答