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.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做分析用什么工具

做分析用什么工具 导读 数据分析是数据辅助决策的最后一公里,是最终的数据可视化展示与探索分析的部分,选择使用最适合的数据展示方式,可以帮助分析人员大大提升分析效率。 问题: ● 纠结选择哪个工具 ● 纠结从哪里学起&#x…

Vue.js的双向绑定原理

Vue的双向绑定 vue双向绑定是其最重要的核心亮点,其原理也很简单,这里做个简单总结 vue2的双向绑定是利用的Object.definePropertyvue3的双向绑定是利用的 ES6Porxy中的defineProperty(target, propKey, propDesc 其作用类似于Object.defineProperty …

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置,原文21年已经有些许不同。 下载tomcat 官网:http://tomcat.apache.org/ 我们老师让安装8.5以上,所以我直接选择版本9 点击9页面之后…

GEE入门篇|图像分类(一):监督分类

在遥感中,图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图(图 1), 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要,包括自…

相机类型的分辨率长宽、靶面尺寸大小、像元大小汇总

镜头的靶面尺寸大于等于相机靶面尺寸。 相机的芯片长这样,绿色反光部分(我的手忽略): 基本所有像素的相机的靶面大小都可以在这个表格里面找到。 镜头的靶面尺寸在镜头外表上可以找到,选型很重要!

从零开始手写RPC框架(5)

继续上一节的内容,解析代码。 目录 编码器注册中心负载均衡策略动态代理屏蔽网络传输细节通过spring注解注册/消费服务 编码器 参考LengthFieldBasedFrameDecoder解码器的协议,在协议里规定传输哪些类型的数据, 以及每一种类型的数据应该占多…

pytest-教程-14-fixture之yield关键字

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest conftest.py文件的使用方法,本小节我们讲解一下fixture的yield关键字实现teardown后置操作。 当我们运行我们的测试时,我们会希望确保它们自己清理干净&#xf…

STM32标准库——(17)硬件SPI读写W25Q64

1.SPI外设简介 时钟频率就是sck波形的频率,一个sck时钟交换一个bit,所以时钟频率一般体现的是传输速度,单位是Hz或者bit/s,那这里的时钟频率是fPCLK除以一个分频系数,分频系数可以配置为2或4或8、16、32、64、128、256…

C++核心编程之内存分区模型,引用,函数提高

1,类型分区模型 c程序在执行中,将内存大方向划分为4个区域 1,代码区:存放函数体的二进制代码,由操作系统进行管理的 2,全局区:存放全局变量和静态变量以及常量 3,栈区&#xff1…

基于SSM的学科竞赛管理系统。Javaee项目。ssm项目。

演示视频: 基于SSM的学科竞赛管理系统。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvcMybatisVueLayuiElemen…

MP2494图纸 国产替代型号SC72001宽工作输入电压范围:4.5V 至 80V

MP2494 是一款单片降压开关变换器。它在宽输入范围内可实现 2A 连续输出电流,具有出色的负载和线性调整率。其控制良好的开关沿降低了 EMI 干扰。故障保护功能包括逐周期限流保护和过温关断保护。MP2494 最大限度地减少了现有标准外部元器件的使用。MP2494采用SOIC8…

win系统如何同时安装MySQL5和MySQL8

win系统如何同时安装MySQL5和MySQL8 文章目录 win系统如何同时安装MySQL5和MySQL81、准备好两种版本的数据库2、下载后解压到你指定的目录3、手动配置安装MySQL5和8安装MySQL53.1创建my.ini文件3.2生成data文件夹 安装MySQL83.1创建my.ini文件3.2生成data文件夹 4、配置环境变量…