1.3 AR Foundation概述
2017年,Apple公司与Google公司相继推出了各自的AR开发SDK工具包ARKit和ARCore,分别对应iOS平台与Android平台AR开发。ARKit和ARCore推出后,极大地促进了AR在移动端的普及发展,将AR从实验室带入了普通消费场景。
ARCore官方提供了Android、Android NDK、Unity、Unreal等开发包,ARKit官方只提供了XCode开发包,这也增加了利用其他工具进行开发的开发者的学习成本。在这种情况下,Unity构建了一个AR开发平台,这就是AR Foundation,这个平台架构在ARKit和ARCore之上,其目的就是利用Unity跨平台能力构建一种与平台无关的AR开发环境。换句话说,AR Foundation对ARKit和ARCore进行了再次封装,提供给开发者一致的开发界面,并按照用户的发布平台自动选择合适的底层SDK版本。
因此,AR Foundation是ARKit XR插件(com.unity.xr.arkit)和ARCore XR插件(com.unity. xr.arcore)的集合,虽然最终都会使用ARKit或ARCore,但因为Unity再次封装,它与专业平台(如ARKit插件和ARCore SDK for Unity)相比,C#调用与原生API略有不同。
AR Foundation的目标并不局限于ARKit与ARCore,它的目标是建成一个统一、开放的AR开发平台,因此,AR Foundation极有可能在下一步发展中纳入其他AR SDK,进一步丰富AR开发环境。在后续发展中,AR Foundation不仅会支持移动端AR设备开发,还会支持穿戴式AR设备开发。
从上面的描述我们可以看出,AR Foundation并不提供AR的底层开发API,这些与平台相关的API均由第三方,如ARKit、ARCore、SenseAR提供,因此AR Foundation对某特定第三方功能的实现要比原生的晚(AR Foundation将某第三方SDK的特定功能集成需要时间)。
1.3.1 AR Foundation与ARCore/ARKit
AR Foundation提供了一个独立于平台的脚本API和MonoBehaviour,因此,开发者可以通过AR Foundation使用ARKit和ARCore共有的核心功能构建同时适用于iOS和Android两个平台的AR应用程序。换句话说,这可以让开发者只需开发一次应用,就可以将其部署到两个平台的设备上,不必做任何改动。
如前所述,AR Foundation实现某底层SDK的功能会比原生的稍晚,因此,如果我们要开发AR Foundation尚不支持的功能,可以单独使用对应的原生SDK。目前,如果我们只面向ARCore进行开发并希望获取完整的功能集,可使用Google为Unity开发提供的ARCore SDK for Unity;如果只面向ARKit进行开发并希望获取完整的功能集,可使用Unity提供的适用于Unity开发的ARKit插件(Apple并未提供Unity的ARKit SDK开发插件,在AR Foundation发展起来以后,Unity肯定不会再继续维护ARKit插件)。
AR Foundation架构于ARKit和ARCore之上,其与ARKit、ARCore的关系如图1-5所示。
▲图1-5 AR Foundation与ARCore、ARKit的关系图
在Unity引擎上,AR Foundation与ARCore、ARKit的区别如表1-1如示。
表1-1 AR Foundation、ARCore、ARKit联系与区别
SDK |
简介描述 |
---|---|
AR Foundation |
AR Foundation将ARKit和ARCore的底层API封装整合到一个统一、开放的框架中,并提供一些额外的实用功能,如Session生命周期管理,以及用于展示环境中已检测功能的MonoBehaviour |
Google ARCore SDK for Unity |
该SDK为ARCore支持Unity开发环境提供的原生API,并在Unity中向Android平台公开这些API,以方便开发者调用 |
Unity ARKit Plugin |
该插件是Unity开发的ARKit for Unity插件,用于在Unity中构建ARKit应用,它在Unity中公开了C#的ARKit Objective-C API,以便开发者调用。该插件还提供一些辅助功能,可以兼容iOS设备的前置和后置摄像头 |
1.3.2 AR Foundation支持的功能
AR Foundation与ARCore、ARKit都正处于快速发展中,ARCore基本保持每两个月进行一次更新的频率,ARKit也已经迭代到了ARKit 3,作为ARKit与ARCore上层的 AR Foundaion也已经更新到v3.0版。
但如前文所说,AR Foundation功能的实现要比底层的原生API稍晚一些,表1-2展示了AR Foundation、ARCore和ARKit功能对比。
表1-2 AR Foundation、ARCore、ARKit功能对比
支持功能 |
AR Foundation |
ARCore |
ARKit |
---|---|---|---|
垂直平面检测 |
√ |
√ |
√ |
水平平面检测 |
√ |
√ |
√ |
特征点检测 |
√ |
√+支持特征点姿态 |
√ |
光照估计 |
√ |
√+Color Correction |
√+Color Temperature |
射线检测(Hit Testing,对特征点与平面) |
√ |
√ |
√ |
图像跟踪 |
√ |
√ |
√ |
3D物体检测与跟踪 |
√ |
- |
√ |
环境光探头(Environment Probes) |
√ |
√ |
√ |
世界地图(World Maps) |
√ |
- |
√ |
人脸跟踪(Pose、Mesh、Region、Blendshape) |
√ |
√ |
√(iPhoneX 及更高型号) |
云锚点(Cloud Anchors) |
√ |
√ |
- |
远程调试(Editor Remoting) |
开发中 |
√-Instant Preview |
√-ARKit Remote |
模拟器(Editor Simulation) |
√ |
- |
- |
LWRP支持(支持使用ShaderGraph) |
√ |
开发中 |
开发中 |
摄像机图像API(Camera Image) |
√ |
√ |
- |
人体动作捕捉(Motion Capture) |
√ |
- |
√(iPhoneXR 及更高型号) |
人形遮挡(People Occlusion) |
√ |
- |
√(iPhoneXR 及更高型号) |
多人脸检测 |
√ |
√ |
√(iPhoneXR 及更高型号) |
多人协作(Collaborative Session) |
√ |
- |
√(iPhoneXR 及更高型号) |
多图像识别 |
√ |
√ |
√ |
AR应用是计算密集型应用,对计算硬件要求较高,就算在应用中对虚拟对象都不进行渲染,AR也在对环境、特征点跟踪进行实时解算。由于移动端硬件设备资源限制,一些高级AR应用只能在最新的处理器(包括CPU和GPU)上才能运行。同时得益于Apple强大的独立生态与软硬件整合能力,它在ARKit 3中推出了很多新功能,但由于目前Android系统碎片化严重,ARCore预计要等到新版Android系统发布后才能提供类似的功能。
1.3.3 AR Foundation功能概述
AR Foundation只是对ARCore和ARKit再次封装,并不实现AR的底层API功能,换言之,AR Foundation只是一个功能的搬运工。因此,底层API没有的功能,AR Foundation也不可能有(AR Foundation会添加一些辅助功能以方便开发者开发AR应用)。同时,AR Foundation能实现的功能也与底层SDK所在平台相关,如ARKit有WorldMap功能,而ARCore没有,因此,即使AR Foundation支持WorldMap功能,这个功能也只能在iOS平台上才有效,在Android平台编译就会出错。这就是说AR Foundation支持的功能与底层SDK是密切相关的,脱离底层SDK谈AR Foundation功能是没有意义的。当然,如果是ARKit和ARCore都支持的功能,AR Foundation做的工作是在编译时根据平台选择无缝切换所用底层SDK,达到一次开发、跨平台部署的目的。
当前,AR Foundation主要支持的功能如表1-3所示。
表1-3 AR Foundation主要支持的功能
功能 |
描述 |
---|---|
世界跟踪(World Tracking) |
在物理空间中跟踪用户设备的位置和方向(姿态) |
平面检测(Plane Detection) |
对水平与垂直平面进行检测 |
参考点(Reference Points) |
对特定点的姿态跟踪。ARCore与ARKit中称为Anchor |
光照估计(Light Estimate) |
对物理环境中的光照强弱及方向进行估计 |
人脸跟踪(Face Tracking) |
检测并跟踪人脸 |
人脸表情捕捉(Facial Expression Capture) |
检测人脸表情 |
图像跟踪(Image Tracking) |
跟踪物理空间中的2D图像 |
物体跟踪(Object Tracking) |
跟踪物理空间中的物体对象,目前只支持ARKit |
Session分享 |
支持多人共享场景,这在ARKit中称为多人协作(Collaborative session)和世界地图(World Maps),在ARCore中称为Cloud Anchor |
人体动作捕捉(Motion Capture) |
简称动捕,检测屏幕空间或者物理空间中的人体及动作 |
人形遮挡(People Occlusion) |
利用计算机视觉判断人体在场景中的位置,获取人体形状及在场景中的位置实现虚拟物体遮挡 |
摄像机图像API |
提供摄像机图像底层支持,方便开发人员开发计算机视觉应用 |
1.3.4 AR Foundation体系架构概述
虽然AR Foundtion是在底层SDK API之上的再次封装,但Unity为了实现AR跨平台应用做了大量工作,搭建了一个开放性的架构,使这个架构能够容纳各类底层SDK,能支持当前及以后其他底层SDK的加入,宏观上看,AR Foundation希望构建一个开发各类AR应用的统一平台。
为实现这个开放的架构,AR Foundation建立在一系列的子系统(Subsystem)之上。Subsystem隶属于UnityEngine.XR.ARSubsystems命名空间,负责实现特定的功能模块,而且这个实现与平台无关,即Subsystem处理与平台无关的特定模块的实现。如XRPlaneSubsystem负责实现平面检测、显示功能,在编译时,根据不同的运行平台自动调用不同底层的SDK。从调用者的角度看,只需要调用XRPlaneSubsystem的功能,而不用管最终这个实现是基于iOS还是Android,即对平台透明。
这种架构对上提供了与平台无关的功能,对下可以在以后的发展中纳入不同的底层SDK,从而实现最终的一次开发、跨平台部署的目标。其架构如图1-6所示。
▲图1-6 AR Foundation体系架构
1.3.5 基本术语
1.世界跟踪(World Tracking)
世界跟踪指AR设备确定其在物理世界中的相对位置和方向的能力,在2D和3D空间中跟踪用户的运动并最终定位它们的位置是任何AR应用程序的基础。当设备在现实世界中移动时,AR Foundation会通过一个名为并行测距与映射(Concurrent Odometry and Mapping,COM)的过程来理解移动设备相对于周围世界的位置。AR Foundation会检测从摄像头图像中捕获的视觉差异特征(称为特征点),并使用这些点来计算其位置变化。这些视觉信息将与设备IMU惯性测量结果结合,一起用于估测摄像头随着时间推移而相对于周围世界的姿态(位置和方向)。
通过将渲染3D内容的虚拟摄像机的姿态与AR Foundation提供的设备摄像头的姿态对齐,就能够从正确的透视角度渲染虚拟内容,渲染的虚拟图像可以叠加到从设备摄像头获取的图像上,让虚拟内容看起来就像真实世界的一部分。
2.可跟踪(Trackable)
可跟踪指可以被AR设备检测/跟踪的真实特征,例如特征点、平面、人脸、人形、2D图像、3D物体等。
3.特征点(Feature Point)
AR设备使用摄像机和图像分析来跟踪环境中用于构建环境地图的特定点,例如木纹表面的纹理点、书本封面的图像,这些点通常都是视觉差异点。特征点云包含了观察到的3D点和视觉特征点的集合,通常还附有检测时的时间戳。
4.会话(Session)
会话的功能是管理AR系统的状态,是AR API的主要入口。在开始使用AR API的时候,可通过对比ARSessionState状态值来检查当前设备是否支持AR。Session负责处理整个AR应用的生命周期,控制AR系统根据需要开始和暂停视频帧的采集、初始化、释放资源等。
5.Session空间(Session Space)
Session空间即AR Session初始化后建立的的坐标空间,Session空间原点(0,0,0)是指创建AR会话的位置。AR设备跟踪的坐标信息都是处在Session空间中,因此在使用时,需要将其从Session空间转换到其他空间,这个过程类似于模型空间和世界空间的转换。
6.射线检测(Ray Casting)
AR Foundation利用射线检测来获取对应于手机屏幕的 (x,y) 坐标(通过点按或应用支持的任何其他交互方式),将一条射线投射到摄像头的视野中,返回这条射线贯穿的任何平面或特征点以及碰撞位置在现实世界空间中的姿态,这让用户可以选择环境中的物体。
7.增强图像(Augumented Image)
使用增强图像(图像检测)可以构建能够响应特定2D图像(如产品包装或电影海报)的AR应用, 用户将手机的摄像头对准特定图像时触发AR体验,例如,他们可以将手机的摄像头对准电影海报,使人物弹出,或者引发一个场景。可离线编译图像以创建图像数据库,也可以在运行时实时添加参考图像,AR Foundation将检测这些图像、图像边界,然后返回相应的姿态。
8.共享(Sharing)
借助于ARKit中的多人协作Session(Collaborative Session)或者ARCore中的Cloud Anchor,可以创建适用于iOS或Android设备的多人共享应用。在Android中使用云锚点,一台设备可以将锚点及其附近的特征点发送到云端进行托管,并可以将这些锚点与同一环境中Android或iOS设备上的其他用户共享,从而让用户能够同步拥有相同的AR体验。在ARKit中,利用协作Session或者WorldMap也可以直接在参与方中共享AR体验。
9.平面(Plane)
AR中大部分内容需要依托于平面进行渲染,如虚拟机器人,只有在检测到平面网格的地方才能放置。平面可分为水平、垂直两类,Plane描述了真实世界中的一个二维平面,如平面的中心点、平面的x和z轴方向长度、组成平面多边形的顶点。检测到的平面还分为三种状态,分别是正在跟踪、可恢复跟踪、永不恢复跟踪。不在跟踪状态的平面包含的平面信息可能不准确。两个或者多个平面还会被自动合并。
10.姿态(Pose)
在AR Foundation的所有API中,Pose总是描述从物体的局部坐标系到世界坐标系的变换,即来自AR Foundation API的Pose可以被认同为OpenGL的模型矩阵或DirectX的世界矩阵。随着AR Foundation对环境理解的不断加深,它将自动调整坐标系以便其与真实世界保持一致。因此,每一帧图像都应被认为是处于一个完全独立的世界坐标空间中。
11.光照估计(Light Estimate)
光照估计给我们提供了一个查询当前帧光照环境的接口,可以获取当前相机视图的光照强度、颜色分量以及光照方向,使用光照估计信息绘制虚拟对象照明效果会更真实,并且可以根据光照方向调整AR中虚拟物体的阴影方向,增强虚拟物体的真实感。