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

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

  • 一、前言
  • 二、输入系统
    • 2.1 MRTK输入系统介绍
    • 2.2 输入数据提供者(Input Data Providers)
    • 2.3 输入动作(Input Actions)
    • 2.4 控制器(Controllers)
    • 2.5 指针(Pointers)
    • 2.6 手势(笔势、Gestures)
    • 2.7 手部关节追踪(Articulated Hand Tracking)
    • 2.8 语音命令
    • 2.9 其他
  • 三、总结
  • 参考文献

一、前言

  在前面的Hololens 2应用开发系列文章中,我介绍了Hololens2开发环境配置及项目生成部署、使用MRTK在Unity中设置混合现实场景并进行程序模拟以及MRTK基础知识和总配置文件和相机配置使用的说明,在上述最后一篇文章中,我总体介绍了输入(Input) 配置的概要,而在本篇文章中,我将对输入(Input) 配置进行详细介绍。
输入系统全览

二、输入系统

2.1 MRTK输入系统介绍

  在了解MRTK输入系统前,请先了解几个关键名词:

  • 输入数据提供者(Input Data Providers):本质上是数据提供者(参考该文章2.4节MRTK服务介绍),又被称为设备管理器,从硬件(HoloLens 2、鼠标、输入模拟程序等)底层获取信息并向MRTK提供数据;
  • 控制器(Controllers):注意,此控制器不是实际的物理硬件,而是一个软件,是一个抽象的表达,它将从 输入数据提供者(Input Data Providers) 获取的数据转换为MRTK所需的数据类型和事件;
  • 指针(Pointers):该处的指针概念类似于电脑的鼠标(电脑操作系统将鼠标信息在2D显示器平面上显示出的鼠标光标),由控制器(Controllers) 可视化转换而来,只不过,在3D空间中,指针也有所三维化,通常它是一条射线,由人手(或控制器,此处指物理控制器)发出,指向远处人手(控制器)所指向的方向;指针包含近指针远指针。准确来说,近指针是对于附近物体的触摸和抓取等操作,而远指针才一般以射线形式显示;
  • 焦点(Focus):指针指到某个物体上,则在该物体的表面与指针相交处产生了焦点;
  • 光标(Cursor):指针射线末端,为展示焦点所在位置,同时提供指针交互的视觉表现,会在射线末端呈现一个圆环,类似于电脑中鼠标光标中所代表实际点击位置的最上方的角。

  微软官方文档输入系统概述中,为我们介绍了输入系统的如下组成,其中,设备管理器为我们提供的系统层面的数据(因此,又称为数据提供者),而控制器Controller的配图与实际功能意义并非完全相符,但整体的层级关系是基本正确的,即数据提供者Input Data Providers控制器Controllers指针Pointers焦点Focus光标Cursor交互Interactable
MRTK输入系统全览
  从实现上来说,微软官方对MRTK的事件流进行了描述,其如下图所示。控制器输入事件传递给指针指针指针事件传递给了聚焦物目标物聚焦物目标物通过监听指针事件输入事件执行相应命令。
MRTK事件流
  而在具体实现上,MRTK输入系统之间各部分的关系较为复杂,为了更好地帮助大家理解各个组件之间的属性与关联,在此我以思维导图的方式将各个组件为大家展示如下:

从底层硬件获取数据
图像
语音命令
处理语音输入
输入事件
录制音频片段
输入事件
输入事件
输入事件
输入事件
手势识别
输入系统Input System
数据提供者Input Data Providers
输入模拟服务
控制器Controllers
Unity操纵杆
Unity 触控设备
Windows MR设备
Hand Joint Service
手部关节跟踪
...
语音Speech
关键字识别
更多指针Pointers...
听写Dictation
控制器1
指针1
控制器2
...
指针2
...
手势Gesture
焦点Focus
交互事件
光标Cursor

  其中,每个数据提供者可以生成一个或多个控制器(如左手控制器、右手控制器),同时一个控制器也可以根据不同的输入事件生成多种类型的指针(如点击、抓取、指向),但往往其在一个时刻对应一种指针,每个指针都有其焦点光标,同时,聚焦的物体也根据输入事件执行不同的交互事件。但是,凡事也有例外,对于语音输入听写输入,其无需控制器,而是根据输入内容,执行相应的处理服务,从而转化成相应的输入事件,如命令某个物体做出改变。(PS: 不同于电脑中只能有一个鼠标,系统中可以同时存在多个指针,如左手和右手一起交互。)
  在理解了所有组件的基本概念之后,接下来再看各项的具体设置,便更为容易。

2.2 输入数据提供者(Input Data Providers)

  微软官方对MRTK输入数据提供者的文档请参考:输入提供者 - MRTK2。
  MRTK的输入系统为支持多种类型的输入源,对每种类型的输入设备或交互方式,几乎都通过输入数据提供者(Input Data Providers) 来捕获和处理相应的输入事件。因此,无论是内置的输入设备还是自定义的硬件平台,MRTK都要求或者支持开发人员创建对应的数据提供者来整合这些输入源到统一的输入管理系统中,确保应用能够无缝地响应来自各种交互方式的输入事件。
MRTK输入数据提供者
  对于一个输入提供者,它可创建多个控制器,这些控制器统一由输入提供者进行生成、管理和销毁,但听写语音输入提供者不会创建任何控制器,它们直接引发自己的专用输入事件。MRTK现有的一些输入数据提供者及其对应源输入设备如下:

输入数据提供者源输入设备及相关说明
Windows Mixed Reality Device Manager设备:HoloLens等
监测数据:手、语音等
创建的控制器:WMR 关节手、WMR 控制器、WMR GGV(凝视、手势和语音)手
Mouse Device Manager设备:鼠标
监测数据:鼠标动作
创建的控制器:鼠标控制器
OpenXR XRSDK Device Manager设备:通用OpenXR(VR、MR)设备
监测数据:设备按钮、操纵杆等动作数据
创建的控制器:通用OpenXR(VR、MR)控制器
Unity Joystick Manager设备:操纵杆
监测数据:操纵杆动作数据
创建的控制器:Generic Joystick
Unity Touch Device Manager设备:触摸屏设备
监测数据:触碰数据
创建的控制器:Unity Touch Controller
Windows Speech Input设备:支持语音输入的Windows设备
监测数据:语音命令数据
创建的控制器:无
Windows Dictation Input设备:支持语音输入的Windows设备
监测数据:听写数据
创建的控制器:无
Hand Joint Service设备:带有手部关节识别的设备
监测数据:图像数据
创建的控制器
Input Simulation Service设备:Unity模拟功能
监测数据:图像数据
创建的控制器:Simulated Hand

  在了解相关功能说明后,您可选择对应所需的输入数据提供者,并展开其菜单进行配置,常规情况下,您仅需选择并克隆对应设备下的配置文件即可,一些输入提供者可能会有额外设置,如输入模拟服务会要求您配置不同按键的动作。
  如需创建自己的输入提供者,请参考微软官方教程创建输入系统数据提供程序 — MRTK2,该部分属于高阶教程,您可先行自行了解。

2.3 输入动作(Input Actions)

  输入动作是对原始物理输入的抽象,所有的物理操作都需要转化成逻辑动作才能在程序中使用,输入动作旨在帮助将应用程序逻辑与产生输入的特定输入源隔离开来。因此,区分于上方为方便大家理解而绘制的思维导图,输入动作(Input Actions) 并非直接位于输入数据提供者之前或之后,而是位于整个输入处理流程的更高层级。
  输入动作到底是什么?在前面叙述的逻辑中,我们仅了解了利用输入数据提供者对程序进行控制(或使程序监测输入数据来知道你的关注目标),这类似于在电脑桌面上的鼠标移动操作,而输入动作类似于选中某个图标后(物体获得焦点后)为“打开程序”(执行某种命令)的鼠标双击操作和回车操作(这两种操作作用是一样的),被关注的目标无需知道具体输入源(操作方式)是什么,而仅仅需要监听“打开程序”这个动作,便可知道自己要做什么改变。
  具体来讲,如定义一个名为Select的操作并将其映射到鼠标左键、游戏手柄中的按钮和6DOF控制器中的触发器,然后应用程序只需要监听Select输入动作事件,便可执行选中这一命令。同时,我们也可以设定输入规则,将一个输入动作分解为多个输入动作,如摇动一个摇杆,可将该动作分解成向前、向后、向左、向右四个动作。
  因此,在输入动作(Input Actions) 中,可以设置的是根据不同的输入类型设置具体的操作名称,和设置输入动作规则,对动作进行分解。该部分设置面板如下:
MRTK输入动作
  其中,在输入动作设置部分,我们可以根据输入数据类型设置其不同的动作名称(准确说是指定了操作名称后将其映射到某种输入类型),因此,在此我列出我们可以映射的输入数据类型。

数据类型描述
Digital(开关值)开关输入,等同于按键输入,如手柄按键
SingleAxis(单轴)单轴模输入,如游戏手柄中的模拟触发器
DualAxis(双轴)双轴模拟输入,如摇杆
SixDof(6自由度)平移和旋转3D姿势,如6DOF控制器生成的3D姿势,如6自由度的手持控制器
Raw原始数据,仅用于代理
None无输入

  除此之外,还有一些数据类型,我们可根据字面意义对其进行理解。
  对于输入规则,我们可以选择原始的输入动作,在不同的方向上对其进行分解,进而产生新的输入。
  对于定义好的输入动作,我们可在控制器部分将其映射到实体的控制器上,进而完成输入事件关联,详细可参考官方文档。

2.4 控制器(Controllers)

  参考微软官方文档,在控制器设置中,我们需要将具体的实物控制器配置(映射)到其关联的MRTK控制器服务上。
MRTK控制器
  如我们点击了Controller Definitions后,在弹出的菜单上我们选择鼠标控制器Mouse Controller,会出现鼠标控制器的选项界面:
MRTK鼠标控制器
  在对相应的数据类型选择输入动作后,我们可以关注到下方小字,即该设置所映射到的控制器服务。针对HoloLens 2开发和测试,我们需要重点配置的控制器有GGV Hand Controller(手部控制器)GGV Left Hand Controller(左手控制器)GGV Right Hand Controller(右手控制器)Mouse Controller(鼠标控制器)。其余控制器可根据需要进行配置。
  在控制器的配置页面中,下方还有不少配置选项,主要是对控制器的可视化操作及可视化效果,在图像中会渲染出一个与你的控制器一致的控制器模型,通常我们并不需要,但在软件开发时可据此进行调试,检查控制器(如手势)的跟踪状态,此处可自行配置。

2.5 指针(Pointers)

  指针用于与游戏对象交互。指针的类别分为近指针、远指针和瞬移指针。

  • 远指针:该类型的指针用于与远离用户的对象进行交互。 这些类型的指针通常会投射出可以深入世界的线条,使用户能够对不在他们身边的对象进行交互和操作。
  • 近指针:该类型的指针用于与距离用户足够近的对象进行交互,以便可以抓取、触摸和操作对象。 一般情况下,这些类型的指针通过查找附近区域中的对象来与对象交互(在短距离处进行光线投射、进行球体投射、查找附近的对象,或枚举被视为可抓取/可触摸对象的对象列表)。
  • 瞬移指针:这些类型的指针插入到瞬移系统,以处理将用户移到指针所指位置的操作。
    MRTK指针
      在程序运行过程中,当新的控制器被检测到时,会自动创建对应的指针。由于单个控制器可以有多个指针(例如,关节手可以具有近距和远距交互指针),因此有一个组件(指针调解器)负责调解哪个指针应处于活动状态。用户的手部接近某个可按按钮时,ShellHandRayPointer应停止显示,而PokePointer应该参与进来。通过更改指针配置文件中的PointerMediator属性,可以提供指针调解器的替代实现。由于指针调解器每帧都会运行,因此它最终会控制所有指针的活动/非活动状态。所以,如果在代码中设置指针的 IsInteractionEnabled属性,每帧的指针调解器会覆盖此属性值,我们可以改为自行指定PointerBehavior来控制指针的打开和关闭。 具体配置方法可参阅微软官方文档如何禁用指针。
      在MRTK指针配置面板上,我们可以对指针进行配置,同时对其可视化与否和可视化效果进行设定。由于微软官方指针文档已较为全面,在此不再多余阐述。
    MRTK指针设置

2.6 手势(笔势、Gestures)

  要注意区分手势Gestures与后面手部关节追踪Articulated Hand Tracking,手势识别是建立在手部关节追踪基础之上的高级抽象层,相比于手部关节追踪来说,手势更加注重动作的意义和目的性,开发者无需关心所有关节的详细动态,只需监听和响应特定的预设手势即可。微软官方教程中将Gestures亦翻译为了笔势,但不排除错误翻译的可能。手势是基于人手的输入事件。 MRTK 中有两种类型的设备会引发手势输入事件:

  • Windows Mixed Reality设备,例如HoloLens。 它描述捏合运动(“隔空敲击”)和点击并按住手势(WindowsMixedRealityDeviceManager包装Unity XR.WSA.Input.GestureRecognizer以使用来自HoloLens设备的Unity手势事件)
  • 触摸屏设备(UnityTouchController 包装支持物理触摸屏的 Unity Touch 类)

  为了增强理解,微软官方为我们制作了一个基本手势操作的视频,通过本视频,您可了解具体的手势操作,同时对该部分的配置项有所了解。
  HoloLens 2手势识别器会生成若干手势识别结果,并将其映射到默认的输入动作上,如单击(Tap)、抓取(Grab)、操作(Manipulation)等,同时我们也可以映射自定义的手势输入动作。

2.7 手部关节追踪(Articulated Hand Tracking)

  手部关节追踪区分于手势,顾名思义,它是更底层的实现配置。手部关节追踪的设置偏重于对手部关节预制件的设置,在此我们尽量不要变动其原始设置。
手部关节预制件
  借助手部关节追踪,我们可以从输入系统为每个手部关节请求位置和旋转。此外,系统还允许访问跟随关节的GameObject。 如果其他GameObject应连续跟踪某个关节,这会非常有用。TrackedHandJoint 枚举中列出了可用关节。具体请查阅官方文档,在此无需做详细描述。

2.8 语音命令

  HoloLens 2中,系统提供了语音文字识别功能,在此我们可通过关键词设置语音控制命令,并将其关联到某个输入动作上。其中,总体的配置有启动行为Start Behavior,即选择自动启动还是手动启动;和识别可信等级,不同等级识别效果不同。
在这里插入图片描述
  由于配置较为简单,在此不做阐述,详细可参阅官方文档。

2.9 其他

  由于是引导章节,本文暂未涉及代码和高级功能的讲解,MRTK输入系统官方文档中还未我们提供了凝视(Gaze)、听写(Dictation)、访问 MRTK 中的输入状态、添加近交互性等功能的介绍、使用和代码编写,感兴趣的同学可以先行了解。

三、总结

  错综复杂的输入逻辑一点点构成了MRTK日益丰富完善的输入系统,为了更好帮助大家理解,我尽量将一些专有名词或说法转化为了适合小白的通俗易懂的话语,内容制作属实不易,错误也不可避免,如有错误敬请指出!!!

参考文献

[1] 汪祥春.HoloLens 2开发入门精要:基于Unity和MRTK[M]. 北京:清华大学出版社,2021.
[2] MRTK2-unity开发文档[EB/OL].https://learn.microsoft.com/zh-cn/windows/mixed-reality/mrtk-unity/mrtk2,2022.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云服务器迁移--天翼云篇(最省钱解决官方未解问题)

0x00 背景 距离上次从华为云迁移到天翼云过了一年之久,之前买的一年期天翼云服务器快到期了,这次需要把这个池子(内蒙)的天翼云服务器迁移到新买的另一个池子的天翼云里。上一篇文章华为云迁移到天翼云教程在 云服务器迁移 (全网最省钱最详细攻略)_服务…

二分以及练习题目

二分模板 判断是否可以二分 (1)单调性 备选答案集是有序的 (2)二段性 在检查了mid是否符合要求之和,我可以舍弃左右某一边的答案 两个模板 关键词:满足条件的最小值,最大值最小&#xff0…

Django学习记录08——图表及文件上传案例

1.图表Echarts的应用 Apache ECharts 1.1 使用方法 引用echarts.js即可到官方文档中查询使用 1.2 常用图标的使用 图表展示页面的部署&#xff08;主要展示折线图、柱状图、饼图&#xff09; {% block content %}<div class"container"><div class&qu…

李沐动手学习深度学习——4.1练习

1. 计算pReLU激活函数的导数。 pReLU激活函数公式根据课本有如下&#xff1a; p R e L U ( x ) max ⁡ ( 0 , x ) α min ⁡ ( 0 , x ) \mathrm{pReLU}(x) \max(0, x)\alpha \min(0,x) pReLU(x)max(0,x)αmin(0,x) 对应的函数图像为: 对应的导数计算为&#xff1a; d p R…

github双因子认证

最近换了个安卓手机&#xff0c;打算让之前的苹果手机退役了&#xff0c;所以需要重新搞GitHub的Two-factor authentication 步骤如下&#xff1a; 1. 访问安全中心 https://github.com/settings/security 2. 点击Authenticator app右侧按钮 3. 下载腾讯身份验证器&#xff…

解密程序员的“藏宝图”:我的祖传代码大公开

程序员是如何看待“祖传代码”的&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一位充满好奇心和分享热情的程序员。今天&#xff0c;我要为大家揭开我心中的“藏宝图”——那些我认为值得传世的祖传代码。让我们一同踏上这场奇妙的代码冒险之旅吧&#xff01; 宝物一…

WMS仓储管理系统在电子企业中的应用效果如何

一、WMS仓储管理系统的概念与重要性 在当今信息化与自动化的时代&#xff0c;仓储管理不再仅仅是简单的物品存储和分发。仓库作为供应链中的核心环节&#xff0c;其管理效率和准确性直接影响到企业的运营成本和客户满意度。WMS仓储管理系统应运而生&#xff0c;成为电子企业提…

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 刷题https://leetcode.cn/problems/fibonacci-number/description/文章讲解https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解https://www.bilibili.com/video/BV…

微服务如何保证对外接口的安全?可以这样做!

如果你的微服务需要向第三方开放接口&#xff0c;如何确保你提供的接口是安全的呢&#xff1f; 1. 什么是安全接口 通常来说&#xff0c;要将暴露在外网的 API 接口视为安全接口&#xff0c;需要实现防篡改和防重放的功能。 1.1 什么是篡改问题&#xff1f; 1.1.1 如何解决篡…

GEE 依照范围裁剪 下载Sentinel-2数据

0. GEE介绍 Google Earth Engine&#xff08;GEE&#xff09; 是由Google开发的一种云端平台&#xff0c;旨在提供强大的地理空间数据处理和分析工具。GEE集成了大量的遥感影像数据和地理空间数据集&#xff0c;以及高性能的计算资源&#xff0c;使用户能够在云端高效地进行大规…

【深度学习笔记】 5_9 含并行连结的网络(GoogLeNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.9 含并行连结的网络&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet的网络结…

Pycharm与Anaconda安装

网址&#xff1a; Pycharm&#xff1a;https://www.jetbrains.com/pycharm/ Anaconda&#xff1a;https://www.anaconda.com/download/ 官网下载速度太慢可以选择到清华源下载&#xff1a;https://repo.anaconda.com/archive/ 一&#xff1a;Anaconda安装 安装&#xff1a; …

Android开发社招面试经验,大佬带你看源码

程序员的劫 最近&#xff0c;又被程序员年龄的事情刷屏了。37岁被公司优化&#xff0c;找工作几个月都没有很好的归属&#xff0c;所谓的小公司还看不上。等等类似的话题变成了程序员的吐槽固定标题&#xff0c;无论是程序员&#xff0c;还是其他行业人员&#xff0c;都可以就…

把简单留给用户,把复杂交给 AI

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿&#xff08;Luke&#xff09;分享了对 AI 与数据行业的一些战略思考&#xff0c;以及对中美企业服务市场的见解&#xff0c;引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技术应用风起云涌…

开发一个小程序需要多少钱

【腾讯云】 爆款2核2G3M云服务器首年 61元&#xff0c;叠加红包再享折上折 要做小程序的小伙伴们福利来啦&#xff01; 抢购方式&#xff1a; 方式一&#xff1a;直达链接》点我直接抢购 方式二&#xff1a;长按住识别以下官方二维码直接抢购 01 小程序认证 根据微信公众平台…

1.2_1 分层结构、协议、接口和服务

1.2_1 分层结构、协议、接口和服务 &#xff08;一&#xff09;为什么要分层&#xff1f; 主机A如果想要向主机B发送文件&#xff0c;则一定要经过中间的一些介质、链路。 发送文件前要完成的工作&#xff1a; 1.发起通信的计算机必须将数据通信的通路进行激活。 所谓的激活&a…

经典算法----折半查找

二、经典算法之折半查找 很多同学对于二分法就是&#xff1a;一看就会&#xff0c;一写就废&#xff01;&#xff01;&#xff01;&#xff01; 易错点1&#xff1a;以下循环方式写哪一个&#xff1f; 方案一&#xff1a;while(left<right) 方案二&#xff1a;while(left…

[蓝桥杯 2017 省 A] 油漆面积 Java代码及一些个人理解

[蓝桥杯 2017 省 A] 油漆面积 题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个…

uniapp小程序获取位置权限(不允许拒绝)

需求 小程序上如果需要一些定位功能&#xff0c;那么我们需要提前获取定位权限。我们页面的所有功能后续都需要在用户同意的前提下进行&#xff0c;所以一旦用户点了拒绝&#xff0c;我们应该给予提示&#xff0c;并让用于修改为允许。 实现 1.打开手机GPS 经过测试发现即使…

Java精品项目--第6期基于SpringBoot的茶叶商城的设计分析与实现

项目技术栈 SpringBootMavenMySQLJAVAMybatis-PLusVue.js&#xff08;非前后端分离&#xff09;Element-UI&#xff08;非前后端分离&#xff09;… 表截图 项目截图