我有一个增强现实的应用程序,其中存储了地铁、加油站、名胜古迹等信息以及相应的纬度和经度。
现在,根据设备的方向,我将在设备的相机视图中显示每个站点的标记。类似于 Layar 和 Wikitude。
找了三天没有间断,也没有找到人解释如何解决这个问题。
由于关于这个主题的信息非常稀疏,而且我最近在 iPhone 上解决了这个问题,我想我会向任何可以使其在 Android 上工作的人分享我的方法(除了数学函数之外,这个答案中没有任何特定于 iPhone 的内容) sin、cos 和 fmod,可以在 java.lang.Math 中找到)。这些是我采取的步骤:
- 获取您自己的纬度/经度和当前罗盘航向(纬度1、经度1 和航向)。在 iPhone 上,CLLocation 以度为单位返回这些值,但对于这些计算,它们MUST以弧度为单位(即乘以 PI/180)
- 获取以弧度为单位的兴趣点 (POI) 的纬度/经度(lat2 和 lon2)。
- 使用此处找到的公式计算 lat1/lon1 和 lat2/lon2 之间的距离:http://www.movable-type.co.uk/scripts/latlong.html
-
计算相对于北向的 lat2/lon2 角度。上面的链接也对此进行了描述,但我在让它工作时遇到了一些麻烦,这里是 C 代码:
double latDelta = (lat2 - lat1);
double lonDelta = (lon2 - lon1);
double y = sin(lonDelta) * cos(lat2);
double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2)* cos(lonDelta);
double angle = atan2(y, x); //not finished here yet
double headingDeg = compass.currentHeading;
double angleDeg = angle * 180/PI;
double heading = headingDeg*PI/180;
angle = fmod(angleDeg + 360, 360) * PI/180; //normalize to 0 to 360 (instead of -180 to 180), then convert back to radians
angleDeg = angle * 180/PI;
-
使用标准三角学,我计算 x 和 y。请记住,这些坐标位于 3D 空间中,因此我们还没有完成,因为您仍然需要将它们映射到 2D:
x = sin(angle-heading) * distance;
z = cos(angle-heading) * distance; //typically, z faces into the screen, but in our 2D map, it is a y-coordinate, as if you are looking from the bottom down on the world, like Google Maps
-
最后,使用投影公式,您可以计算屏幕 x (我没有执行 y,因为这对我的项目来说不是必需的,但您需要获取加速器数据并确定设备是否垂直于地面)。投影公式可以在这里找到(滚动到最底部):http://membres.multimania.fr/amycoders/tutorials/3dbasics.html
double screenX = (x * 256) / z
现在您可以使用此 x 坐标在屏幕上移动图像或标记。请记住几点:
- 一切都必须以弧度为单位
- 从您到 POI 相对于北的角度为 angleBeteweenPoints - currentHeading
(由于某种原因,我无法在这台计算机上正确格式化代码,所以如果有人想编辑这个答案,请随意)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)