动态加载Vuforia识别信息

Unity2017 ; vuforia-unity-6-2-10;

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Vuforia;
/// <summary>
/// 识别图管理器
/// </summary>
public class ImageTargetManager : MonoBehaviour
{
    /// <summary>
    /// 识别图加载完成
    /// </summary>
    public event Action<string[]> ImageTargerLoadedEvent;

    /// <summary>
    /// 本地文件路径
    /// </summary>
    private string m_localFilePath;
    /// <summary>
    /// 是否加载过
    /// </summary>
    private bool m_isLoaded;
    /// <summary>
    /// 数据集
    /// </summary>
    private DataSet m_dataSet;
    /// <summary>
    /// 识别器
    /// </summary>
    private ObjectTracker m_tracker;
    /// <summary>
    /// 识别图集合对象
    /// </summary>
    private ImageTargetBehaviour[] m_imageTargetBehaviours;

    private void Start()
    {
        m_isLoaded = false;
        //TODO  识别图相关信息加载
        //VuforiaBehaviour.Instance.RegisterVuforiaInitializedCallback(VuforiaInitedCallBack);
        VuforiaARController.Instance.RegisterVuforiaInitializedCallback(VuforiaInitedCallBack);
        VuforiaARController.Instance.RegisterVuforiaStartedCallback(VuforiaStaredtCallBack);
    }
    /// <summary>
    /// 高通初始化完毕回调
    /// </summary>
    void VuforiaInitedCallBack()
    {
        m_localFilePath = Application.persistentDataPath + "/StreamingAssets/Vuforia/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml";

        if (File.Exists(m_localFilePath))
        {
            //Load Local
            StartCoroutine(LoadLocalFile());
        }
        else
        {
            //Load NetWork
            //StartCoroutine(LoadNetworkFile());
        }
    }

    void VuforiaStaredtCallBack()
    {
        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  //auto focus
    }

    /// <summary>
    /// 加载网络配置文件
    /// </summary>
    /// <returns></returns>
    private IEnumerator LoadNetworkFile()
    {
        WWW wwwdat = new WWW(AppConfigConst.IMAGE_TARGET_FILE_PATH + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".dat");
        yield return wwwdat;

        Debug.Log(wwwdat.url);
        WWW wwwxml = new WWW(AppConfigConst.IMAGE_TARGET_FILE_PATH + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml");
        yield return wwwxml;

        File.WriteAllBytes(Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".dat", wwwdat.bytes);
        File.WriteAllBytes(Application.persistentDataPath + "/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml", wwwxml.bytes);
        StartCoroutine(LoadLocalFile());
    }

    /// <summary>
    /// 加载本地配置文件
    /// </summary>
    /// <returns></returns>
    IEnumerator LoadLocalFile()
    {
        bool isVuforiaEnabled = VuforiaRuntimeUtilities.IsVuforiaEnabled();
        if (isVuforiaEnabled && m_isLoaded == false)
        {
            if (m_dataSet == null)
            {
                m_tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
                m_dataSet = m_tracker.CreateDataSet();
            }
            if (m_dataSet.Load(m_localFilePath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE))
            {
                m_isLoaded = true;
                m_tracker.ActivateDataSet(m_dataSet);
                UpdateImageTarget();
            }
            else
            {
                m_isLoaded = false;
            }
        }
        WWW www = new WWW("file:///" + m_localFilePath);
        yield return www;
    }

    /// <summary>
    /// 修改Imagetarget 的名称
    /// </summary>
    void UpdateImageTarget()
    {
        List<string> imagetargetNameList = new List<string>();
        m_imageTargetBehaviours = FindObjectsOfType<ImageTargetBehaviour>();
        for (int i = 0; i < m_imageTargetBehaviours.Length; i++)
        {
            ImageTargetBehaviour imageTargetBehaviour = m_imageTargetBehaviours[i];
            imageTargetBehaviour.name = "ImageTarget_" + imageTargetBehaviour.ImageTarget.Name;

            //imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();

            //读取 DefaultTrackableEventHandler.lua
            //imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();
            imageTargetBehaviour.gameObject.AddComponent<LuaTrackableEventHandler>();
            imageTargetBehaviour.gameObject.AddComponent<TurnOffBehaviour>();
            imagetargetNameList.Add(imageTargetBehaviour.name);
        }
        OnImageTargerLoadedEvent(imagetargetNameList.ToArray());
    }

    /// <summary>
    /// 获取所有的识别图对象
    /// </summary>
    /// <returns></returns>
    public ImageTargetBehaviour[] GetImageTargetBehaviours()
    {
        return m_imageTargetBehaviours;
    }

    protected virtual void OnImageTargerLoadedEvent(string[] obj)
    {
        var handler = ImageTargerLoadedEvent;
        if (handler != null)
        {
            handler(obj);
        }
    }
}

class AppConfigConst
{
    public static string IMAGE_TARGET_FILE_PATH = "";   //http url http://54.193.6.32:8080/U3dFileToServer/upLoad/WFJ/AssetBundle/
    public static string IMAGE_TARGET_FILE_NAME = "USTC";
}
时间: 2024-10-03 14:02:09

动态加载Vuforia识别信息的相关文章

Selenium来抓取动态加载的页面

一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及ajax动态加载的,例如:花瓣网.这时如果我们直接分析原始页面的html,是得不到有效的信息的.当然,因为无论怎样动态加载,基础信息总归是包含在初始页面中得,所以我们可以用爬虫代码来模拟js代码,js读取页面元素值,我们也读取页面元素值;js发送ajax,我们就拼凑参数.发送ajax并解析返回的jso

使用Selenium来抓取动态加载的页面

原文:http://my.oschina.net/flashsword/blog/147334?p=1 一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及ajax动态加载的,例如:花瓣网.这时如果我们直接分析原始页面的html,是得不到有效的信息的.当然,因为无论怎样动态加载,基础信息总归是包含在初始页面中得,所以我们可以用爬虫代码来模拟js代码,j

Objective-C多态:动态类型识别+动态绑定+动态加载

一.Objective-C多态 1.概念:相同接口,不同的实现 来自不同类可以定义共享相同名称的方法. 动态类型能使程序直到执行时才确定对象所属类型 动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法 2.Objective-C不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载 3.id类型:通用指针类型,弱类型,编译时不进行类型检查 二.动态类型识别 1.任意NSObject的子类都会继承NSObject的isa实例变量,而且当NSO

C# 动态加载程序集信息

在设计模式的策略模式中,需要动态加载程序集信息,本文通过一个简单的实例,来讲解动态加载Dll需要的知识点. 涉及知识点: AssemblyName类,完整描述程序集的唯一标识, 用来表述一个程序集. Assembly类,在System.Reflection命名空间下,表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构建基块. Module类 表述在模块上执行反射,表述一个程序集的模块信息. Type类,在System命名空间下,表示类型声明:类类型.接口类型.数组

【OC学习-16】动态VS静态类型识别?什么是动态绑定和动态加载?

动态VS静态 我们在实例化一个对象时,一般都是如下,就是静态类型: ASPerson * person=[[ASPerson alloc]init]; 还有一种是动态类型: id person=[[ASPerson alloc]init]; 可以看出来: (1)一般的带有明显类名(静态指针)的都是静态类型,而用id的通用指针的都是动态类型: (2)静态类型更容易阅读,更友好: (3)一般不涉及多态的时候,尽量用静态类型. 动态绑定和动态加载 这其实是针对类和对象说得,就是很多事情都不是事先弄好的

unity 3D里有两种动态加载机制

unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 1.    AssetBundles是什么? 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等

Dalvik虚拟机动态加载DEX/JAR

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 在文章Dalvik虚拟机加载类的机制中,我们讨论了Dalvik虚拟机加载类的相关原理,本文就来讨论一下,如何利用Dalvik提供的这些机制进行DEX/JAR的动态加载. 首先要说明的是虽然Dalvik虚拟机可以进行动态加载,却无法像Java虚拟机那样方便动态加载JAR,也不支持

【转】Unity3D AssetBundles 动态加载游戏资源

AssetBundles are files which you can export from Unity to contain assets of your choice. These files use a proprietary compressed format and can be loaded on demand in your application. This allows you to stream content like models, textures, audio c

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME