我有一个由点顶点(XYZ)和最终三角形面组成的3D模型。 使用OpenGL或相机视图矩阵投影我可以将3D模型投影到2D平面,即视图窗口或具有m * n分辨率的图像。
问题是如何确定2D投影平面图中的像素与原始3D模型中对应的顶点(或面)之间的对应关系。
即,
2D投影中给定像素的3D模型中最接近的顶点是什么?
这听起来像是在openGL或光线追踪问题中挑选。是否有任何简单的解决方案?
根据光线追踪的想法,它实际上是关于从视点找到与光线相交的第一个顶点/面。有人能给我看一些教程或例子吗?我想找到一个独立于使用OpenGL的算法。
答案 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)
除了本·沃格特的回答:
如果您对可选对象进行单独传递,则可以将视口设置为仅包含您将读取的单个像素。
您还可以使用几何着色器(gl_PrimitiveID
)对三角形ID进行编码。