Unity制作AR

demo视频

增强现实技术(Augmented Reality,简称 AR),已经流行了很多年,在前几年还在做flash的时候阿赵我也曾经接触过。最近我突然对Unity实现AR效果产生了兴趣,所以也搜索了一下资料,自己做了个demo。
使用Unity来制作AR应用,现在最主流的有2种插件可以使用
1、高通的Vuforia
2、ARToolKit
这两种插件我都下载下来使用了一下,也大概学会了使用的方法,下面谈谈我的看法:
AR的整个工作流程是这样的:
1、制作Mark标志
2、通过图像识别技术识别在摄像头拍到的画面(或者已经拍好的视频)里面有没有Mark标志
3、如果发现Mark,计算空间坐标,把预先做好的3D模型和Mark的空间坐标对齐
4、显示3D模型
5、继续追踪Mark,继续对齐3D模型和Mark的空间坐标
6、失去Mark标志后做一定的操作,比如隐藏模型,等。
针对这个工作的流程,我对比一下上面所说的2种插件。
1、制作Mark标志
ARToolKit只支持图片作为Mark,并提供了一个PC的mark制作工具(官方好像把这一步称为训练Mark),用该软件用户可以自己把图片制作成ARToolKit的Mark文件,具体的步骤是先拿到官方提供的只有黑框的Mark,把自己需要的图片通过ps之类的软件放到黑框Mark里面,并把做好的Mark打印出来。然后打开制作工具,工具会调用摄像头,然后在摄像头前面根据提示展示Mark图片,直到训练完成。
高通的Vuforia支持的Mark类型就比较丰富,它共支持4种mark:图片、立方体、圆柱形和实际的物体,还支持云识别。不过Vuforia制作Mark的步骤是必须上官网在线制作的。而Vuforia现在已经收费,如果你使用免费版本,将会有一定的限制。我使用的是免费版本,不过如果将来真的有商用的机会,我觉得买一个许可证书也不贵,好像是4000人民币左右吧。
Vuforia制作mark的类型很多,功能也很丰富,如果有人有兴趣,我可以单独另外写文章介绍它的制作过程,这里就不啰嗦了。
2、识别Mark
这一步实际上就是整个AR技术的第一个核心技术了。可惜的是,不管我们用那种插件,毕竟还是插件,我们是不能去干涉它的工作流程的。ARToolKit听说是开源的,不过反正我也看不懂,所以也没有下载源码来看了。这里说明了一个问题,实际上Unity制作AR并不难,原因在于最核心的技术不需要我们直接去懂得,而是别人提供好的。
换一个角度来看这个问题,图像识别技术的门槛很高,不是人人都玩得起,所以主流的插件也不多。但实际的AR应用制作的门槛却很低,只要把插件下载下来用,基本上大部分人都能做。所以如果有朋友想通过AR来创业,并去拉投资,先要把这个问题想清楚,别到了投资人上来问你一句技术门槛的问题时,才来胡乱的回答。
既然不能在技术门槛上有优势,就只能通过微创新和优化体验作为卖点了。
说了这么多废话,下面来对比一下两个插件在这方面的使用区别:
ARToolKit通过自带工具制造出来的Mark文件,放到项目里面,然后就可以在ARToolKit主组件里面指定当前的场景里面用到的所有Mark文件,并每个文件给一个标签名字。最后在Marker组件里面填入当前的Marker需要识别的Mark的标签名称。实际在运行时,Marker其实是遍历了ARToolKit主组件里面的所有Mark文件记录,然后找到标签名和当前Marker填入的标签名相同的一个Mark文件,作为识别源。
Vuforia通过在线工具,生成的Mark文件一般会以应用名称作为包名,然后下面带有多个Mark信息,在线工具可以选择下载为Unity的Package资源包,下载后导入项目就可以用。导入项目之后,在相应的组件上面就可以直接选择mark,不需要预先指定。
在这方面来说,Vuforia除了必须用它的在线工具以外,其他方面会比较方便,
3、计算空间坐标
这一步是AR技术的第二个核心技术。情况和第二点一样,所以就不啰嗦了。
ARToolKit计算空间坐标默认是以第一个发现的Mark作为空间原点(0,0,0),在Mark或者摄像头移动的时候,摄像机会围绕空间原点旋转和移动,第一个发现的Mark的3D模型一直不动。如果有多个Marker,后来发现的Mark的3D模型会改变坐标来适应第一个发现的Mark的3D模型显示。
Vuforia的空间参考选项就比较多,可以指定以下作为空间原点
1.可以指定一个特殊的模型作为空间原点,其他3D模型和摄像机都向特殊的模型对齐
2.可以指定第一个发现的Mark作为空间原点,情况和ARToolKit类似
3.可以指定摄像机(ARCamera)作为空间原点,其他3D模型都与摄像机对齐位置
4.可以指定跟踪图片作为空间原点。这个有点特殊,因为Unity里面看到的摄像头拍摄画面,其实是通过特殊手段(webCamera之类的方法)渲染到renderTexture上面,然后贴到一个Mesh的平面上面作为贴图显示出来的。这里指的跟踪图片,其实就是这个贴了renderTexture的Mesh平面了。如果指定了这种(其实默认好像就是这种),摄像机和3D模型都会以这个Mesh平面为空间原点来对齐位置。

4、显示和隐藏模型
ARToolKit的做法是把在Marker下面的子物体全部都SetActive为true或者false作为显示和隐藏的方法。
Vuforia的做法是遍历Marker下面子物体的Renderer组件,然后把enabled设为true或者false。
设置激活的方法,会隐藏得更彻底,但会让粒子系统或者挂在物体上面的脚本启动生命周期,这点是必须注意的,如果不知道这一点,而你的一些方法写在了启动的生命周期里面,将会执行多次。
改变Renderer组件的enabled作为隐藏和显示,不会影响生命周期,不过正是由于不影响,也会产生一些问题,比如一些固定执行的生命周期里的方法,比如update的方法,在这时候是不会停掉的。
插一句我自己的意见,其实两种方式我都不喜欢。我的做法是通过事件机制,在发现或者丢失Mark的时候,抛出事件,并把Marker的名称附带在事件参数里面,然后用一个统一的Ctrl层去监听事件。这样我收到事件之后,不管是激活还是enabled,那是业务逻辑层的事情,可以比较自由。

5、追踪Mark
这个方面的技术和识别是一样的,还和Mark的制作有关系,Mark制作得好,识别和追踪会快速很多,错误会少。制作得不好,难以识别不说,还经常抖动。

除了核心技术外,从插件对Unity的支持来说,两种插件都存在着一定的问题和缺陷:
1、ARToolKit
因为ARToolKit其实是一个核心算法的开源代码项目,所以除了核心的算法以外,其他的细节做得并不好,比如调用摄像机这一步,ARToolKit必须直接调用平台原生的摄像头接口,比如在PC必须先弹出摄像头的设置选项然后才能启动,在安卓就更糟糕了,必须用启动的activity来调用手机的摄像头。反正我在手机上一直就没有成功的使用ARToolKit,出现的问题都是出现的摄像头画面只有在平面左上角一小块,并且切换场景之后就没有了。

2、Vuforia
由于Vuforia提供的插件是32位的,所以在64位的Unity上使用会有点问题。具体的问题是,Vuforia本来提供了功能可以直接在编辑器状态下直接运行项目看效果的,但如果你的Unity是64位的运行的时候会报错,必须把这个功能关掉。64位Unity发布后的应用是没问题的。
在编辑器运行看效果实在是太重要了,所以如果你要用Vuforia,最好装一个32位的Unity。

综上所述,我最后选择了Vuforia,因为它功能多,安卓支持好。最大的问题就是收费的问题,还有就是mark必须在线制作的问题,假如某一天它倒闭了,估计就不能再用了。

你可能感兴趣的:(Unity功能与问题解决,Unity,AR)