Android 简单的带 GPS 的增强现实

标签 android augmented-reality

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

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

我找不到如何根据 GPS 位置在“相机预览”顶部显示图像。

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

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

如何结合坐标和方位角、俯仰角和横滚角来实现这一目标?

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

谢谢

最佳答案

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

setObjTranslation() 计算相对于玩家位置的标记坐标/位置。正如您在函数内部看到的,计算了 tmpxtmpy。使用上面的代码 (translation = ...(x,y,z)) 你会得到类似的东西:

markerPos.x = tmpx;
markerPos.y = tmpy;

您不需要第三个值,即 z 平移,除非您将对象/标记放置在 3D 场景中。

然后,setDistanceToPlayer() 计算玩家位置和标记位置之间的实际距离(以米为单位)。如果你用谷歌搜索havesine,你会找到关于这个函数的更多信息。基本上它计算 2 个 GPS 位置之间的距离。

最后一个函数 markerPlayerAngle() 计算 2 个 GPS 坐标之间的角度(以度为单位)。因此,根据设备方向,您将能够确定标记是否“可见”,换句话说,标记是否位于设备的视场中...

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);
                }

关于Android 简单的带 GPS 的增强现实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21928670/

相关文章:

java - 在 Metaio 图像跟踪器上显示多个图像的图像

ios - ARkit如何旋转一个物体以面对另一个物体

swift - 绕一整圈时节点的方向是错误的

android - 是否可以显示混合 map ?

java - 如何将数据从一个 Activity 传递到另一 Activity

android - 自定义passwordToggleDrawable在TextInputLayout中太大

android - 复古贴合响应与 Pro Guard 崩溃

android - 检查sim卡网络服务是否可用

ios - AR 引用组 - 图像的直方图较窄或分布不均

ios - SCNNode 未显示在 ARFrame 的 captureImage 中