Hololens 2应用开发系列(4)——MRTK基础知识及配置文件配置(下)

news2024/11/15 13:29:16

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下勾选所有选项。
场景系统警告
MRTK导入场景包
  关于具体的场景加载、照明场景操作、加载进度监视等内容,请同学们参考官方教程,由于HoloLens开发很少用到此系统,故在此不做详细叙述。

七、扩展(Extensions)

  MRTK中,除了系统自身提供的服务外,用户还可通过扩展来自行创建和注册扩展服务。事实上,在MRTK配置面板中,我们只能进行对已编写的扩展服务/数据提供者进行注册,服务/数据提供者的创建并非在操作面板中完成。
MRTK设置

7.1 创建扩展服务

  如果您需要创建扩展服务,请参考官方文档进行扩展服务的创建,在创建前,您若无法在Utilities中找到创建扩展服务(Create Extension Service),请在Unity项目中导入Tools工具包(下载地址),导入方式为Assets→Import Package→Customer Package,接着,导入全部选项,届时,您可在Utilities中找到创建扩展服务。
MRTK创建扩展服务
  在创建扩展服务面板中,设置后我们自定义的服务名称后,便可自动生成我们所需要的脚本文件,其包含多个C#文件,其具体的使用方法在后续的高级课程中我会逐一讲解。

7.2 注册扩展服务

  完成扩展服务的创建和编写后,我们可在MRTK配置面板的扩展中点击Register a new Service Provider进行配置和注册,在Component Type中选择我们创建的服务名称,并配置优先级和运行平台选项。

八、编辑器配置(Editor)

  此处MRTK的编辑器配置用于设置Unity编辑器的相关功能,目前系统只提供了两个设置:服务检查器(Use Service Inspectors)和深度缓冲区渲染器(Render Depth Buffer)。
MRTK编辑器配置
  服务检查器是一项仅适用于编辑器的功能,可在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应用程序的交互逻辑,我们可以利用此系统完成诸多基本任务。在后续的课程中,我们便进入了针对系统、场景的实战开发环节,欢迎大家持续关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch神经网络-元组/列表如何喂到神经网络中

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

设计编程网站集:生活部分:饮食+农业,植物(暂记)

这里写目录标题 植物相关综合教程**大型植物&#xff1a;****高大乔木&#xff08;Trees&#xff09;&#xff1a;** 具有坚硬的木质茎&#xff0c;通常高度超过6米。例如&#xff0c;橡树、松树、榉树等。松树梧桐 **灌木&#xff08;Shrubs&#xff09;&#xff1a;** 比乔木…

基于Jenkins + Argo 实现多集群的持续交付

作者&#xff1a;周靖峰&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于 DevOps&#xff0c;云原生领域技术涉及 Kubernetes、KubeSphere、Argo。 前文概述 前面我们已经掌握了如何通过 Jenkins Argo CD 的方式实现单集群的持续交付&#xff0c…

基于Springboot的在线投稿系统+数据库+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringBoot Mybatis VueMavenLayui来实现。MySQL数据库作为系统数据储存平台&a…

Java安全 反序列化(3) CC1链-TransformedMap版

Java安全 反序列化(3) CC1链-TransformedMap版 本文尝试从CC1的挖掘思路出发&#xff0c;理解CC1的实现原理 文章目录 Java安全 反序列化(3) CC1链-TransformedMap版配置jdk版本和源代码配置前记 为什么可以利用一.CC链中的命令执行我们可以尝试一下通过InvokerTransformer.tr…

分布式异步任务框架celery

Celery介绍 github地址&#xff1a;GitHub - celery/celery: Distributed Task Queue (development branch) 文档地址&#xff1a;Celery - Distributed Task Queue — Celery 5.3.6 documentation 1.1 Celery是什么 celery时一个灵活且可靠的处理大量消息的分布式系统&…

数据库关系运算理论:传统的集合运算概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

如何在wps的excel表格里面使用动态gif图

1、新建excel表格&#xff0c;粘贴gif图到表格里面&#xff0c;鼠标右键选择超链接。 找到源文件&#xff0c; 鼠标放到图片上的时候&#xff0c;待有个小手图标&#xff0c;双击鼠标可以放大看到动态gif图。 这种方式需要确保链接的原始文件位置和名称不能变化&#xff01;&a…

网工内推 | 云计算工程师,HCIE认证优先,最高18k*14薪

01 杭州中港科技有限公司 招聘岗位&#xff1a;云计算工程师 职责描述&#xff1a; 1、承担云计算相关工程交付、业务上云及售前测试&#xff0c;从事虚拟化、桌面云、存储、服务器、数据中心、大数据、相关产品的工程项目交付或协助项目交付。 2、承担云计算维护工程师职责&…

深入理解Mysql索引底层原理(看这一篇文章就够了)

目录 前言 1、Mysql 索引底层数据结构选型 1.1 哈希表&#xff08;Hash&#xff09; 1.2 二叉查找树(BST) 1.3 AVL 树和红黑树 1.4 B 树 1.5 B树 2、Innodb 引擎和 Myisam 引擎的实现 2.1 MyISAM 引擎的底层实现&#xff08;非聚集索引方式&#xff09; 2.2 Innodb 引…

L4 级自动驾驶汽车发展综述

摘要:为了减小交通事故概率、降低运营成本、提高运营效率,实现安全、环保的出行,自动驾驶 技术的发展已成为大势所趋,而搭配有L4 级自动驾驶系统的车辆是将车辆驾驶全部交给系统。据此,介绍了自动驾驶汽车的主流技术解决方案;分析了国内外L4 级自动驾驶汽车的已发布车型、…

Python 安装目录及虚拟环境详解

Python 安装目录 原文链接&#xff1a;https://blog.csdn.net/xhyue_0209/article/details/106661191 Python 虚拟环境 python 虚拟环境图解 python 虚拟环境配置与详情 原文链接&#xff1a;https://www.cnblogs.com/hhaostudy/p/17321646.html

C语言易错知识点:二级指针、数组指针、函数指针

指针在C语言中非常关键&#xff0c;除开一些常见的指针用法&#xff0c;还有一些可能会比较生疏&#xff0c;但有时却也必不可少&#xff0c;本文章整理了一些易错知识点&#xff0c;希望能有所帮助&#xff01; 1.二级指针&#xff1a; parr是一个指针数组&#xff0c;其中每…

std::shared_ptr与std::make_unique在类函数中的使用

在最近学习cartographer算法的时候&#xff0c;发现源码中大量的使用了std::shared_ptr与std::make_unique&#xff0c;对于这些东西之前不是很了解&#xff0c;为了更好的理解源代码&#xff0c;因此简单学习了一下这块内容的使用&#xff0c;在这里简单记个笔记。 std::shar…

【热门话题】深入浅出:npm常用命令详解与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 标题&#xff1a;深入浅出&#xff1a;npm常用命令详解与实践引言一、npm基本概…

打流仪/网络测试仪这个市场还能怎么卷?

#喝了点&#xff0c;码点字# 以下为个人观点&#xff0c;看看就好&#xff0c;如有冒犯&#xff0c;私信删稿 都有哪些厂商在做打流仪/网络测试仪 -洋品牌&#xff1a;思博伦/Viavi-Spirent&#xff0c;是德/Keysight-Ixia&#xff0c;信雅纳/Lecroy-Xena&#xff0c; -国产…

睿尔曼超轻量仿人机械臂之-灵巧手动作编写及程序调用

一、灵巧手动作编写 1.连接设备 2. 运动控制 3. 参数设置 4 动作库使用 本软件可以设置灵巧手内部第 1-第 13 套动作序列数据&#xff0c;每套动作序列最多能有 8 步 分解动作&#xff0c;每一步分解动作的手指角度、运动速度、力度以及等待时间都可以单独设置。 步骤数&…

QT_day2:2024/3/21

作业1&#xff1a;使用QT完成一个登录界面 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通过代码实现 3. 需要添加适当的动图 源代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget…

力扣由浅至深 每日一题.06 删除有序数组中的重复项

希望我们都能对抗生活的苦难&#xff0c;在乌云周围突破阴霾积极的生活 —— 24.3.16 删除有序数组中的重复项 提示 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元…

贝尔曼方程【Bellman Equation】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 文章目录 强化学习笔记一、状态值函数贝尔曼方程二、贝尔曼方程的向量形式三、动作值…