【发布时间】:2014-02-21 08:03:57
【问题描述】:
我想开发一个简单的 AR 安卓应用。
我能够找到代码来获取:方位角、俯仰角和横滚,并认为我做对了。
我找不到如何根据 GPS 位置在“相机预览”顶部显示图像。
我有我的(纬度,经度)坐标和一组其他(纬度,经度)坐标。
我想要的是当用户将相机对准这些坐标时,能够在这些坐标上显示“标记”。
如何结合坐标和方位角、俯仰和横滚来实现?
我不介意使用 3rd 方的东西 - 但我确实需要它来免费。
谢谢
【问题讨论】:
我想开发一个简单的 AR 安卓应用。
我能够找到代码来获取:方位角、俯仰角和横滚,并认为我做对了。
我找不到如何根据 GPS 位置在“相机预览”顶部显示图像。
我有我的(纬度,经度)坐标和一组其他(纬度,经度)坐标。
我想要的是当用户将相机对准这些坐标时,能够在这些坐标上显示“标记”。
如何结合坐标和方位角、俯仰和横滚来实现?
我不介意使用 3rd 方的东西 - 但我确实需要它来免费。
谢谢
【问题讨论】:
以下功能应该会有所帮助。可能您所要做的就是转换代码。
setObjTranslation() 计算相对于玩家位置的标记坐标/位置。正如您在函数内部看到的,计算了 tmpx 和 tmpy。使用上面的代码(translation = ...(x,y,z))你会得到类似的东西:
markerPos.x = tmpx;
markerPos.y = tmpy;
您不需要第三个值,即 z 平移,除非您将对象/标记放置在 3D 场景中。
然后,setDistanceToPlayer() 计算玩家位置和标记位置之间的实际距离(以米为单位)。如果你谷歌搜索haversine你会发现更多关于这个功能。基本上它会计算 2 个 GPS 位置之间的距离。
最后一个函数markerPlayerAngle() 计算两个 GPS 坐标之间的角度(以度为单位)。因此,根据设备方向,您将能够确定标记是否“可见”,即标记是否在设备的 FOV 中...
function setObjTranslation() {
if (!arObjectIsVisible() || vec2fUndefined(playerPos) || vec2fUndefined(objectPosition)) return;
tmpx = calcmetdistance(playerPos.x, playerPos.y, objectPosition.x, playerPos.y);
tmpy = calcmetdistance(playerPos.x, playerPos.y, playerPos.x, objectPosition.y);
arObjectPos.translation = new SFVec3f ( tmpx, tmpy, 0 );
setDistanceToPlayer();
}
function calcmetdistance(lat1, lon1, lat2, lon2) {
R = 6371000;
lat1 *=Math.PI/180;
lon1 *=Math.PI/180;
lat2 *=Math.PI/180;
lon2 *=Math.PI/180;
d = Math.acos (
Math.sin(lat1)*Math.sin(lat2) +
Math.cos(lat1)*Math.cos(lat2) *
Math.cos(lon2-lon1)
) * R;
return d;
}
function setDistanceToPlayer() {
distance = haversine_m(objectPosition.x, objectPosition.y, playerPos.x, playerPos.y).toFixed();
arObjDistanceTranslation.rotation = new SFRotation( 0, 1, 0, markerPlayerAngle(objectPosition.x, objectPosition.y, playerPos.x, playerPos.y));
}
function haversine_m(lat1, long1, lat2, long2) {
d2r = Math.PI / 180;
d_latt = (lat2 - lat1) * d2r;
d_long = (long2 - long1) * d2r;
a = Math.sin(d_latt/2)*Math.sin(d_latt/2) + Math.cos(lat1 * d2r) * Math.cos(lat2 * d2r) * Math.sin(d_long/2)*Math.sin(d_long/2);
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return 6371 * 1000 * c;
}
function markerPlayerAngle(markerLat, markerLong, playerLat, playerLong) {
dy = markerLat - playerLat;
dx = Math.cos(Math.PI/180*playerLat)*(markerLong - playerLong);
return Math.atan2(dy, dx);
}
【讨论】: