透视投影:确定 3D 空间中点的 2D 屏幕坐标 (x,y) (x,y,z)

2022-09-03 05:20:05

我希望确定3D空间中点的2D屏幕坐标(x,y)(x,y,z)。

我希望投影的点是由GPS坐标和海平面以上高程表示的真实世界点。

例如:点(纬度:49.291882,经度:-123.131676,高度:14 米)

相机位置和高度也可以确定为 x,y,z 点。我还有相机的航向(罗盘度),其倾斜度(高于/低于地平线)和滚动(围绕z轴)。

我没有3D编程的经验,因此,我阅读了透视投影的主题,并了解到它需要矩阵,转换等知识 - 所有这些目前都完全让我感到困惑。

有人告诉我,OpenGL可用于构建真实世界点的3D模型,设置相机方向并检索3D点的2D坐标。

但是,我不确定使用OpenGL是否是解决此问题的最佳方法,即使它是,我也不知道如何创建模型,设置相机等

有人可以建议解决我问题的最佳方法吗?如果OpenGL是一个可行的解决方案,我必须使用OpenGL ES,如果这有什么区别的话。哦,无论我选择什么解决方案,它都必须快速执行。


答案 1

这是一个非常笼统的答案。假设相机位于(Xc,Yc,Zc),并且要投影的点是P = (X,Y,Z)。从相机到投影到的 2D 平面的距离为 F(因此平面的等式为 Z-Zc=F)。投影到平面上的 P 的 2D 坐标为 (X', Y')。

然后,非常简单:

X' = ((X - Xc) * (F/Z)) + Xc

Y' = ((Y - Yc) * (F/Z)) + Yc

如果您的相机是原点,则简化为:

X' = X * (F/Z)

Y' = Y * (F/Z)


答案 2

您确实需要透视投影矩阵运算大大简化了操作。我假设您已经知道,对于这些计算,必须将球面坐标转换为笛卡尔坐标

使用OpenGL可能会为您节省大量工作,而不是滚动自己的软件光栅器。因此,我建议先尝试一下。您可以在PC上对系统进行原型设计,因为只要保持简单,OpenGL ES就不会有太大的不同。


推荐