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

news2024/11/26 11:35:33

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.coloradmin.cn/o/1493035.html

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

相关文章

AI入门笔记(三)

神经网络是如何工作的 神经网络又是如何工作的呢?我们用一个例子来解释。我们看下面这张图片,我们要识别出这些图片都是0并不难,要怎么交给计算机,让计算机和我们得出同样的结果?难点就在于模式识别的答案不标准&…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多,kafka、rabbitmq、RocketMq、activeMq、Redis(非专业),各有各的特点和优缺点。但是之前的公司数据需求规模并非很大,所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

基于umdf2的驱动程序

源码下载:https://download.csdn.net/download/mao0514/88915667 win10 64位系统vs2019wdk inf安装: VOID UMDF2Driver1EvtIoDeviceControl(_In_ WDFQUEUE Queue,_In_ WDFREQUEST Request,_In_ size_t OutputBufferLength,_In_ size_t InputBufferLen…

Docker基础系列之DockerFile

Docker基础系列之Dockerfile 文章目录 Docker基础系列之Dockerfile1. Dockerfile是什么?1.1 Dockerfile概述1.2 构建三步骤 2. Dockerfile构建过程解析2.1 Dockerfile内容基础知识2.2 执行Dockerfile的大致流程 3. DockerFile体系结构(保留字指令)4. 案例4.1 首先创…

BUUCTF-MISC-[GUET-CTF2019]soul sipse1

题目链接:BUUCTF在线评测 (buuoj.cn) 下载附件是一个音频文件,使用au打开没有什么发现 试试kali中的steghide steghide extract -sf /root/桌面/out.wav 无密码分离出download.txt 打开txt文件发现是个网址,访问看看 下载后使用binwalk查看照…

同态加密+区块链,在大健康数据隐私保护中的应用

PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 近几年,越来越多的隐私计算技术被用于解决临床和研究数据共享中的隐私和安全问题。 当然,对这些技术的法…

Android 14后台服务永久保活的技术方法

Android 14后台服务永久保活的技术方法 在本篇博客中,我们将探讨如何创建一个在Android系统中不会被杀死的后台服务。 第一步:创建一个后台服务。 在这一步中,我们需要创建一个后台服务的代码。 第二步:在AndroidManifest.xml中…

HDFS简介与部署以及故障排错(超简单)

文章目录 一、HDFS介绍1、简介2、结构模型3、文件写入过程4、文件读取过程5、文件块的存放6、存储空间管理机制6.1 文件删除和恢复删除6.2 复制因子配置6.3 文件命名空间6.4 数据复制机制 二、环境搭建(单机版)1、修改主机名2、配置ssh免密登录3、Hadoop…

串的匹配算法——KMP算法

目录 一.特点 二.算法思想 三.公式证明 四.next数组及其练习 五.找规律计算next[k] 六.代码实现 一.特点 BF算法的特点是i回退,KMP算法的最大特点是i不回退,由于i不回退,所以KMP算法的时间复杂度是O(nm)。 二.算法思想 在匹配主串和子…

Ubuntu 22.04修改静态ip

1. 备份原网络配置文件 # 配置文件名称因机器设置有异 cd /etc/netplan cp 01-network-config.yaml 01-network-config.yaml.bak# 文件内容如下 network:version: 2renderer: NetworkManager2. 修改配置文件 使用 ipconfig 命令查看网络信息,ip addr 命令也可 我这…

day52(vueJS)json-server模拟数据

json-server介绍:::JSON Server 是一个用于快速搭建 REST API 的工具,它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器,方便前端开发人员进行接口调试和开发。使用 JSON Server,你可以通过创建一个…

【Vue】VueX仓库

📝个人主页:五敷有你 🔥系列专栏:Vue ⛺️稳中求进,晒太阳 目录 Vue概述 是什么 场景: 优势 构建多组件共享环境 创建一个空仓库 核心概念 - state 状态 1. 提供数据 2.使用数据 ​编辑 …

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

纯手工搭建一个springboot maven项目

前言&#xff1a;idea社区版无法自动搭建项目&#xff0c;手动搭建的经验分析如下&#xff1a; 1 包结构 参考下图&#xff1a; 2 项目结构 3 maven依赖 具体的项目如图&#xff1a; 依据这个结构配置一个springboot 的 pom依赖&#xff1a; <?xml version"1.0…

SanctuaryAI推出Phoenix: 专为工作而设计的人形通用机器人

文章目录 1. Company2. Main2.1 关于凤凰™ (Phoenix)2.2 关于碳™(Carbon)2.3 商业化部署2.4 关于 Sanctuary Corporation 3. My thoughtsReference彩蛋&#xff1a;将手机变为桌面小机器人 唯一入选《时代》杂志 2023 年最佳发明的通用机器人。 称机器人自主做家务的速度和灵…

js SheetJS 合并表格导出到同一个excel中

最近有个需求,我在一个页面显示了4个表格, 然后合并导出到excel文件中 四个表,四个sheet,一个excel文件 最后导出时这样: 实现: 1,页面有个导出的checkbox,勾选则导出,不勾选不处理 2,在一个函数中,集中处理四个表数据获取,并将结果返回出来 //获取数据后返回为…

【C++】递归 1241 - 角谷猜想 1108 - 正整数N转换成一个二进制数

文章目录 一、问题&#xff1a;1241 - 角谷猜想二、问题&#xff1a;1108 - 正整数N转换成一个二进制数三、总结四、感谢 一、问题&#xff1a;1241 - 角谷猜想 类型&#xff1a;有规律的循环、递归。 题目描述&#xff1a; 日本一位中学生发现一个奇妙的定理&#xff0c;请角…

如何判断可编程电子负载是否合格?

可编程电子负载是一种可以模拟实际负载的电子设备&#xff0c;广泛应用于电源、电池、充电器等产品的测试和研发。判断可编程电子负载是否合格&#xff0c;需要从以下几个方面进行考量&#xff1a; 精度是衡量电子负载性能的重要指标&#xff0c;包括电流精度、电压精度、功率精…

ImportError: Could not import docarray python package解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Qt 使用QListView实现简约美观的聊天窗口

今天和大家分享一个使用QListView来展现聊天窗口的历史记录的例子, 因为聊天记录可能会有很多, 所以使用试图-模型的方式更加合理 这是最终效果: ChatHistoryModel继承自QAbstractListModel , ChatHistoryViewDelegate继承自QStyledItemDelegate, 这个例子最关键的就是在QSty…