VuforiaSDK|手把手带你做AR应用(包含预定义目标识别,自定义目标识别,模型动画和视频播放)

由于课程原因学习了Unity平台下VuforiaSDK的AR应用开发,制作过程中也遇到了不少问题,作为记录发在这里,希望对大家有帮助!

目录

一、准备工作

二、创建一个单张图预定义目标识别的应用

三、用户自定义目标识别应用实现

四、模型动画

五、播放音乐

六、识别播放视频


一、准备工作

需要下载vuforiaSDK,新版unity可能有自带的,我这里是Unity2017+Vuforia 6.0.6。

在使用VuforiaSDK前需要注册一个账号,注册账号获取许可证后才可以进行开发,官网指路https://developer.vuforia.com/,访问可能会有点慢,不过不是急事的话应该还是可以的。注册激活完账号后点击获取许可证(在Develop大标题下):

点击下面这一长串就是许可证号啦,后面开发应用的时候需要有这一长串神秘的字符串才可以

另一个需要在vuforia做的操作是添加数据库,也就是用来识别的目标,切换到Target Manager视图,点击Add Database:

选择device类型即可,关于Vumark暂时还没有研究过,感兴趣的同学可以去搜搜看,网上也有相关教程。进入数据库,可以看到如下视图,target就是我们添加过的目标对象,一个数据库可以有多个识别目标,用名字区分,Rating的星星数越多它的可辨识度就越高,勾选需要的目标点击下载(建议保存到一个好记的地方),平台选择Unity就会自动生成一个unitypackage给你下载到本地。

点击Add Target添加目标,这里选择最简单的的二维图像为目标,其他内容都在图片上进行了标注

在数据库面板点击某个目标的名称可以看它的特征点,如下图,十字表示的是计算得到的特征点,特征点数越多,识别效率越高(需要点击图片下方的show feature):

需要在官网做的操作就是这些。整理一下:

  1. 注册登录
  2. 申请许可证Liscence
  3. 创建识别目标Target
  4. 上传识别图像并生成数据库Database
  5. 下载数据库Database

需要安装JDK和AndroidSDK并配置好环境!!

在Unity中打开Edit->preference->External Tools填写jdk和sdk路径

到这里准备工作基本结束了,接下来就可以开始道阻且长的开发之路了

二、创建一个单张图预定义目标识别的应用

在完成上述步骤后打开unity,导入VuforiaSDK的扩展包(高版本不需要),新建场景删掉主摄像机,进入主界面vuforia->prefab下有如下预设,这里我们用到的有ARCamera和ImageTarget,其他的分别有对应立体对象、多个对象、虚拟按钮、vumark等不同的预设体:

我们把导入的模型,可以在Assest store下载完整的模型扩展当然也可以是自己做的,自己做可能需要导出fbx模式,不是特别了解。我这里使用的是网上免费的一个3D少女模型,长这样(应该是在这里下载的http://www.aigei.com/unity3d/model/characters/

我们去把这个女孩的模型拖到ImageTarget下

把刚刚下载好的数据库导入(在Assests面板点击鼠标右键->import pacage->custom package,选择下载的database就好了)以备用,这样的话一个AR应用需要的几个因素:识别目标、识别后的模型和对应功能相机就都有了,剩下的是配置的事情了

在ARCamera的Vuforia behavior组件下点击Open Vuforia configuration

进入vuforia项目配置面板填写许可证并激活数据库:

点击image target 在其右侧Image Target Behaviour中勾选数据库及识别图像

然后你就可以在你的电脑上试着运行一下了!导出到安卓端时注意在player settings中重命名一下公司名称和产品名称,就可以导出一个特定目标识别ar应用的apk了。检查一下:

  1. 打开Unity(滑稽)
  2. 导入vuforiaSDK,用于显示的模型,下载好的Database
  3. 删除主摄像机
  4. 导入ARCamera、ImageTarget
  5. 打开配置(在ARCamera的Insepeter面板中)检查许可证
  6. ImageTarget确认数据库激活与目标图像选择

个别导出有问题的百度Unity导出apk的问题。

 

三、用户自定义目标识别应用实现

这一块需要用到vuforia中的另一个预设,UserDefinedTargetBuilder,和ARCamera在一个目录下,忘记的往上翻(微笑)

操作之前我们想一下,一个预定义目标的识别需要数据库支撑识别任务,那如果我们没有预定义图像是不是就不需要这个数据库了呢?是的,删掉他!或者你可以回到前面把数据库激活的勾给他取消掉,当然最重要的不在这里,我们打开ImageTargetBehavior组件,将Type从predefined改为userDefined,就可以了!

当然我们还需要告诉vuforia我选好这个目标了,你识别吧!这件事情需要通过事件系统实现,我们添加一个按钮,右键->Create->UI->Button,我们的目的是点击这个按钮以动态生成识别目标。添加脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using Vuforia;

public class UserDefined : MonoBehaviour, IUserDefinedTargetEventHandler {

	ObjectTracker mObjectTracker;
	DataSet mBuiltDataSet;

	ImageTargetBuilder.FrameQuality mFrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;

	int mTargetCounter;
	public ImageTargetBehaviour ImageTargetTemplate;

	UserDefinedTargetBuildingBehaviour mTargetBuildingBehaviour;

	// Use this for initialization
	void Start () {
		mTargetBuildingBehaviour = GetComponent<UserDefinedTargetBuildingBehaviour> ();
		if (mTargetBuildingBehaviour) 
		{
			mTargetBuildingBehaviour.RegisterEventHandler (this);
			Debug.Log ("Registering User Defined Target event handler.");
		}
	}

	public void OnInitialized()
	{
		mObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
		if (mObjectTracker != null)
		{
			mBuiltDataSet = mObjectTracker.CreateDataSet();
			mObjectTracker.ActivateDataSet(mBuiltDataSet);
		}	
	}

	public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)
	{
		mFrameQuality = frameQuality;
		if (mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_LOW) {
			Debug.Log ("Low camera image quality");
		}
	}

	public void OnNewTrackableSource(TrackableSource trackableSource)
	{
		mTargetCounter++;
		mObjectTracker.DeactivateDataSet(mBuiltDataSet);

		if(mBuiltDataSet.HasReachedTrackableLimit() || mBuiltDataSet.GetTrackables().Count() >= 5){
			IEnumerable<Trackable> trackables = mBuiltDataSet.GetTrackables();
			Trackable oldest = null;
			foreach(Trackable trackable in trackables){
				if(oldest == null || trackable.ID<oldest.ID){
					oldest = trackable;
				}
			}

			if(oldest!=null){
				Debug.Log("Destroying oldest trackable in UDT dataset:" + oldest.Name);
				mBuiltDataSet.Destroy(oldest, true);
			}
		}

		ImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);
		imageTargetCopy.gameObject.name = "UserDefinedTarget-" + mTargetCounter;

		mBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);

		mObjectTracker.ActivateDataSet(mBuiltDataSet);
		
	}

	public void BuildNewTarget()
	{
		mTargetBuildingBehaviour.BuildNewTarget("test", 50);
		
	}

	

	// Update is called once per frame
	void Update () {
		
	}
}

希望大家在复制粘贴的同时读一读这段代码,不是很难,如果读不懂隔壁不少博客有注释版本可以去看一看。这段代码挂到UserDefinedTargetBuilder,在button的onclick事件中添加

生成Button的时候会自动生成一个EventSystem,千万不要删(不要问我为什么知道的),这是Unity的事件监听系统,简而言之就是没了它你点按钮就没有反应了。自定义目标的AR应用就是这个样子啦,可以开始调试了。出问题检查:

  1. ImageTarget下是否切换为UserDefinedTargetBuilder
  2. ImageTarget识别模式是否切换为UserDefined
  3. 按钮事件是否绑定正确
  4. 许可证填了吗

四、模型动画

想必你也发现了,你的模型压根就不动,一直保持T型,这个时候我们要引入模型动画了,Unity有两种动画组件,Animation和Animator,区别的话,Animation处理legacy动画,Animator是其他类型,怎么看动画类型呢,点击你的fbx动画文件,如果是下载的模型一般在animations下,

随意点击一个动画,右侧点击Rig(绑定)Animation Type就是动画类型,legacy是比较老的动画系统了,不过我这个版本的unity+vuforia只支持legacy动画,只能使用animation组件,高版本支持其他类型动画,也就是可以用animator的意思。

我们找到模型,为其添加Animation组件添加一个默认动画,下面就是一些播放类型(有循环播放,仅播放一次等选项,按需求选择即可),是否自动播放和是否有交互的选择,Animations是一个列表,有了它你就可以配合代码播放多个动画了,使用  .play()方法,具体可以移驾Animation组件的相关文档或教程。

这样你再打开你的摄像头识别后你的人物就是活动的了!

五、播放音乐

我们见过的市面上的应用基本都是识别后会播放音效的,那我们也DIY一个伴随音乐的AR应用好了。添加一个AudioSourse组件,在哪里加都可以,我推荐在模型上加,AudioClip加入你的音源,下面可以调节音频关的效果,还可以调节3D效果。

如果就此打住你会发现只要你一打开应用他就开始唱歌,这显然和我们的需求不同,我们要让他识别到目标的时候播放,失去时就不用播放了。仔细想一下,音乐的播放和暂停是不是和模型的出现隐藏是同步的呢?到这里你就会发现AR其实就是一个大的条件判断句

你打开vuforia的事件处理函数也会发现它本质上的确就是这样的:

那如果我们想播放音乐暂停音乐只要放到对应的时间函数里就可以了嘛,打开vuforia->script->DefaultTrackableEventHandler做如下改动:

public class DefaultTrackableEventHandler : MonoBehaviour,ITrackableEventHandler
{
public AudioSource music;
	…
		private void OnTrackingFound()
       {
            …
      		if(!music.isPlaying){
           	music.Play();
           } 
        }
		private void OnTrackingLost()
       {
		    …
     		if(music.isPlaying){
                music.Pause();
           } 
       }
}

在在ImageTarget对应的面板将添加到模型上的音乐拖过去,大功告成了!当然你也可以创建数组随机播放音乐,或让你的模型说话也是可以的~

 

六、识别播放视频

前面提到了ar的整个流程是一个条件判断句,那么如果你想添加视频就只需要把前面的模型替换成视频组件就好。目前vulforia已经提供了免费的视频组件VideoPlayback,官网可下,做法在下面给出:

  1. Imagetarget下添加预制体videoplayback->prefab->Video;
  2. ARCamera下挂载脚本PlayVideo;
  3. Imagetarget挂载trackable Event Handler(资源包里有)脚本并删除原先的Default Event Handler;
  4. Video对象下Videoplayback组件path变量加入所播放视频的名称,视频存在StreamingAssest下。
  5. AR Liscense填写及数据库激活后即可实现播放视频。

如需播放多个视频挂载多个video即可。pc端(起码我这个版本)不支持视频的播放,手机端可以,如果导出apd有问题可以按如下顺序进行排查:

  1. UserSettings里的公司和产品名称需要更改,底部产品信息需要和上面的名称保持一致
  2. AndroidSDK和JDK是否加载,版本是否对应,路径是否正确

如果到这里还不行,看看隔壁有没有文章专门解析吧。

 

到这里,其实AR能做的远比这些多的多,这里只是入门级的应用,就好比hello word,个人印象最深刻的是2019年谷歌开发者大会上的AR咖啡机说明软件,当然那里使用的是google自家的SDK,感兴趣可以去(b站老番茄)那里看一看~希望这些内容能帮到初识VR的你!

 

本文仅供学习参考,如果有问题欢迎大家的批评指正,如有侵权联系删除。

 

参考资料:

[1] 吴雁涛,《Unity3D平台 AR与VR开发快速上手》,https://wqbook.wqxuetang.com/read/pdf/3202153

[2] Unity动画模式——Legacy, https://www.cnblogs.com/hammerc/p/4830030.html

[3] Unity动画模式的区别, https://blog.csdn.net/weixin_38239050/article/details/79720472

[2] vuforia自定义目标识别 ,https://blog.csdn.net/weixin_38239050/article/details/80754029

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值