我想开发一个简单的AR android应用程序。
我能够找到代码来获得:方位角,俯仰和滚动,并认为我做对了。
我无法找到如何根据GPS位置在“相机预览”上显示图像。
我有(纬度,经度)坐标和一组其他(纬度,经度)坐标。
我想要的是当用户将相机对准时在这些坐标上显示“标记”的能力。
如何组合坐标和方位角,俯仰和滚动来实现这一目标?
我不介意使用第三方的东西 - 但我确实需要它免费。
由于
答案 0 :(得分:2)
以下功能应该有所帮助。可能你所要做的就是转换代码。
setObjTranslation()
计算相对于玩家位置的标记坐标/位置。正如您在函数内部所看到的,计算了tmpx
和tmpy
。如果使用上面的代码(translation = ...(x,y,z)
),您将拥有类似的内容:
markerPos.x = tmpx;
markerPos.y = tmpy;
除非您将对象/标记放在3D场景中,否则不需要第三个值z转换。
然后,setDistanceToPlayer()
计算玩家位置和标记位置之间的实际距离(以米为单位)。如果你谷歌搜索haversine
,你会发现更多有关此功能的信息。基本上它计算2个GPS位置之间的距离。
最后一个函数markerPlayerAngle()
计算2个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);
}