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.mzph.cn/news/739349.shtml

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

相关文章

Date类型及dayjs的使用总结

一、Date() Date数据类型用于处理日期和时间,它可以表示自1970年1月1日00:00:00 UTC(Coordinated Universal Time,国际协调时间)以来的毫秒数。 1.创建Date对象 例如:Tue Oct 31 2023 14:01:33 GMT0800 (中国标准时…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript事件处理

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 什么是DHTML …

Linux基础命令[16]-head

文章目录 1. head 命令说明2. head 命令语法3. head 命令示例3.1 不加参数3.2 -c(按照字节显示)3.3 -n(按照行数显示)3.4 -v(显示文件名) 4. 总结 1. head 命令说明 head:用来显示文件开头&…

Linux认识与学习BASH

Linux认识与学习BASH 认识BASH这个Shellshell是什么系统的合法shell与/etc/shells功能Bash Shell的功能查询命令是否为Bash shell 的内置命令(type)命令的执行与快速编辑按钮 shell的变量功能什么是变量?变量的使用与设置:echo、变量设置规则、unset环境…

springboot网页时装购物系统链接

链接:https://pan.baidu.com/s/1mCmCSbqUCv48_a6wiLBdJg?pwdfalz 提取码:falz 2600套项目源码 https://kdocs.cn/l/cuAdxEBfLiqA 工作室精心制作,包括小程序项目,springboot项目,传统ssm项目,前后端分离项目。你可以用来制作自…

Stable Diffusion 模型下载:Comic Babes(漫画宝贝)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 条目内容类型大模型基础模型SD 1.5来源CIVITAI作者datmuttdoe文件名称comicBabes_v2.safet…

如何用 RAG 技术玩转文档问答?Milvus × 网易有道 QAnything 为你揭秘!

过去一年,RAG 在技术层面发展迅速,为向量数据库赛道添了一把火。RAG 和向量数据库的结合,能够有效解决幻觉、时效性差、专业领域知识不足等阻碍大模型应用的核心问题。 不久前,网易有道开源了自研的 RAG 引擎 QAnything。用户的任…

Q学习(Q-Learning)

Q学习是一种强化学习算法,用于指导代理(Agent)在给定环境中如何采取最优行动。它通过学习状态中的行动价值来实现,属于从与环境的交互中学习,通过尝试和错误,以实现目标的机器学习算法。 下面是Q学习工作原…

突破次元壁!体验数字人的神秘世界

在这个繁忙的城市,人们的生活总是充满了压力和焦虑。他们似乎总是在追寻着什么,却又不知道自己究竟在追寻什么。在这个看似平凡的世界里,隐藏着一个神秘的数字人世界。 这个数字人世界并不是虚构的,而是我们无法触及的另一个维度…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质…

vite配置

"vite": "^5.1.4" resolve.alias:配置别名 1、执行npm install -D types/node 或者 yarn add types/node -D 2、以下配置代表访问src时可以用“”代替 resolve: {alias: {"": path.resolve(__dirname, "./src"),},}, 使…

【C语言】自定义类型:结构体

1. 结构体类型的声明 1.1 结构体回顾 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣: struct Stu {char name[20];//名字int age;//年…

Vue前端项目安装及相关问题解决

目录 安装 以人人开源前端项目安装为例,安装部署及安装过程中的问题的解决思路。开源地址如下: 人人开源 下载代码到本地 安装visial studio code(即VSCode)作为前端开发工具,使用前端前必须安装node.js作为让js运行…

Android 生成SO - 基础工程创建

最近需要给小伙伴扫盲一下如何使用Android Studio 生成一个SO文件,网上找了很多都没有合适的样例,那只能自己来写一个了。 原先生成SO是一个很麻烦的事情,现在Android Studio帮忙做了很多的事情,基本只要管好自己的C代码即可。 …

【梳理】k8s使用Operator搭建Flink集群(高可用可选)

文章目录 1. 架构图2. helm 安装operator3. 集群知识k8s上的两种模式:Native和Standalone两种CR 4. 运行集群实例Demo1:Application 集群Demo2:Session集群优劣 5. 高可用部署问题1:High availability should be enabled when sta…

3.1_2 覆盖与交换

3.1_2 覆盖与交换 (一)覆盖技术 早期的计算机内存很小,比如IBM 推出的第一台PC机最大只支持1MB大小的内存。因此经常会出现内存大小不够的情况。 后来人们引入了覆盖技术,用来解决“程序大小超过物理内存总和”的问题。 覆盖技术的…

DevOps-Jenkins-CI持续集成操作

创建项目 创建个web项目 我这里直接用Spring Web自动生成的demos 启动项目,访问展示如下默认页面信息 项目新增Docker构建配置 在项目下新建docker目录,新增Dockerfile、docker-compose.yml文件 Dockerfile文件,将mytest.jar 复制到容器的…

移动硬盘无法读取怎么修复?分享三个简单方法

移动硬盘作为现代数据存储的重要工具,一旦出现故障,往往会让我们感到焦虑和困惑。当移动硬盘无法读取时,我们需要冷静分析并采取适当的措施来修复它。本文将为您介绍三种有效的修复方法。 一、检查物理连接与驱动程序 当移动硬盘无法读取时&…

LiveGBS流媒体服务器中海康摄像头GB28181公网语音对讲、语音喊话的配置

LiveGBS海康摄像头国标语音对讲大华摄像头国标语音对讲GB28181语音对讲需要的设备及服务准备 1、背景2、准备2.1、服务端必备条件(注意)2.2、准备语音对讲设备2.2.1、不支持跨网对讲示例2.2.2、 支持跨网对讲示例 3、开启音频开始对讲4、搭建GB28181视频…