带GPS的Android简单增强现实

时间:2014-02-21 08:03:57

标签: android augmented-reality

我想开发一个简单的AR android应用程序。

我能够找到代码来获得:方位角,俯仰和滚动,并认为我做对了。

我无法找到如何根据GPS位置在“相机预览”上显示图像。

我有(纬度,经度)坐标和一组其他(纬度,经度)坐标。

我想要的是当用户将相机对准时在这些坐标上显示“标记”的能力。

如何组合坐标和方位角,俯仰和滚动来实现这一目标?

我不介意使用第三方的东西 - 但我确实需要它免费。

由于

1 个答案:

答案 0 :(得分:2)

以下功能应该有所帮助。可能你所要做的就是转换代码。

setObjTranslation()计算相对于玩家位置的标记坐标/位置。正如您在函数内部所看到的,计算了tmpxtmpy。如果使用上面的代码(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);
                }