SpatialMap_Sparse_Localizing

演示如何使用上传到SpatialMap库(比如使用SpatialMap_SparseSpatialMap样例创建)的稀疏空间地图。

  • 演示如何定位稀疏空间地图并在上面摆放虚拟物体

参考: 运动跟踪与EasyAR功能

运行前配置

使用稀疏空间地图需配置服务器访问信息,这些信息可以在EasyAR官网的开发中心中 SpatialMap页面 中获得。在Unity中输入这些信息有两种方法:

一种是全局配置,所有使用全局配置的稀疏空间地图场景都会使用这个配置。从Unity菜单中选择<EasyAR -> Sense -> Configuration>

../../_images/image_62.png

然后在Project Settings中输入从开发中心获取的信息。

../../_images/image_62_1.png

另一种是在场景中配置,它只对当前场景有效。

../../_images/image_s8_3.png

另外还需要配置地图信息,这个信息需要通过 SpatialMap_SparseSpatialMap 创建并成功上传稀疏地图后,从EasyAR官网的开发中心中 SpatialMap页面 中获得。

../../_images/image_s8_4.png

用法

../../_images/image_35.png
标记1:显示系统状态和操作提示。

场景中会显示点云,点击点云可以放置Cube,双指捏合可以放大缩小Cube,移动可以让Cube在点云上移动。

详解

在场景中定位sparse spatial map

在sample中Sparse spatial map使用localize模式运行。

为使Sparse spatial map运行在build模式,session中需要有一个 SparseSpatialMapController 存在,且 Source Type 设为 Map ManagerMap Worker 设为session中的 SparseSpatialMapWorkerFrameFilter

../../_images/image_s8_1.png

Use SparseSpatialMapWorkerFrameFilter.Localizer.startLocalization to start localization.

sparse.Localizer.startLocalization();

世界中心下的物体

WorldRoot 可以用来实现这些功能,

  • 在跟踪状态变化时控制物体显示和隐藏。

  • 根据 ARSession.CenterMode 相对camera一起移动。

如果上面这些都有其它地方处理,那可以忽略 WorldRoot

在这个sample中, WorldRootController.ActiveControl 设成 ActiveControlStrategy.HideWhenNotTracking ,这样cube会在跟踪失败时隐藏。

../../_images/image_s8_2.png

在sparse spatial map上移动物体

可以对sparse spatial map执行 hit test 并移动cube到返回的点。

var viewPoint = new Vector2(touch.position.x / Screen.width, touch.position.y / Screen.height);
if (sparse && sparse.LocalizedMap)
{
    var points = sparse.LocalizedMap.HitTest(viewPoint);
    foreach (var point in points)
    {
        onSparse = true;
        TouchControl.transform.position = sparse.LocalizedMap.transform.TransformPoint(point);
        break;
    }
}

Sparse spatial map事件

Map事件可以用来处理自定义操作。这个sample使用这些事件来输出一些信息。在使用中可以删除这些信息,也可以添加自己的应用逻辑。

注意: 在这个sample中,加载 map(每张map的第一次加载)会触发一次下载。统计的请求次数会增加(可以从EasyAR网站获取更多信息)。在一次成功的下载之后,Map 缓存会被使用。这个缓存会在 SparseSpatialMapManager.clear 调用或应用卸载时清除。

MapController.MapLoad += (map, status, error) =>
{
    GUIPopup.EnqueueMessage("Load map {name = " + map.Name + ", id = " + map.ID + "} into " + sparse.name + Environment.NewLine +
        " => " + status + (string.IsNullOrEmpty(error) ? "" : " <" + error + ">"), status ? 3 : 5);
    ...
};

MapController.MapLocalized += () =>
{
    GUIPopup.EnqueueMessage("Localized map {name = " + MapController.MapInfo.Name + "}", 3);
};

MapController.MapStopLocalize += () =>
{
    GUIPopup.EnqueueMessage("Stopped localize map {name = " + MapController.MapInfo.Name + "}", 3);
};