Hololens 2应用开发系列(4)——MRTK基础知识及配置文件配置(下)
- 一、前言
- 二、边界系统(Boundary)
- 三、传送系统(Teleport)
- 四、空间感知系统(Spatial Awareness)
- 4.1 系统介绍
- 4.2 配置空间观察器
- 五、诊断系统(Diagnostics)
- 六、场景系统(Scene System)
- 七、扩展(Extensions)
- 7.1 创建扩展服务
- 7.2 注册扩展服务
- 八、编辑器配置(Editor)
- 九、在运行时更改配置文件
- 十、总结
一、前言
近端时间忙于其他项目,疏忽了HoloLens2应用开发系列专辑的编写,在此向大家赔个不是。在之前的文章中,我对输入系统的基本配置做了一个大概的介绍,有不少同学私信我关于MRTK3相关的内容,由于MRTK3正式发布不久,相关资料和稳定性仍不太完善,因此我仅作了一些了解并未涉足太深。在此还是推荐大家先使用MRTK2进行基本的开发和学习,针对项目需求后期再转战MRTK3。同时,再次强调本期Hololens 2应用开发系列教程针对的是MRTK2.8版本,在完成本期教程后,我将开启一个MRTK3的新系列,欢迎大家的持续关注!
在本文中,我将对MRTK的配置文件/配置面板剩余部分进行讲解,它们分别是:边界(Boundary)、传送(Teleport)、空间感知(Spatial Awareness)、诊断(Diagnostics)、场景系统(Scene System)、扩展(Extensions) 和编辑器(Editor)。
二、边界系统(Boundary)
边界系统帮助定义和可视化了用户在现实环境中安全移动的区域,通常针对用户佩戴 VR 头戴显示设备的情形,由于设备展示画面的全空间虚拟性,用户在移动时无法看到现实环境下周围的障碍(如墙面),边界系统可很好地帮助用户识别和判断。
在VR 头戴显示设备中,系统会自动检测并确定用户周围的实际空间边界,开发者可以根据边界信息放置虚拟内容,确保这些内容出现在用户可触及的区域内,避免超出用户活动范围,保障用户在使用设备时不会撞到实物障碍物。其基本设置可参考微软官方教程配置边界可视化,已较为详细。
而对于HoloLens 2混合现实设备的开发,由于用户可透过设备本身看到现实世界场景,故通常对此不进行配置。
三、传送系统(Teleport)
传送系统是MRTK 的一个子系统,主要是为了解决虚拟现实(VR)应用中的场景切换和移动问题,它提供了一种直观的方式来让用户在虚拟环境中快速移动长距离,而无需通过实际走动。 对于AR项目(如 HoloLens设备),传送系统处于非活动状态。对于沉浸式HMD项目(OpenVR、WMR),可启用传送系统。
但是,如果在特定的HoloLens 2应用中涉及到大型的AR地图导航或者跨越多个实际地理位置的虚拟导览,开发者可能会设计类似的快速跳转机制来帮助用户在虚拟内容中“穿梭”,但这并不是MRTK原生意义上的“传送系统”,而是基于AR特性的导航方案。在这种情况下,开发者需要自行设计和实现相关的交互逻辑和内容切换方法。
传送系统的设置较为简单,同学们如想了解更多关于传送系统的问题,可参考官方教程传送系统—MRTK2。
四、空间感知系统(Spatial Awareness)
4.1 系统介绍
空间感知系统在混合现实应用程序中提供现实世界的环境感知,它提供了一系列网格来代表环境的几何形状,用于在全息影像与现实世界之间实现进行交互。
对于HoloLens2设备,它通过ToF深度相机实现实现真实环境的感知和几何重建,其空间感知系统的开启方式如下图所示:
为了正确使用空间感知系统,我们还需注册并配置一个或多个空间观察器以提供网格数据。
4.2 配置空间观察器
空间感知系统的空间观察器由数据提供者和配置文件组成,它为系统提供有关现实世界的网格数据。在上图中,克隆完配置文件我们便可在下方的配置面板中通过Add Spatial Observer来添加属于我们自己的空间观察器。默认情况下,系统中已为我们添加了三个空间观察器,对于HoloLens 2开发,我们一般要使用的是第一项,即XR SDK Windows Mixed Reality Spatial Mesh Observer,因此,我们对其配置文件进行克隆以进行配置和使用。无论是自定义的空间观察器还是默认提供的空间观察器,都需要进行如下设置:
首先,设置Type,它即是指定系统或我们自定义的网格数据提供者,然后,指定支持的平台,最后,克隆默认配置文件。常规配置中,我们可以定义空间感知功能的启动方式(自动或手动,手动即通过代码在执行指定交互逻辑后启动)、更新间隔(单位s,通常在0.1-5.0之间)、是否是静止观察程序(true下空间原点在首次启动时,false则把用户头部作为形状的原点)、观察器形状、观察范围等。其他配置大家可通过官方文档对详细配置说明进行了解。
另外,还有一些高级的配置说明,在后续的教程中会逐一涉及。用户可通过空间对象网格观察程序、场景理解观察程序、通过代码配置网格观察程序和创建空间感知系统数据提供程序几个官方文档对其进行先行了解。
五、诊断系统(Diagnostics)
相信不少同学在执行模拟仿真时可到了下图所示画面,没错,它就是MRTK的诊断系统,准确来说,它是诊断系统的可视化探查器。
MRTK的诊断系统提供了在应用程序运行时监视性能的可视化工具,可以实时监测应用程序的性能指标,如帧率、内存使用情况、加载时间和CPU/GPU占用率等,同时,它还支持启用详细日志记录,用以提供关于输入系统、渲染与光照问题、场景管理与资源管理等方面的详细反馈。通常,我们在整个产品开发周期中启用诊断系统,在生成并发布最终版本之前禁用诊断系统。
诊断系统的设置如上图所示,您可根据需要进行相应配置。
六、场景系统(Scene System)
MRTK的场景系统主要服务于多场景管理和切换需求。如果项目由单个场景组成,则一般不需要场景系统。通常,混合现实应用面向单一场景,因此不需要场景系统,而VR应用(如VR游戏)需要多个场景,此时需要场景系统对其进行管理和统一。
MRTK的场景类型可分为内容场景、管理器场景和照明场景,内容场景即我们所日常编辑处理的场景;管理器场景起核心管理和协调的作用,其在启动时首先加载,在应用生存期内将保持加载状态,因此它可以托管程序运行中永远不被销毁的对象;照明场景用于存储照明信息和照明对象, 一次只能加载一个,其可以设置在高负载期间混合加载,实现平滑的照明转换。
MRTK场景系统的核心功能包含多场景管理、场景切换、状态保存与恢复、资源优化、全局资源共享等。默认情况下,场景系统使用DefaultManagerScene默认管理器场景对象和默认照明场景对象DefaultLighting进行资源配置,用户也可以定义自己的管理器和照明场景。 如果找不到其中任一场景,则“场景系统配置文件检查器”将显示一条消息。默认情况下,针对HoloLens开发,系统不会自动导入该包,用户可通过导入MRTK Foundation的unitypackage包的方式将二者导入(下载地址)。其导入方式为Assets→Import Package→Customer Package,后在Services/SceneSystem/SceneSystemResources下勾选所有选项。
关于具体的场景加载、照明场景操作、加载进度监视等内容,请同学们参考官方教程,由于HoloLens开发很少用到此系统,故在此不做详细叙述。
七、扩展(Extensions)
MRTK中,除了系统自身提供的服务外,用户还可通过扩展来自行创建和注册扩展服务。事实上,在MRTK配置面板中,我们只能进行对已编写的扩展服务/数据提供者进行注册,服务/数据提供者的创建并非在操作面板中完成。
7.1 创建扩展服务
如果您需要创建扩展服务,请参考官方文档进行扩展服务的创建,在创建前,您若无法在Utilities中找到创建扩展服务(Create Extension Service),请在Unity项目中导入Tools工具包(下载地址),导入方式为Assets→Import Package→Customer Package,接着,导入全部选项,届时,您可在Utilities中找到创建扩展服务。
在创建扩展服务面板中,设置后我们自定义的服务名称后,便可自动生成我们所需要的脚本文件,其包含多个C#文件,其具体的使用方法在后续的高级课程中我会逐一讲解。
7.2 注册扩展服务
完成扩展服务的创建和编写后,我们可在MRTK配置面板的扩展中点击Register a new Service Provider进行配置和注册,在Component Type中选择我们创建的服务名称,并配置优先级和运行平台选项。
八、编辑器配置(Editor)
此处MRTK的编辑器配置用于设置Unity编辑器的相关功能,目前系统只提供了两个设置:服务检查器(Use Service Inspectors)和深度缓冲区渲染器(Render Depth Buffer)。
服务检查器是一项仅适用于编辑器的功能,可在Unity hierarchy窗口中显示场景内对象的活动服务。提供这些服务相关的文档链接、编辑器的可视化控制和服务状态的信息。
深度缓冲区渲染器开启后,将在当前场景的相机视角下,将图像的逐像素深度值渲染到深度缓冲区,通过共享深度缓冲区,有助于提高全息影像的稳定性。
九、在运行时更改配置文件
上述设置通常作用于项目开发过程,而在程序运行过程中,我们可能需要更改一些配置文件,这就需要我们在运行时更改配置文件,微软官方为我们提供了一些教程,我们可通过在MRTK 初始化之前切换配置文件和切换处于活动状态的配置文件来进行操作。下面两段代码分别是该部分的配置示例。首先是在MRTK 初始化之前切换配置文件:
using Microsoft.MixedReality.Toolkit;
using UnityEngine;
public class PreInitProfileSwapper : MonoBehaviour
{
[SerializeField]
private MixedRealityToolkitConfigurationProfile profileToUse = null;
private void Awake()
{
// Here you could choose any arbitrary MixedRealityToolkitConfigurationProfile (for example, you could
// add some platform checking code here to determine which profile to load).
profileToUse = AssetDatabase.LoadAssetAtPath<MixedRealityToolkitConfigurationProfile>("地址");
MixedRealityToolkit.SetProfileBeforeInitialization(profileToUse);
}
}
或通过切换处于活动状态的配置文件:
MixedRealityToolkit.Instance.ActiveProfile = profileToUse;
十、总结
MRTK的配置系统帮助我们搭建了基本的AR/VR/MR应用程序的交互逻辑,我们可以利用此系统完成诸多基本任务。在后续的课程中,我们便进入了针对系统、场景的实战开发环节,欢迎大家持续关注!