2011-04-04 353 views
5

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

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

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

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

回答

2

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

+0

嗨。你能详细解释一下吗?我有一个3D点云,每个点都有XYZRGB。在图像上投影点云之后,我可以从像素坐标中获得它们的原始(x,y,z)吗?我需要所有像素的原始位置。 – Ankitp94 2017-02-21 12:16:24

1

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

2D投影中的最近点可能在3D空间中非常遥远。 – 2011-04-05 01:05:17

+0

@MikeDaniels我不确定你的意思。是的,它可能离飞机上的投影非常远,但我不相信这一点。据我了解,OP有一个3D点云被渲染到屏幕上,用户点击屏幕选择一个点,OP正在尝试找到哪个点最接近(屏幕上)到拾取点。 – Phrogz 2011-04-05 01:26:47

+0

对不起,我不明白你的想法。我应该计算和排序什么样的距离? – elgcom 2011-04-05 07:14:27

1

除了本·福格特的回答是:

  1. 如果你这样做了拣选对象单独的过程,那么你可以设置视口仅包含您将读取的单个像素。

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