计算3D坐标从2D图像平面计算透视,无需直接访问视图/投影矩阵

时间:2012-05-14 18:52:02

标签: language-agnostic 3d 2d projection reverseprojection

第一次在堆栈交换上询问问题,希望这是正确的地方。

我似乎无法为我的情况开发足够接近的近似算法,因为我在3D数学方面并不是最好的。

我有一个3d环境,我可以在其中访问任何对象(包括我的相机)的位置和旋转,以及从任意两点运行跟踪线以获得点和碰撞点之间的距离。我也有我相机的视野。但是,我没有任何形式访问世界/视图/投影矩阵。

我还有一组2D图像,它们基本上是来自摄像机的三维环境的一组屏幕截图,每个集合来自相同的点和角度,平均集合大约是60度角的平均值从地平线上下来。

我已经能够使用“注册点实体”,可以放置在代表2d图像角落的3d世界中,然后当在2d图像上拾取一个点时,它被读取作为范围0-1的坐标,然后在登记点的3d位置之间进行插值。这似乎运作良好,但只有图像是一个完美的自上而下的角度。当相机倾斜并引入另一个透视维度时,结果变得更加不准确,因为没有补偿这个视角。

我不需要能够计算一个点的高度,比如天空刮板上的一个窗口,但至少是图像平面底部的坐标,或者如果我从我的一条线延伸出一条线来自指定图像空间点的图像如果没有任何东西,我至少需要该线与地面相交的点。

我发现的关于这个的所有材料都说使用世界/视图/投影矩阵取消了这一点,除了我无法访问这些矩阵外,我发现它本身很简单,只是我可以在屏幕截图中收集的数据时间和其他算法使用复杂的数学,我还没有掌握。

这样做的一个目标就是能够在用户点击图像的3d环境中放置标记,而无法从用户的视图中运行简单的deprojection。

任何帮助都将不胜感激,谢谢。

编辑: Herp derp,虽然由于我的情况有限,我这样做的实现有点奇怪,解决方案基本上归结为ananthonline关于简单重新计算视图/投影矩阵的答案。

1 个答案:

答案 0 :(得分:0)

在相机的位置,旋转和FOV之间,您是否可以不计算相机的视图/投影矩阵(songho.ca/opengl/gl_projectionmatrix.html) - 从而允许您取消已知的3D点投影?