1.在Unity里 Vuforia 用来做识别信息的是 StreamingAssets 下 Vuforia文件夹内的 Dat和XML 文件。

2.想要替换识别图需要在Vuforia官网里替换识别图 (这里替换的识别图名字要和之前的识别图名字一样),
  替换完成后直接下载所有文件 选择Android文件 直接获取 Dat和XML文件,然后把这俩文件传至服务器

3.在打包之后,每次打开应用的时候做更新检查,如果有更新就去服务器下载这俩文件替换掉原来的文件(Android包 没法用IO读取
  StreamingAssets下的文件, 直接用UnityWebReques 替换就行)

2.之前的理解有问题,其实不是替换原先的Dat和XML文件, 是重新下载新的Dat和XML 文件 通过代码的方式动态

加载识别图,达到替换的目的,默认的加载顺序是上传到Vuforia里的顺序

这是一个大概思路后续等我写完,会贴上代码

我是把这个代码放在ARCamera 上的, 打开应用下载完Dat和XML 以后,加载ARCamera 顺带着就初始化了识别图信息。目前使用下来没什么问题,就是注意它默认加载顺序(这个顺序是固定的)

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using Vuforia;
using QFramework;
/// <summary>
/// 识别图管理器
/// </summary>
public class ImageTargetManager : MonoSingleton<ImageTargetManager>
{
//public Text logtest; //public Text errortext;
// public List<GameObject> listShowObj;
/// <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 = null;
/// <summary>
/// 识别器
/// </summary>
private ObjectTracker m_tracker;
/// <summary>
/// 识别图集合对象
/// </summary>
private ImageTargetBehaviour[] m_imageTargetBehaviours; private void Start()
{
// Debug.Log(" Inited " + m_isLoaded);
m_isLoaded = false;
//TODO 识别图相关信息加载
//VuforiaBehaviour.Instance.RegisterVuforiaInitializedCallback(VuforiaInitedCallBack); try
{
VuforiaARController.Instance.RegisterVuforiaInitializedCallback(VuforiaInitedCallBack);
VuforiaARController.Instance.RegisterVuforiaStartedCallback(VuforiaStaredtCallBack);
}
catch (Exception e)
{ // errortext.text = e.Message;
}
}
/// <summary>
/// 高通初始化完毕回调
/// </summary>
void VuforiaInitedCallBack()
{
m_localFilePath = Application.persistentDataPath + "/StreamingAssets/Vuforia/" + AppConfigConst.IMAGE_TARGET_FILE_NAME + ".xml"; Debug.Log( " Inited@@@ "+m_localFilePath+" " +File.Exists(m_localFilePath));
//logtest.text = " Inited@@@ " + m_localFilePath + " " + File.Exists(m_localFilePath);
if (File.Exists(m_localFilePath))
{
//Load Local
StartCoroutine(LoadLocalFile());
}
else
{
//Load NetWork
//StartCoroutine(LoadNetworkFile());
}
} void VuforiaStaredtCallBack()
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
// errortext.text = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO).ToString(); //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();
Debug.Log(isVuforiaEnabled);
// logtest.text = "isVuforiaEnabled " + isVuforiaEnabled + " m_isLoaded " + m_isLoaded;
if (isVuforiaEnabled && m_isLoaded == false)
{
if (m_dataSet == null)
{
m_tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
m_dataSet = m_tracker.CreateDataSet();
} Debug.Log("LoadData " + m_localFilePath);
// logtest.text = "LoadData " + m_localFilePath;
ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
objectTracker.Stop();
if (m_dataSet.Load(m_localFilePath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE))
{
Debug.Log("LoadData OVer " + m_localFilePath);
// logtest.text = "LoadData OVer " + m_localFilePath; m_isLoaded = true;
m_tracker.ActivateDataSet(m_dataSet);
// errortext.text = m_tracker.ActivateDataSet(m_dataSet).ToString(); objectTracker.Start();
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>();
// logtest.text = m_imageTargetBehaviours.Length.ToString();
for (int i = 0; i < m_imageTargetBehaviours.Length; i++)
{
ImageTargetBehaviour imageTargetBehaviour = m_imageTargetBehaviours[i];
// logtest.text = logtest.text+" "+ m_imageTargetBehaviours[i].name;
imageTargetBehaviour.name = "ImageTarget_" + imageTargetBehaviour.ImageTarget.Name; //imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>(); //读取 DefaultTrackableEventHandler.lua
imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();
// imageTargetBehaviour.gameObject.AddComponent<LuaTrackableEventHandler>();
imageTargetBehaviour.gameObject.AddComponent<TurnOffBehaviour>();
imageTargetBehaviour.gameObject.AddComponent<VuforialFindImageAction>();
imagetargetNameList.Add(imageTargetBehaviour.name); //listShowObj[i].transform.parent = imageTargetBehaviour.transform;
//listShowObj[i].transform.localPosition = Vector3.zero;
VuforialFindImageAction imageaction = imageTargetBehaviour.gameObject.GetComponent<VuforialFindImageAction>();
GameObject obj = new GameObject("Cube");
obj.transform.parent = imageaction.transform;
obj.transform.localEulerAngles = new Vector3(90, 0, 0);
obj.transform.localPosition = Vector3.zero; imageaction.num = i;
imageaction.targetObj = obj.transform;
imageaction.pointObj = 0; } 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);
}
}
}

Unity Vuforia 动态替换识别图的更多相关文章

  1. Unity3D 动态地创建识别图

    前面介绍了EasyAR的单图识别,它是提前在Unity设置好图片路径的,那么如果我们的图片是存储在服务器上的,那么我们肯定不能直接把服务的图片地址填上去了.这个时候我们可以动态地创建识别图.步骤如下: ...

  2. Unity3D 创建动态的立方体图系统

    Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方 ...

  3. 开发增强现实(AR)教程——识别图的那些坑

    第一期:Vuforia识别图的那些坑 一.Vuforia的图片识别机制 大学时学习的是计算机科学的数字媒体方向,图像处理粗略接触过,对于Vuforia的图片识别机制,只能大概讲一下步骤和猜想,无法给出 ...

  4. 3D动态人脸识别技术分析——世纪晟人脸识别实现三维人脸建模

    - 目录 - 国内3D动态人脸识别现状概况 - 新形势下人脸识别技术发展潜力 - 基于深度学习的3D动态人脸识别技术分析 1. 非线性数据建模方法 2. 基于3D变形模型的人脸建模 - 案例结合——世 ...

  5. Java 程序动态替换 docx 模板中定制值的实现例子

    项目系统中打印功能,导出 word 文档功能是挺常用的,本文介绍自定文档模板,程序实现模板内容中值替代的功能. 模板文件 template.docx ​ 执行 main public static v ...

  6. vue项目中,无需打包而动态更改背景图以及标题

    1.背景 今天,项目经理对已完成的项目提出了一个需求,即项目的基础功能目前针对于各个基层法院都适用,而对于不同的法院,我们每次都需要前端研发来更改所属法院的法院名称以及背景图,这样对于演示者来说是非常 ...

  7. Vue实现长按图片识别图中二维码

    Vue实现长按图片识别图中二维码 思路:要想实现可以识别图片中的二维码,那必定是要将这张图进行上传操作,上传则需要file对象格式.不管是在H5还是APP中,展示的图片都是通过url的方式展示在img ...

  8. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  9. 【转载】利用Unity自带的合图切割功能将合图切割成子图

    虽然目前网上具有切割合图功能的工具不少,但大部分都是自动切割或者根据plist之类的合图文件切割的, 这种切割往往不可自己微调或者很难维调,导致效果不理想. 今天逛贴吧发现了一位网友写的切割合图插件很 ...

  10. 使用Unity创造动态的2D水体效果

    者:Alex Rose 在本篇教程中,我们将使用简单的物理机制模拟一个动态的2D水体.我们将使用一个线性渲染器.网格渲染器,触发器以及粒子的混合体来创造这一水体效果,最终得到可运用于你下款游戏的水纹和 ...

随机推荐

  1. [数据结构]克鲁斯卡尔(Kruskal)算法

    算法的概念 与Prim算法从顶点开始扩展最小生成树不同,Kruskal算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法.假设N=(V,E)是连通网,对应的最小生成树T=(Vt,Et),Kr ...

  2. while2.c程序

    /*while2.c程序->注意分號的位置*/ 1 #include<stdio.h> 2 int main(void) 3 { 4 int n=0; 5 6 while(n++&l ...

  3. JS按空格和换行或者其他字符进行切割形成数组

    据我所测试,目前最好用的代码是: 方案一 let arr = value.split(/[,,\s\n]/).filter(_ => _) 方案二 let arr = value.replace ...

  4. 反射_Class对象功能概述-反射_Class对象功能_获取Field

    反射_Class对象功能概述 * Class对象功能: * 获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getF ...

  5. 安装Windows Server 2022 - 初学者系列 - 学习者系列文章

    这天要写一个关于系统部署的系列文章,涉及到Windows Server 2022操作系统的安装,所以就写了此文.Windows系列的操作系统安装,以前的博文中都有介绍,这里再次做一个安装描述吧.需要的 ...

  6. GaussDB(DWS)现网案例:collation报错

    摘要:用户创建hash分布表,使用pbe方式执行使用分布列作为查询条件的语句时报错 本文分享自华为云社区<GaussDB(DWS)现网案例之collation报错>,作者: 你是猴子请来的 ...

  7. ES字段类型

    1 String ELasticsearch 5.X之后的字段类型不再支持string,由text和keyword取代,不做说明. 2 text和keyword 2.1 简介 ElasticSearc ...

  8. vs code 关联gitee码云或github以及GIT 常用命令

    一.准备 1.本地安装vs code 和GIT源代码管理工具 2.配置vscode git全局变量 打开左下角设置-->点击用户-->搜索git.path-->settings.js ...

  9. 接口介绍以及postman的基本使用

    集成测试--测试接口 接口测试也是在测试执行阶段做 一.什么是接口 软件的不同模块之间互相发送数据的一个通道 二.接口的组成 1.请求URL--接口地址2.请求类型 get get请求的参数是暴露在U ...

  10. javaEE(单元测试、反射、动态代理、xml)

    单元测试 最小的功能单元编写测试代码,java针对方法,检查方法的正确性 JUnit单元测试框架 @Test注解 public class A { @Test public void a(){ ... ...