XR Plugin Framework
Unity 2019.3 and newer versions use a new, unified plug-in framework that enables direct integrations for multiple platforms. The tech stack consists of an API that exposes common functionality across the platforms Unity supports and enables XR hardware and software providers to develop their own Unity plug-ins.This architecture offers the following benefits:
ARFoundation
架构体系
Unity为了实现AR跨平台应用(平台无关性)做了大量工作,搭建了一个开放性的架构体系,使这个架构能够容纳各类底层SDK,能支持当前及以后其他底层AR SDK的加入,宏观上看,ARFoundation希望构建一个开发各类AR应用的统一平台。
为实现这个开放的架构,ARFoundation建立在一系列的子系统(subsystem)之上。subsystem隶属于UnityEngine.XR.ARSubsystems命名空间,负责实现特定的功能模块,而且这个实现与平台无关,即subsystem处理与平台相关的特定模块的实现。如XRPlaneSubsystem负责实现平面检测、显示功能,不仅如此,其还要根据运行平台的不同自动的调用不同底层的SDK,从调用者的角度看,他只调用了XRPlaneSubsystem的功能,而不用去管最终这个实现是基于iOS还是Android,即对平台透明。
类似于继承,当Provider具体实现特定接口(子系统)时,可以根据其平台本身的特性提供优化,并可以提供更多功能。由于硬件或者软件生态的巨大差异,A平台具备的功能B平台不一定提供,为了让开发者了解这种差异,ARFoundation要求Provider提供子系统描述符(SubsystemDescriptor),SubsystemDescriptor描述了Provider对特定子系统提供的能力范围。有了这个描述符,开发人员就可以通过遍历看特定的功能某特定平台是否提供,为功能开发提供依据。
每个Subsystems包含了三个部分:
基本概念
世界跟踪(Tracking)
指AR设备确定其在物理世界中的相对位置和方向的能力。在2D和3D空间中跟踪用户的运动并最终定位它们的位置是任何AR应用程序的基础,当我们的移动设备在现实世界中移动时,ARFoundation会通过一个名为并行测距与映射(Concurrent Odometry and Mapping ,COM)的过程来理解移动设备相对于周围世界的位置。 ARFoundation会检测捕获的摄像头图像中的视觉差异特征(称为特征点),并使用这些点来计算其位置变化。 这些视觉信息将与设备 IMU 的惯性测量结果结合,一起用于估测摄像头随着时间推移而相对于周围世界的姿态(位置和方向)。
在开发中,通过将渲染 3D 内容的虚拟摄像头的姿态与 ARFoundation 提供的设备摄像头的姿态对齐,开发者能够从正确的透视角度渲染虚拟内容,渲染的虚拟图像可以叠加到从设备摄像头获取的图像上,让虚拟内容看起来就像现实世界的一部分一样。
可跟踪(Trackable)
可以被AR设备检测和/或跟踪的真实特征,例如特征点,平面,人脸,人形等等。
特征点(Feature Point)
AR设备使用摄像机和图像分析来跟踪世界上用于构建环境地图的特定点,例如木纹表面的结。特征点云包含了被观察到的3D点和视觉特异点的集合,通常还附有检测时的时间戳。
会话(Session)
Session的功能是管理AR系统的状态,处理Session生命周期,是AR API的主要入口。在开始使用AR API的时候,通过设置的ARSessionState来检查当前设备是否支持AR。Session负责处理整个AR应用的生命周期,这样AR系统会根据需要开始和暂停相机帧的采集,初始化和释放相关的资源。
Session空间(Session space)
相对于AR session初始化时的坐标系,例如,例如,会话空间(0,0,0)是指创建AR会话的位置。AR设备跟踪的坐标信息都是处在Session空间中,因此,在使用时,需要将其从Session空间转换到其他空间。这类似于模型空间和世界空间的转换。
用户交互(User interaction)
ARFoundation利用命中测试来获取对应于手机屏幕的 (x,y) 坐标(通过点按或应用支持的任何其他交互提供),并将一条射线投影到摄像头的视野中,返回这条射线贯穿的任何平面或特征点以及交叉位置在现实世界空间中的姿态。 这让用户可以选择环境中的物体或者与它们互动。
增强图像(Augumented Image)
使用增强图像(图像检测)可以构建能够响应特定 2D 图像(如产品包装或电影海报)的 AR 应用, 用户可以将手机的摄像头对准特定图像时触发 AR 体验,例如,他们可以将手机的摄像头对准电影海报,使人物弹出,然后引发一个场景。可离线编译图像以创建图像数据库,也可以从设备实时添加单独的图像。 注册后,ARFoundation将检测这些图像、图像边界,然后返回相应的姿态。
共享 (Sharing)
借助于ARKit中的多人协作(Collaborative session)或者ARCore中的Cloud Anchor,可以创建适用于 Android 和 iOS 设备的协作性或多人游戏应用。使用云锚点,一台设备可以将锚点和附近的特征点发送到云端进行托管。 可以将这些锚点与同一环境中 Android 或 iOS 设备上的其他用户共享。 这使应用可以渲染连接到这些锚点的相同 3D 对象,从而让用户能够同步拥有相同的 AR 体验。共享需要服务器的支持。
平面(Plane)
AR中所有的内容,都要依托于平面类进行渲染。如虚拟机器人,只有在检测到平面网格的地方才能放置。平面可分为水平、垂直两种,Plane描述了对一个真实世界二维平面的认知,如平面的中心点、平面的x和z轴方向长度,组成平面多边形的顶点。检测到的平面还分为三种状态,分别是正在跟踪,可恢复跟踪和永不恢复跟踪。如果是没有正在跟踪的平面,包含的平面信息可能不准确。两个或者多个平面还会被被自动合并成一个父平面。如果这种情况发生,可以通过子平面找到它的父平面。
姿态(Pose)
Pose表示从一个坐标系到另一个坐标系的转换。在所有的ARFoundation APIs中,Pose总是描述从物体的局部坐标系到世界坐标系的变换,也就是说,来自ARFoundation API的Pose可以被认为等同于OpenGL的模型矩阵或DirectX的世界矩阵。随着ARFoundation对环境的了解不断变化,它将调整坐标系模式以便与真实世界保持一致。 这时,Camera的位置(坐标)可能会发生明显的变化,以便它们所代表的物体处理恰当的位置。因此,每一帧图像都应被认为是在一个完全独立的世界坐标空间中。
光照估计(LightEstimate)
LightEstimate给我们提供了一个接口来查询当前帧的光照环境。我们可以获取当前相机视图的光照强度,一个范围在(0.0,1.0)的值,0代表黑色,1代表白色,使用该光照信息绘制内容,可以使虚拟物体更真实。还可以获取到光照方向,以便调整AR中虚拟物体的阴影方向,增加虚拟物体的真实感。
AR子系统
Subsystem是一个与平台无关的接口,其定义了对特定功能的界面,与AR相关的subsystems隶属于UnityEngine.XR.ARSubsystems命名空间。ARFoundatoin中的subsystem只定义了功能接口而没有具体实现,具体实现由Provider在其他包或者插件中提供。ARFoundation目前提供了以下12种subsystem,具体包括Session、Raycasting、Camera、Plane Detection、Depth、Image Tracking、Face Tracking、Environment Probes、Object Tracking、Human Body Tracking 2D,Human Body Tracking 3D,Human Segmentation Image。
由于具体的subsystems是由Provider在其他包或者插件中提供,因此,如果不引入相应的包或者插件,应用编译会失败,在编译到具体平台时就一定要在工程中引入相应的包或者插件。同时引入两个或者多个平台的包或插件是没有问题的,因为ARFoudation会根据具体的编译平台选择对应的包或插件。引入插件的方法是在Window > Package Manager中打开“包管理窗口”,然后在左侧的包中选择相应的包或者插件,目前ARFoundation的Provider包括ARCore XR Plugin和ARKit XR Plugin两种(估计很快就会加入SenseAR XR Plugin),如下图所示。
不同平台的差异化
对于ARFounation定义的subsystem,Provider可以实现也可以不实现,如Environment Probes ,ARCore XR Plugin目前就没有实现,因此,Android平台Environment Probes功能将不可用。另外,Provider也可以提供比subsystem更多的功能,如Image Tracking,ARFounation目前并不支持动态添加参考图像的功能,但实际上ARCore和ARKit都支持在运行时动态添加参考图像。因此,针对具体平台做开发时一定要关注该平台Provider能够提供的功能,另外,为了对特定平台进行优化,不同的Provider对参数也有要求,如在Image Tracking功能中,ARKit要求提供被检测图像的物理尺寸,而ARCore则没有这个要求,这都需要参阅特定平台Provider相关资料。
不可避免地需要处理到平台差异化的地方,这些差异化基本体现在两个方面:第一个方面就是这个平台是不是支持我当前想要用的这个功能?比如说像SenseAR的手势识别,还有ARKit的人体追踪,这些是它们自己平台独有的,别的平台暂时不支持这个功能。开发者在使用之前要先判断一下当前Runtime下的这个平台是否支持这些功能。第二个方面就是上述提过的,在各个平台上相同的功能,但是可能支持的程度不一样。举个例子,比如说像平面检测,一些平台可能支持横向和竖向的平面检测,也有一些平台可能只支持横向的平面检测。在设计APP的时候,需要针对功能的支持程度不同而做不同的处理。
对于第一个问题,可以通过目标功能提供的Manager,里面有个Subsystem这样的属性,开发者可以判断这个Subsystems是否为空,然后来确定这个平台是不是支持,为空的话就是不支持,不为空就是支持。
针对第二点,在功能的Manager里面也提供了一个叫做descriptor的这样一个参数。Plane Manager中会提供各种各样已经预设好的支持功能的参数,这个例子显示的就是它是否支持任意平面的检测,是否支持边缘点的检测,以及是否支持纵向平面及横向平面检测。通过Subsystems的descriptor,可以让开发者更好地做一些跨平台应用的开发和调整。
子系统的使用
所有的subsystems都有一样的生命周期:创建(Created)、开始(Started)、停止(Stopped)、销毁(Destroyed),每一个subsystem都有一个对应的SubsystemDescriptor,可以使用SubsystemManager遍历其能够提供的功能,一旦得到可用的subsystemdescriptor后,就可以使用Create()方法创建这个subsystem,这也是构建subsystem的唯一方式(实现使用中,很多时候由SubsystemManager负责了这个过程,但有时我们也需要自己来实现这个过程)。下面以创建一个Plane subsystem为例来说明这个过程,代码如下所示。
与ARCore、ARKit的关系
ARFoundation是ARKit XR插件(com.unity.xr.arkit)和ARCore XR插件(com.unity.xr.arcore)的集合,虽然最终都使用ARKit SDK和ARCore SDK,但因为Unity再次封装的缘故,与专业平台(如ARKit插件和ARCore SDK for Unity)相比,C#调用的API略有不同。
支持的功能
支持的平台
技术演进
XR Interaction Toolkit
XR Interaction Toolkit软件包是一个基于组件的高层交互系统。它提供了一个框架,使Unity输入事件可以进行3D和UI交互。该系统的核心是一组基本的Interactor和Interactable组件,以及一个将这两种类型的组件联系在一起的Interaction Manager。它还包含帮助程序组件,您可以使用它们来扩展用于绘制视觉效果和挂钩自己的交互事件的功能。
XR Interaction Toolkit包含一组支持以下Interaction任务的组件:
要使用这些AR交互组件,您的项目中必须具有AR Foundation包。XR Interaction Toolkit提供的AR功能包括:
Mixed and Augmented Reality Studio (MARS)
MARS gives you the power to build experiences that fully integrate with the real world. Build AR apps that are context-aware and responsive to physical space, working in any location and with any kind of data.
https://www.youtube.com/watch?v=kJtUwrUh4xs&t=19s
Supported XR plug-ins
Platform |
Recommendation (Unity 2019.3 and later) |
ARCore |
AR developers using ARCore in their projects should continue using AR Foundation, and XR Management to load in the ARCore XR Plugin. |
ARKit |
AR developers using ARKit in their projects should continue using AR Foundation, and XR Management to load in the ARKit XR Plugin. |
Magic Leap |
Magic Leap developers should continue using AR Foundation, and XR Management to load in the Magic Leap XR Plugin. Developers will also need to download the Magic Leap Lumin SDK. |
Microsoft HoloLens / Windows Mixed Reality |
HoloLens developers should continue using AR Foundation, and XR Management to load the Windows XR Plugin. Microsoft has also released a new version of their Mixed Reality Toolkit (MRTK 2.3) that is compatible with the Windows XR Plugin in Unity 2019.3 and later. |
Oculus |
Oculus developers should use XR Management to load the Oculus XR Plugin. |
OpenVR |
Valve is using Unity’s XR SDK to develop their OpenVR Unity XR plug-in for 2019.3 and beyond. They will share more information on where to access this plug-in once it is available. Until Valve releases this plug-in, built-in support of OpenVR will continue to be functional and available in 2019.3, and Unity will continue to provide critical fixes. |
Gear VR |
Gear VR is not supported by the Oculus XR Plugin in 2019.3 and beyond. |
Google VR |
Google VR is not supported using the XR plugin framework in 2019.3 and beyond. Cardboard developers using 2019.3 and later should follow the Google VR developer site for the latest updates regarding a Cardboard Open Source XR Plugin for Unity. |
参考资料:
1、About AR Foundation
2、Unity XR plugin framework
3、Unity’s Handheld AR Ecosystem
4、XR Interaction Toolkit
5、Mixed and Augmented Reality Studio (MARS)
6、详解Unity AR Foundation