从大学数学开始已经有一段时间了,现在我开始需要它,就像我从未想过的那样。
所以,这就是我想要实现的目标: 有一组3D点(地理点,纬度和经度,高度无关紧要),我想在屏幕上显示它们,考虑我想要考虑的方向。 这将与相机和指南针一起使用,所以当我将相机指向北方时,我想在计算机上显示相机应该“看到”的点。这是一种增强现实。
基本上(我认为)我需要的是一种将从上方观看的3D点(如在谷歌地图上查看点)转换为从侧面观看的一组3d点的方法。
答案 0 :(得分:4)
可以使用以下(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
答案 1 :(得分:2)
这实际上取决于您需要的精度。如果您正在对地球上任何地方的高精度,近距离视图进行处理,则需要考虑地球的椭圆形状。这通常使用与此处描述的算法类似的算法完成,在第38页“地理坐标与笛卡尔坐标之间的转换”下:
http://www.icsm.gov.au/gda/gdatm/gdav2.3.pdf
如果你不需要高精度,上面提到的技术就可以了。
答案 2 :(得分:2)
任何人都可以向我解释这些参数究竟是什么意思吗? 我已经尝试了,结果非常奇怪,所以我想我很想念透视投影的一些参数
* {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]
答案 3 :(得分:0)
嗯,你需要一些3D矢量算法来移动你的原点,并且可能需要一些基于四元数的旋转函数来旋转矢量以匹配你的方向。有很多关于使用四元数来旋转3D矢量的好教程(因为它们被大量用于渲染等),如果你能记住矢量的表示,那么3D矢量的东西非常简单。
答案 4 :(得分:0)
z = R * sin(长) x = R * cos(长)* sin(纬度) y = R * cos(长)* cos(纬度) R是世界的半径,你可以把它放在1,如果你只需要在你需要“看到”的点之间指向方向
将虚拟摄像机放在您创建的空间中,并将数据从真实摄像机(只是矢量)链接到虚拟摄像机的数据。
获得你想要做的事情的下一个方法是尝试绘制与你的“虚拟空间”重叠的相机的图像,明确地说你应该有一个真正的相机,可以在虚拟空间中移动虚拟空间