Vufoia——动态添加、删除识别数据集

来源:互联网 发布:淘宝上有铁匠铺吗 编辑:程序博客网 时间:2024/06/13 08:15

这篇文章主要介绍和实现的内容如下:
- 动态添加删除Vufoia识别数据集目的
- Vufoia识别数据集相关介绍
- 如何动态(运行状态)添加数据集
- 如何动态(运行状态)删除数据集


动态添加删除Vufoia识别数据集目的

  • 优势1 用户可在程序运行是更新、删除识别图,做到识别图热更新
  • 优势2 Vufoia在进入AR场景时,会存在物理摄像机开启及加载本地设别图数据的过程,如果在程序一开始时,通过ARCamera自动添加所有的数据集,程序在移动端测试会出现卡顿情况;然后动态添加删除Vufoia识别数据集,可以做到在需要的地方添加所需要的数据集,较少卡顿现象
  • 优势3 对原有数据集中相关信息可修改操作,增加灵活性,实用性

Vufoia识别数据集相关介绍

  • DataSet 记录了上传Vufoia服务器中识别图的相关信息

如何得到Vufoia中的文件

    方法一:
在Vufoia官网开发者中下载所上传的识别图方法一:
这里写图片描述
传统方法,我们在Unity中下载Database都会选择下载.unitypackage格式文件,即选择Unity Editor方式下载,再导入到Unity工程中,得到识别图数据集,这个方法会在下面介绍。
下载完成后会得到一个.zip文件,将其解压得到:
这里写图片描述
    First.dat文件记录了设别图的相关信息如设别点信息等
    First.xml文件记录了设别图的名字、尺寸信息等,如下所示:
    这里写图片描述
  • 方法二:
    在Vufoia官网开发者中下载所上传的识别图方法二:
    这里写图片描述
    下载完成后将得到一个First.unitypackage文件,导入Unity:
    这里写图片描述
    在StreamingAssets/QCAR路径下将得到相应的文件。

如何动态(运行状态)添加数据集

代码块

static ObjectTracker objectTracker;    static DataSet dataSet;    public static void LoadDataSet(string DataPath,Action<Hashtable> CustomSendMessage)    {        if (CustomSendMessage == null)        {            CustomSendMessage = NullCustomSendMessage;        }        objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();        dataSet = objectTracker.CreateDataSet();        if (dataSet.Load(DataPath,DataSet.StorageType.STORAGE_ABSOLUTE))        {            objectTracker.Stop();  // stop tracker so that we can add new dataset            if (!objectTracker.ActivateDataSet(dataSet))            {                Debug.Log("<color=yellow>Failed to Activate DataSet: " + DataPath + "</color>");                CustomSendMessage(HashtableEX.Construct(                  "Success", false                  ));            }            else if (!objectTracker.Start())            {                Debug.Log("<color=yellow>Tracker Failed to Start.</color>");                CustomSendMessage(HashtableEX.Construct(                  "Success", false                  ));            }            else            {                IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();                foreach (TrackableBehaviour tb in tbs)                {                    if (tb.name == "New Game Object")                    {                        tb.gameObject.name = tb.TrackableName;                                         tb.gameObject.AddComponent<CustomTrackableEventHandle>();                        tb.gameObject.AddComponent<TurnOffBehaviour>();                        //tb.gameObject.GetComponent<ImageTargetBehaviour>().SetWidth(0.1f);                    }                }                CustomSendMessage(HashtableEX.Construct(                    "Success",true,                    "Trackables",tbs                    ));            }        }        else        {            Debug.LogError("<color=yellow>Failed to load dataset: '" + DataPath + "'</color>");            CustomSendMessage(HashtableEX.Construct(                    "Success", false                    ));        }    }

注意事项:
- DataPath:在移动端需要动态下载更新时,DataPath路径需要在Application.persistentDataPath相关路径中,原因文件下载后一般下载路径都存放在该路径中,而且不能使用文件操作移动到其他路径下面。
- Action CustomSendMessage:是消息机制,操作完加载数据集后反馈相应消息(成功 or 识别)

如何动态(运行状态)删除数据集

代码块

    /// <summary>    /// Destory Old DateSet and ImageTarget Object    /// </summary>    public static void DestroyDateObject()    {        try        {            var objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();            var dataSet = objectTracker.GetActiveDataSets();            if (dataSet!=null) {                List<DataSet> t = new List<DataSet>(dataSet);                while (t.Count > 0) {                    var i = t[0];                    t.Remove(i);                    objectTracker.DeactivateDataSet(i);                    objectTracker.DestroyDataSet(i, false);                    var trackables = i.GetTrackables();                    foreach (var item in trackables) {                        TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(item, true);                    }                }            }        }        catch(Exception e)        {            Debug.Log(e.ToString());        }    }

注意事项:
- 第一:List t = new List(dataSet);为什么需要转换为一个List,而不直接使用foreach循环删除操作:foreach中只能读取数据,而不能删除数据。
- 第二:如果使用for循环,此处需要从大到小循环,不然在后面移除掉某一项之后,将会出现错误。

完整代码如下

代码块

using UnityEngine;using System.Collections;using Vuforia;using System.Collections.Generic;using System;/// <summary>/// 动态添加数据集/// </summary>public class LoadDate{    static ObjectTracker objectTracker;    static DataSet dataSet;    static bool isFirst = true;    public static void LoadDataSet(string DataPath,Action<Hashtable> CustomSendMessage)    {        if (CustomSendMessage == null)        {            CustomSendMessage = NullCustomSendMessage;        }        //if (isFirst == false)        //{            DestroyDateObject();        //}        objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();        dataSet = objectTracker.CreateDataSet();        if (dataSet.Load(DataPath,DataSet.StorageType.STORAGE_ABSOLUTE))        {            objectTracker.Stop();  // stop tracker so that we can add new dataset            if (!objectTracker.ActivateDataSet(dataSet))            {                Debug.Log("<color=yellow>Failed to Activate DataSet: " + DataPath + "</color>");                CustomSendMessage(HashtableEX.Construct(                  "Success", false                  ));            }            else if (!objectTracker.Start())            {                Debug.Log("<color=yellow>Tracker Failed to Start.</color>");                CustomSendMessage(HashtableEX.Construct(                  "Success", false                  ));            }            else            {                IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();                foreach (TrackableBehaviour tb in tbs)                {                    if (tb.name == "New Game Object")                    {                        tb.gameObject.name = tb.TrackableName;                        tb.gameObject.AddComponent<CustomTrackableEventHandle>();                        tb.gameObject.AddComponent<TurnOffBehaviour>();                        //tb.gameObject.GetComponent<ImageTargetBehaviour>().SetWidth(0.1f);                    }                }                CustomSendMessage(HashtableEX.Construct(                    "Success",true,                    "Trackables",tbs                    ));            }        }        else        {            Debug.LogError("<color=yellow>Failed to load dataset: '" + DataPath + "'</color>");            CustomSendMessage(HashtableEX.Construct(                    "Success", false                    ));        }        isFirst = false;    }    /// <summary>    /// Destory Old DateSet and ImageTarget Object    /// </summary>    public static void DestroyDateObject()    {        try        {            var objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();            var dataSet = objectTracker.GetActiveDataSets();            if (dataSet!=null) {                List<DataSet> t = new List<DataSet>(dataSet);                while (t.Count > 0) {                    var i = t[0];                    t.Remove(i);                    objectTracker.DeactivateDataSet(i);                    objectTracker.DestroyDataSet(i, false);                    var trackables = i.GetTrackables();                    foreach (var item in trackables) {                        TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(item, true);                    }                }            }        }        catch(Exception e)        {            Debug.Log(e.ToString());        }    }    static void NullCustomSendMessage(Hashtable NullHashTable)    {    }}
0 0
原创粉丝点击