Unity如何在AR镜头通过Vufoira动态展示不同模型

171909049游嘉龙 学生 2022-06-22 17:27:50
这个作业属于哪个课程福州大学软件工程W班
这个作业要求在哪里作业要求
这个作业的目标介绍如何使用Vuforia在Unity中动态展示不同模型
其他参考文献

目录

  • 本文技术概述
  • 前言(关于Vuforia)
  • 正文
  • 使用Vuforia识别图片展示模型
  • 问题进化与思考
  • 如何动态实现一个场景中的一个ImageTarget动态加载不同的模型而不损耗性能
  • 总结
  • 参考文献

本文技术概述

当我们在进行Unity的AR镜头开发时,一般都会使用到Vufoira引擎来进行AR识别和模型展示,但是一般只会展示你固定在项目中的ImageTarget下的模型,而根据不同用户场景展示不同模型却成为了问题。所以本文会介绍如何借助Vufoira使用AR镜头以及如何动态展示不同模型。
使用技术:Unity2019、Vuforia、C#
解决的问题:Vufoira的基本使用、Vufoira环境下模型的动态展示

前言(关于Vuforia)

  • Vufoira是一款Untiy下的基于AR(增强现实技术)的插件,开发者可以借助其开发相关的AR产品。
  • 基本原理是根据识别环境中的相关标识物(如图片,规则物体、地面等)来生成和这些标识物相绑定的相关的虚拟形象(例如虚拟场景、虚拟图片覆盖、虚拟音频覆盖、虚拟模型展示)来达到增强现实的技术。
  • Vufoira官方网站链接

正文

使用Vuforia识别图片展示模型

  • 首先,你需要有一个Vufoira的官方账号,你需要到Vufoira官方网站进行注册,然后在点击下面界面的GetBsic创建属于自己的AR项目

在这里插入图片描述

  • 创建成功后点击你创建的项目,会看到如下页面

在这里插入图片描述

  • 将灰色框体中的许可证序列号复制下来,然后打开Unity,在PackageManager找到VufoiraEngine,下载,然后添加进你的项目中,然后找到在ARCamera文件夹下的Vuforia behavior组件下点击Open Vuforia configuration,添加刚刚复制的许可证,并且设定相应配置。

在这里插入图片描述


  • 到此配置就完成了,然后继续回到官网,添加识别目标体(以图片为例),点击上方的TargetManager,然后选择你刚刚创建的项目,然后进入如下页面
  • 然后点击AddTarget,添加标识图片,添加完毕后点击相应的图片选择下载

在这里插入图片描述


在这里插入图片描述

  • 下载完毕后是一个UnityPackage包,可以直接打开Unity导入,导入完毕后就可以在之前创建好的Unity项目的Hierarchy窗口新建一个Image Target,然后在组件ImageTargetBehaviour中选择FromDataBase,选择你之前导入的图片标识物。

  • 到此基本的配置AR识别物的流程就完成了,然后接下来就是在ImageTarget组件下添加你自己想要在这张图片上面展示的物体,这样当AR镜头识别到当前场景中有这张图片的话就会将ImageTarget组件下的物体模型按照相对定位展示在图片上了。
  • 效果如下图

问题进化与思考

那么问题来了,如果我需要根据不同的用户场景展示不同的模型怎么办呢?
有一种方法就是,我有几个模型,我就设置几个ImageTarget,根据不同的识别物,来识别不同的NPC,但是这就会导致一个场景中有许多ImageTarget,性能下降不说,而且每一个模型需要不同的识别图片,导致找高质量的识别图片以及绑定工作成倍上升。
那么有没有一种方法,可以只输入一个变量,同一个ImageTarget根据这个变量来动态显示不同的模型呢?官方角度来说是没有的,而且ImageTarget只会傻乎乎加载他的所有子物体。
但虽然官方没有这样的方法,但是却留下了默认的脚本类,我们可以通过继承修改其中脚本类的方法来实现我们的想法。

如何动态实现一个场景中的一个ImageTarget动态加载不同的模型而不损耗性能

  • 接下来我就来介绍刚刚思路的解决方案,首先还是刚刚的项目,我们可以看到ImageTarget下有一个官方默认的脚本,名字为:DefaultTrackableEventHandler(Script)

  • 我们首先删除这个脚本,然后新建一个自己的脚本,就叫做MyDefaultTrackableEventHandler,然后将该脚本绑定在ImageTarget来代替原来脚本的功能,并且打开我们新建的脚本。
  • 在该脚本中,我们首先要该脚本继承原来DefaultTrackableEventHandler脚本,以继承其原本默认的功能。
  • 然后在Start函数中调用base.Start()使用基类Start函数
  • 然后接下来的步骤就是关键了,还是在Start函数中,添加如下代码,用于从Resource/Prefab/Model的文件夹中加载一个你需要的模型实例,然后初始化。
NpcModel = Resources.Load("Prefab/Model/" + "你想要加载的模型的名字") as GameObject;
        NpcModel = Instantiate(NpcModel);
  • 然后继续添加如下代码,用于在ImageTarget下的Empty物体中加入你需要载入的模型,这个Empty相当于你想要在图片的那里生成你想要生成的模型,可以只留下坐标而不保留缩放,让其不可见。相当于一个实体锚点。
NpcModel.transform.parent = this.transform.Find("Empty");   //挂载到ImageTarget的子物体Empty下
NpcModel.transform.rotation = Quaternion.Euler(0f, 180f, 0f);   //调整方向
  • 最后添加如下代码,刷新一次识别体,因为你如果不刷新,你动态加到场景中的模型会直接展示出来,你需要刷新一次让其丢失直到第一次识别到标识体。到此就完成了动态加载模型了。
//执行一次刷新动作
        base.OnTrackingLost();
  • 整体代码如下
using PixelCrushers.DialogueSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class MyDefaultTrackableEventHandler : DefaultTrackableEventHandler
{
    private GameObject NpcModel;

    protected override void Start()
    {
        base.Start();
        NpcModel = Resources.Load("Prefab/Model/" + "你想要加载的模型的名字") as GameObject;
        NpcModel = Instantiate(NpcModel);
        NpcModel.transform.parent = this.transform.Find("Empty");   //挂载到ImageTarget的子物体Empty下
        NpcModel.transform.rotation = Quaternion.Euler(0f, 180f, 0f);   //调整方向

        //将目标NPC绑到静态AR相机数据集中
        ARCameraStaticData.NpcModel = NpcModel;

        //执行一次刷新动作
        base.OnTrackingLost();
    }
}
  • 这是我的项目中的代码实例,其中的StaticData就是用来存放当前用户场景要加载哪个NPC模型的id的,这样当当前AR镜头被唤醒时就可以根据用户环境动态加载不同NPC模型而达到代码简易,性能优良的效果。

    在这里插入图片描述

  • 效果展示(同一场景同一ImageTarget同一识别物不同用户场景不同NPC)


总结

通过上述方式进行AR场景中模型的动态展示,既可以免去实现多个ImageTarget甚至多个场景的繁琐操作,也不会被一个ImageTarget导致场景性能场景降低而苦恼。同时还便于拓展出不同的模型NPC,只需要做的操作就是将新模型添加到Model文件夹中然后修改好对应的名字,就可以了,无需更多操作。

参考文献

标题作者
Vuforia的各种Target的简单介绍(包括地面识别)SaFuFuの绝世
手把手带你做AR应用(包含预定义目标识别,自定义目标识别,模型动画和视频播放)酸菜一汤
...全文
4264 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

142

社区成员

发帖
与我相关
我的任务
社区描述
2022年福大-软件工程;软件工程实践-W班
软件工程 高校
社区管理员
  • FZU_SE_teacherW
  • 丝雨_xrc
  • Lyu-
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧