EasyAR4.0开发 (SpatialMap空间地图五)

这篇文章讲一下SparseSpatialMapWorkerFrameFilter这个类

首先说明一下其他几个类的作用,可以查看EasyAR了解这几个类的具体作用

SparseSpatialMap  //提供SparseSpatialMap系统主要的功能,地图生成和存储、地图加载和定位,同时可以获取点云,平面等环                                    境信息并进行hit Test。

SparseSpatialMapManager   //SparseSpatialMap 管理类,用于管理 SparseSpatialMap 的分享功能。

 

还有SparseSpatialMapWorkerFrameFilter类中一些字段的解释:

Dictionary<string, SparseSpatialMapController> mapControllers  是根据id保存所有地图

SpatialMapServiceConfig ServiceConfig  就是保存你的EasyAR个人信息的,用于下载地图验证

MapLocalizerConfig LocalizerConfig 这个主要是设置定位策略的详情可以看官网Api

  protected virtual void Awake()
        {
            if (!EasyARController.Initialized)  //初始化
            {
                return;
            }
            if (!SparseSpatialMap.isAvailable())  //是否支持稀疏重建
            {
                throw new UIPopupException(typeof(SparseSpatialMap) + " not available");
            }
            if (!SparseSpatialMapManager.isAvailable()) //检查SparseSpatialMapManager是否可用。当运行的操作系统为Mac, iOS和Android时返回true。
            {
                throw new UIPopupException(typeof(SparseSpatialMapManager) + " not available");
            }

            mapRoot = new GameObject("SparseSpatialMapRoot");
            sparseSpatialMapWorker = SparseSpatialMap.create();
            Builder = sparseSpatialMapWorker;
            Localizer = sparseSpatialMapWorker;
            Manager = SparseSpatialMapManager.create();
        }

Awake的判断和稠密重建差不多,需要创建SparseSpatialMap和SparseSpatialMapManager   类

SparseSpatialMap同样也有几个基本调用方法用于开启和关闭

start  开始算法

stop 停止算法,调用start重新开始

close  关闭SparseSpatialMap , 关闭后不能继续使用

Dispose 清除资源

然后这个类里面有主要的4个函数

LoadSparseSpatialMapBuild 和 UnloadSparseSpatialMapBuild

UnloadSparseSpatialMap  和 HostSparseSpatialMap

  internal void LoadSparseSpatialMapBuild(SparseSpatialMapController controller)
        {
            UnloadSparseSpatialMapBuild(BuilderMapController);
            BuilderMapController = controller;
            if (controller && mapRoot)
            {
                BuilderMapController.transform.parent = mapRoot.transform;
            }
        }

        internal void UnloadSparseSpatialMapBuild(SparseSpatialMapController controller)
        {
            if (BuilderMapController == controller && controller)
            {
                BuilderMapController = null;
                controller.OnLocalization(false);
            }
        }

UnloadSparseSpatialMapBuild就是将当前SparseSpatialMapWorkerFrameFilter构建的本地地图BuilderMapController卸载掉 

LoadSparseSpatialMapBuild 调用这个函数首先会卸载掉当前的BuilderMapController,然后将BuilderMapController设置成参入的SparseSpatialMapController

 internal void UnloadSparseSpatialMap(SparseSpatialMapController controller, Action<SparseSpatialMapController.SparseSpatialMapInfo, bool, string> callback)
        {
            var id = controller.MapInfo.ID;
            if (mapControllers.Remove(id))
            {
                controller.OnLocalization(false);
                sparseSpatialMapWorker.unloadMap(controller.MapInfo.ID, EasyARController.Scheduler, (Action<bool>)((status) =>
                {
                    if (MapUnload != null)
                    {
                        MapUnload(controller, controller.MapInfo, status, string.Empty);
                    }
                    if (callback != null)
                    {
                        callback(controller.MapInfo, status, string.Empty);
                    }
                }));
            }
        }

        internal void HostSparseSpatialMap(SparseSpatialMapController controller, string name, Optional<Image> preview, Action<SparseSpatialMapController.SparseSpatialMapInfo, bool, string> callback)
        {
            SpatialMapServiceConfig config;
            if (UseGlobalServiceConfig)
            {
                config = EasyARController.Settings.GlobalSpatialMapServiceConfig;
            }
            else
            {
                config = ServiceConfig;
            }
            NotifyEmptyConfig(config);

            Manager.host(sparseSpatialMapWorker, config.APIKey.Trim(), config.APISecret.Trim(), config.SparseSpatialMapAppID.Trim(), name, preview, EasyARController.Scheduler, (status, id, error) =>
            {
                var mapInfo = new SparseSpatialMapController.SparseSpatialMapInfo() { Name = name, ID = id };
                if (MapHost != null)
                {
                    MapHost(controller, mapInfo, status, error);
                }
                if (callback != null)
                {
                    callback(mapInfo, status, error);
                }
            });
        }

         internal void LoadSparseSpatialMap(SparseSpatialMapController controller, Action<SparseSpatialMapController.SparseSpatialMapInfo, bool, string> callback)
        {
            SpatialMapServiceConfig config;
            if (UseGlobalServiceConfig)
            {
                config = EasyARController.Settings.GlobalSpatialMapServiceConfig;
            }
            else
            {
                config = ServiceConfig;
            }
            NotifyEmptyConfig(config);

            var id = controller.MapInfo.ID;
            Manager.load(sparseSpatialMapWorker, id.Trim(), config.APIKey.Trim(), config.APISecret.Trim(), config.SparseSpatialMapAppID.Trim(), EasyARController.Scheduler, (status, error) =>
            {
                if (MapLoad != null)
                {
                    MapLoad(controller, controller.MapInfo, status, error);
                }
                if (callback != null)
                {
                    callback(controller.MapInfo, status, error);
                }
            });
            mapControllers[id] = controller;
            controller.transform.parent = mapRoot.transform;
            WorkingMode = Mode.Localize;
            Builder = null;
        }

UnloadSparseSpatialMap 是卸载地图 需要通过SparseSpatialMap这个类卸载。可以通过回调的返回值判断卸载是否成功,成功返回true,否则返回false。

HostSparseSpatialMap 是上传地图,UseGlobalServiceConfig判断是否使用全局的个人信息数据,然后通过SparseSpatialMapManager的host方法 详细查看官网api

参数:

SparseSpatialMap 保存了地图信息

config.APIKey      config.APISecret    config.SparseSpatialMapAppID   这是地图id, 和你个人的信息

name 是你自己创建的地图名

preview 是一张图片,方便你识别地图 ,类似缩略图的意思

EasyARController.Scheduler 是固定的参数,应该是用于延时回调的,这个可以看官网解释 

我个人理解的是,因为上传这部分代码估计在另外一个线程处理的,如果直接回调,会有很多问题,例如Unity的Api调用会报错之类的,因此就做了一个延迟回调,实现的功能应该类似 Loom 插件的作用

回调函数会传回一个serverMapId,这个serverMapId是唯一的,可以通过这个serverMapId加载地图信息。

LoadSparseSpatialMap

从服务器加载地图,代码部分和HostSparseSpatialMap 函数类似,只是调用了SparseSpatialMapManager类的load方法

这个方法比HostSparseSpatialMap函数变了一个参数,就是serverMapId。加载成功,数据会保存在第一个传参SparseSpatialMap中。

 

©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页