玩过 unity3d AR的童鞋应该知道,在 Unity3d 中配合Vuforia 库可以很轻松地识别图片并在上面建立模型。然而,在 vuforia 官网中,不仅可以识别图片,还可以识别几何体,特别是从 vuforia4.x 开始支持识别更不规则的3d物体。本文将详细介绍如何在 Unity3d 中用 Vuforia 做简单的3d物体识别。
文章将分为 vuforia 识别过程和 unity 开发过程两部分进行描述。
1 . 需要在Vuforia官网上做的准备
在开始之前,需要在官网上注册自己的账号,才能新建app,获得自己的license(后面需要用到)和上传需要识别的图片或物体作为target。
2 . 选取需要识别的物体
对于3d物体的识别,需要符合以下几点标准:
例如一些玩具公仔、玩具车,都是比较好的识别对象
3 . 打印识别图,物体需要放在右上角的网格中进行识别,打印如下所示的识别图时需要注意控制尺寸大小,让网格大小和物体的大小刚刚好是符合的,这样可以便于之后的识别过程更加精准(后面将详细解释)。
4 .下载扫描工具scanner,3d物体的识别需要上传.od(object data file)文件到Vuforia官网。至于.od文件的生成,需要到官网下载名为vuforia object scanner的apk,然后安装到安卓手机上。(下载地址:https://developer.vuforia.com/downloads/tool )
5 . 接着就是打开scanner,将物体放在网格中进行扫描。屏幕右上角的point数越多,依附在物体上的点数越密集时,识别率越高。扫描时,必须注意在室内环境下,且没有集中的强光照射,其实就是避免不必要的物体反光和照射下产生的阴影导致识别不准确。将所有网格都填满时,识别就可以结束。这一步需要比较多的耐心。。。(这里明显纸张的网格区域比小新的大小大很多,后面就会发现unity中展示的区域是整个网格大小,不止小新所包围的屏障的大小)
识别完后,可以通过app中的test按钮,将摄像头对准物体看看是否成功扫描并且容易被识别到。识别成功会出现一个半透明长方体。
6 . 最后一步,将软件生成的.od文件上传到官网(我是通过从手机分享到QQ上传到电脑的),然后下载package。具体操作是在target manager中,添加target,上传完成后(这个时间会比较久),下载Database,每个数据包(package)可支持多达20个的target。
在unity中我们需要用到关于vuforia的对象分别是ARcamera和ObjectTarget,分别来自Vuforia官方的Unity Sdk和上一部分的最后一步下载的关于识别物体的package。导入后可在assets里面找到这两个的prefab,拖进场景。另外记得要把unity默认的mainCamera删除。因为我们只需用到ARcamera。具体操作可看组内越升大神写的另一篇文章《有十块钱才玩得起的游戏》。
接下来介绍ARcamera和ObjectTarget的几个重要属性和参数:
5 .World Center Mode 当Camera Direction设置为SPECIFIC_TARGET时,定义场景中指定的object作为场景的世界空间的原点。将该objectTarget拖进输入框即可。
6 .Load XXX Database&Active 勾选可以使得app在初始化时就自动加载需要识别的object的数据包并激活,如果不想要在app开始时就自动加载,则需要用到vuforia的API了,传送门 https://library.vuforia.com/articles/Solution/How-To-Load-and-Activate-Multiple-Device-Databases
1 . Database & Object Target 指定加载数据集和需要识别的target。
2 . length/width/height:包围被识别的target的长方体(Bound Box)的尺寸。
3 . Show Bound Box 勾选的话显示包围被识别的target的长方体(Bound Box)。
4 . Preserve child size 默认不勾选时,程序会根据被识别target的大小(摄像头到target的距离)自动调整附在识别target上的子物体的大小,与target保持比例,如果勾选则会一直保持子物体的大小。
5 . Enable Extended Tracking 当target离开摄像头但是附在target上的子物体还在时可以继续被跟踪到。看下图就明白了:
6 . Enable Smart Terrain Smart Terrain是vuforia的增强现实的一个重要功能,让识别target所在的物理环境可以得以重构和增强,对于它的使用,官网有详细的介绍和例子,但不能与Enable Extended Tracking同时被勾选。有兴趣的可以看看这个视频 点击观看
当了解了以上参数的作用后,就可以结合自己的需求进行开发了,在开发过程中,可能有以下两点需要注意:
1 .为识别物体ObjectTarget添加Object
为ObjectTarget添加可以跟随它移动的Object对象其实很简单,只需为ObjectTarget添加子物体,子物体的位置和大小也是以bounding box的原点坐标为准的。例如下图要为小新公仔加两个球,两个球体在摄像头上会跟随小新移动。
但是这个球体离小新的距离太远了,如果想要在小新公仔的两个手掌上加上两个小球体作为动感光波,必须要把小球定位到小新的两个手掌周围,但是我们可以参考的只有bounding box。
为了实现精准定位,首先要找到bounding box。因为game的场景下不会显示bounding box,所以我在scene下建立了一个跟bounding box位置和大小相同的半透明的cube,在game下显示情况如下图所示:
然后就会发现,bounding box的大小其实是识别图右上角的网格大小(所以前面才说要打印和识别物体大小差不多的识别图)。
这个时候,就可以不断调整球体的位置和大小直到360旋转的情况下都贴合小新的手掌,bounding box的三个边缘线分别是x\y\z轴,所以有了bounding box的显示还是比较容易找的。然后记录球体的位置和大小.
再切换到scene场景中,将记录下的位置和大小填入。(之前以为会有更好的方法,找了好久没找到,后面发现官网介绍也是这样子做的。。。)
这是最后在安卓手机摄像头下的展示效果,实在不知道会发光的动感光波在unity下要怎么实现,原谅我是建模渣渣,最后变成了小新的手掌出来了两颗会发光的小球体。
2 . 还有一点,vuforia中的ARcamera是没有默认自动对焦的,需要自己在script中设置。在ARcamera对应的脚本中加上以下这句(可能要针对不同设备兼容,但是在三星s6 edge测试是没问题的):
Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
参考文章地址:
【1】https://library.vuforia.com/articles/training/object-recognition
【2】https://library.vuforia.com/articles/Solution/How-To-Align-Digital-Content-on-an-Object
【3】https://library.vuforia.com/articles/Training/Vuforia-Object-Recognition-Unity-Sample-GuideGuide
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。