自从我上大学以来已经有一段时间了,现在我开始需要它,就像我从未想过的那样。
所以,这就是我想要实现的目标:拥有一组 3D 点(地理点、经纬度、海拔无关紧要),考虑到我想要考虑的方向,我想将它们显示在屏幕上。这将与相机和指南针一起使用,所以当我将相机指向北方时,我想在我的计算机上显示相机应该“看到”的点。这是一种增强现实。
基本上(我认为)我需要一种将从上方查看的 3D 点(如查看谷歌地图上的点)转换为从侧面查看的一组 3D 点的方法。
自从我上大学以来已经有一段时间了,现在我开始需要它,就像我从未想过的那样。
所以,这就是我想要实现的目标:拥有一组 3D 点(地理点、经纬度、海拔无关紧要),考虑到我想要考虑的方向,我想将它们显示在屏幕上。这将与相机和指南针一起使用,所以当我将相机指向北方时,我想在我的计算机上显示相机应该“看到”的点。这是一种增强现实。
基本上(我认为)我需要一种将从上方查看的 3D 点(如查看谷歌地图上的点)转换为从侧面查看的一组 3D 点的方法。
可以使用以下 (Java) 代码片段将纬度和经度转换为 3-D 笛卡尔 (x,y,z) 坐标。希望它很容易转换为您选择的语言。lat
最初是纬度和lng
经度,以度为单位:
lat*=Math.PI/180.0;
lng*=Math.PI/180.0;
z=Math.sin(-lat);
x=Math.cos(lat)*Math.sin(-lng);
y=Math.cos(lat)*Math.cos(-lng);
矢量 (x,y,z) 将始终位于半径为 1 的球体上(即地球的半径已缩放为 1)。
从那里,需要一个 3D 透视投影来将 (x,y,z) 转换为 (X,Y) 屏幕坐标,给定相机位置和角度。例如,参见http://en.wikipedia.org/wiki/3D_projection
谁能解释一下这些参数的确切含义?我已经尝试过,结果很奇怪,所以我想我误解了透视投影的一些参数
* {a}_{x,y,z} - the point in 3D space that is to be projected.
* {c}_{x,y,z} - the location of the camera.
* {\theta}_{x,y,z} - The rotation of the camera. When {c}_{x,y,z}=<0,0,0>, and {\theta}_{x,y,z}=<0,0,0>, the 3D vector <1,2,0> is projected to the 2D vector <1,2>.
* {e}_{x,y,z} - the viewer's position relative to the display surface. [1]
这实际上取决于您需要的精确度。如果您正在对地球上任何地方的点进行高精度、近距离观察,则需要考虑地球的椭球形状。这通常使用类似于此处描述的算法完成,在第 38 页的“地理坐标和笛卡尔坐标之间的转换”下:
http://www.icsm.gov.au/gda/gdatm/gdav2.3.pdf
如果您不需要高精度,上面提到的技术就可以了。
好吧,您需要一些 3D 矢量算法来移动您的原点,并且可能需要一些基于四元数的旋转函数来旋转矢量以匹配您的方向。有很多关于使用四元数旋转 3D 向量的好教程(因为它们被大量用于渲染等),如果你能记住向量是如何表示的,那么 3D 向量的内容就非常简单。
好吧,只是一个不错的建议,您可以将此点绘制到 3d 空间中(您可以使用 openGL 轻松完成此操作)。您必须将纬度/经度转换为另一个系统,例如极坐标或笛卡尔坐标。因此,从纬度/经度开始,您将空间的原点放在心脏的中心,而不是您必须以笛卡尔坐标转换数据:
z= R * sin(long) x= R * cos(long) * sin(lat) y= R * cos(long) * cos(lat) R是世界的半径,如果你可以把它设为1只需要在你的观点和你需要“看到”的点之间找到方向
而不是将虚拟相机放在您创建的空间的一个点上,然后将来自真实相机的数据(只是一个矢量)链接到虚拟相机的数据。
获得您想要做的事情的下一个步骤是尝试为您的相机绘制与您的“虚拟空间”重叠的图像,当然您应该拥有一个真实的相机,它可以控制在虚拟空间中移动虚拟相机。