Mixed Reality Toolkit-Unity 开发系列—Input 模块

2023-11-19

在《Mixed Reality Toolkit-Unity 开发系列—Sharing 模块》中,我们首次开讲 HoloLens 开发神器-微软原生开发包 Mixed Reality Toolkit-Unity(简称“MRTK”),并介绍了 Sharing 模块的相关功能及原理。MixedRealityToolkit 是一个开源的开发工具,它能够帮助开发者快速的构建 Microsoft HoloLens 以及 Windows Mixed Reality headsets 应用。随着 Unity 的版本升级,MRTK 也发布了相应的版本进行适配。MRTK 包含 Sharing、Input、Spatial Mapping 等九大模块,今天我们继续学习的是 Input模块。

Input 模块的使用

Input 在不同的平台表现的方式都不同,在 Mixed Reality 平台上有一些输入方式,首先介绍的是 Input 模块的使用。其中主要涉及到两个 prefab(Prefab 路径 HoloToolkit-Input-Prefabs):

(1) MixedRealityCameraParent.prefab:MixedRealityCameraParent.prefab 是 MixedRealityCamera.prefab 的父物体,MixedRealityCamera.prefab 中通过脚本MixedRealityCameraManager.cs 对 camera 参数进行默认设置。例如,Clear Flags 设置为 Solid Color、BackgroundColor 设置为 Clear(0,0,0,0)、NearClip 设置为 0.85、QualitySetting 设置为 Fastest。(2) InputManager.prefab:InputManager.prefab 用于管理 HoloLens 中的多种输入方式,例如手势、Xbox 手柄等;以及在编辑器中通过键盘上的 Shift 和 Space 来模拟点击手势。

我们可以使用这两个 Prefab 来实现 Input 提供的功能。当然你还可以添加 DefaultCursor 来对游标进行控制。

Input 模块的实现原理

Input 是集成了目前支持的所有用户交互方式,包括 Gaze(视线)、Gesture(手势)、Voice(语音)以及 Motion controllers(运动控制器),用户可以通过以上的途径来操纵场景中的物体。对于用户来说,精准的交互输入是保证体验的重要标准,下面我们通过几个例子来为大家解释其中的原理 (下文使用的软件工具为:Unity 2017 及 Visual Studio 2017)。

Gaze(视线)

  •  Scene:GazeEvents

该场景实现 IFocusable 接口来响应视线进入和移出。

图 1 Ifocusable 接口

如图所示,视线移入调用 OnFocusEnter(),视线移出调用 OnFocusExit()。在这个例子中,我们可以发现,OnFocusEvent 类实现 IFocusable  接口。

图 2 OnFocusEvent 类

在Unity中,检查该脚本所属物体的的 Inspector 面板,可以发现, OnFocusEnter 和 OnFocusExit 事件都被绑定在灯光强度的控制方法上。

图 3 RightSphere 的 Inspector 面板

Gesture(手势)

  •  Scene:InputTapTest

该场景实现 IInputClickHandler 接口来响应点击手势。

图 4 IInputClickHandler 接口

说明:在 Unity 中,按住左侧的 shift 并点击鼠标来模拟左手点击,按住空格键并点击鼠标来模拟右手点击。

图 5 TapResponder 类

在这个例子中,通过点击 cube,调用 OnInputClicked 方法;在 OnInputClicked 方法中通过修改 cube 的 localScale 来增大 cube 的比例。需要注意的是 eventData 中的 Use 方法,该方法可以理解为将此次点击事件标记为已处理状态,防止事件的再次转发或者再次进行响应。

  • Scene:InputNavigationRotateTest

该场景实现 INavigationHandler 接口来响应导航手势。

 

图 6 INavigationHandler 接口

上图所示命令分别代表:

(1) OnNavigationStarted :这是导航手势开始方法,对应拇指与食指的捏合手势;

(2) OnNavigationUpdated :这是导航手势更新方法,对应捏合手势以后的移动过程,可以在该方法中实现缩放、移动、旋转等功能;

(3) OnNavigationCompleted :这是导航手势完成方法,对应拇指与食指松开的手势;

(4) OnNavigationCanceled :这是导航手势取消方法,对应取消手势;

  • Scene:TwoHandManipulationTest

在模块最近的更新中还添加了对双手操作的支持,相较于单手对模型的移动、旋转和缩放,双手操作更加灵活方便。使用方法也很简单,只需要把你需要操作的模型中添加 TwoHandManipulatable.cs 脚本。

其中包括5个配置选项:

(1) HostTransform:表示要操作的对象,默认为添加改脚本的模型;

(2) Bounding Box Prefab:操作模型是显示的边框,可以自定义或者不添加;

(3) Manipulation Mode:操作模式包括 Scale、Rotate、Move Scale、Rotate Scale、Move Rotate Scale 五种;

(4) Constraint On Rotation:针对旋转模式,可以指定只旋转单个方向或者所有方向;

(5) One Handed MoveMent:是否支持对模型的单手移动操作;

添加完成后,就可以双手进行操作。

图 7 双手操作示意图

Voice(语音)

  •  Scene: SpeechInputSource

该场景实现 ISpeechHandler  接口来进行语音控制。

图 8 ISpeechHandler 接口

其中 eventData 参数属于 SpeechEventData 类型,该类型继承 BaseInputEventData ,包括两个属性:

(1) PhraseDuration 表示关键字的语音时长;

(2) RecognizedText 表示语音识别后的文字结果,该场景只是用到了这一属性;

图 9 通过语音识别结果改变颜色

从上图可以看到,识别结果通过 eventData 的 RecognizedText 属性传递给 ChangeColor 方法;在 ChangeColor 方法中对识别结果进行判断,然后改变为对应的颜色。

与上面所说的几个场景不同之处在于,该场景中 InputManager 和 SpeechInputSource 一同作为 Managers 的子对象。SpeechInputSource对象的 SpeechInputSource.cs 脚本包括多个属性:

(1) PersistentKeywords :控制语音识别实例是否会在加载新场景的时候被销毁;

(2) RecognizerStart :是一个枚举类型;

(3) public enum RecognizerStartBehavior

{ AutoStart, ManualStart }:

该命令的作用是控制语音识别功能自动开启还是通过代码控制来开启;

(4) Keywords :是一个数组,用于加载需要识别的关键字和键盘快捷键;

  • Scene:DictationTest

该场景实现 IDictationHandler 接口来进行语音识别。

图 10 IDictationHandler 接口

其中 4 个方法对应不同的识别阶段:

(1) OnDictationHypothesis :识别推测;

(2) OnDictationResult :识别结果;

(3) OnDictationComplete :识别完成;

(4) OnDictationError :识别错误;

使用 speechToTextOutput.text

=eventData.DictationResult; 在四个方法中都进行赋值。

方法中的参数 eventData 属于 DictationEventData 类型,该类型包括两个属性:

(1) DictationResult :字符串类型,是语音的识别结果;

(2) DictationAudioClip :AudioClip 类型,是语音识别最后一条;

另外需要注意的是使用语音识别功能需要开启特定的权限,开启方法:Edit -> Project Settings -> Player -> Settings for Windows Store -> Publishing Settings -> Capabilities

Motion Controllers(运动控制器)

  • Scene:XboxControllerExample

该场景实现 IXboxControllerHandler 接口通过 Xbox 来控制 cube。

图 11 IXboxControllerHandler 接口

其中 XboxControllerEventData 类型的参数 eventData 包括多个属性:

(1) GamePadName :表示所连接手柄的名称;

(2) XboxA_Pressed :A 按钮是否按下所有按钮的点击状态;

该场景中通过 Xbox 的左边摇杆来控制 cube 的位置。

图 12 修改位置

通过 Xbox 的右边摇杆来控制 cube 的旋转:

图 13 修改角度

通过 Xbox 的 Y 按钮来重置 cube 的移动位置和旋转角度:

图 14 重置位置和角度

转至:http://www.ahololens.com/?p=960

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mixed Reality Toolkit-Unity 开发系列—Input 模块 的相关文章

  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • c#获取cpu序列号

  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • 在 Unity 中使用资源文件夹

    我正在开发一个 HoloLens 项目 需要引用 txt 文件 我将文件存储在 Unity 的 资源 文件夹中 并且它们工作得很好 通过 Unity 运行时 string basePath Application dataPath stri
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 我可以使用 HTML 制作在 Hololens 上运行的通用应用程序吗?

    我相信这些说法是正确的 1 所有通用应用程序都以全息图的形式工作 2 可以使用 HTML JS 构建通用应用程序 这是否意味着我可以使用网络技术构建全息通用应用程序 例如 D3 js 中的全息可视化仪表板 现在下结论还为时过早 但这里有一些
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • Visual Studio 无法部署到 HoloLens:错误 DEP6957:无法连接到设备

    我在将 Hololens Academy 模块 Hololens 210 部署到 Hololens 设备时遇到问题 它会要求输入密码 我输入它但失败了 我可以很好地在模拟器中部署和运行 我可以确保计算机位于同一网络上 并且我将 Holole
  • Hololens TCP 套接字 - Hololens 服务器的 Python 客户端

    经过几周的挫折后 我终于能够将一个字符串从 Python 客户端发送到 Hololens 服务器 代码如下并且运行完美 但是 我想知道是否有使用套接字经验的人可以帮助我修改此代码以将 openCV 网络摄像头帧 基本上只是发送图像 从 Py

随机推荐

  • 分享一个嘉立创封装库(内含AD和PADS两种格式)

    一直以来做封装都是令我头疼的问题 偶然发现嘉立创的封装库 真的非常好用 而且封装做得非常漂亮 这个封装做得非常好 我也打过几款板子出来 手工焊接起来也非常好 真的是非常好的一个封装库 封装库里面包含了AD Protel99和PADS三种格式
  • 给windows宿主机和wsl2的ubuntu-20.04分配固定IP,使能相互ping通

    我们知道wsl2是基于hyper v的虚拟机 每次重新启动的时候 都会重新拉一个新的hyper v虚拟机实例 然后虚拟网卡的IP是dhcp随机分配的 如果作为开发系统用 就会比较烦每次都要换一个IP 有人提供了个脚本 他写了个bat脚本在w
  • Tomcat之startup.bat启动闪退解决

    安装完了service 那个服务器 使用从官网下载的apche包 我使用的是这个包apache tomcat 8 5 81 windows x64 去bin里面启动 startup bat结果出现闪退 问题还是java环境变量的设置问题 可
  • 用户的计算机名,获取计算机名及用户名

    ifdef WINDOWS uses Windows endif ifdef UNIX uses BaseUnix endif ifdef UNIX function GetUserName String begin Result GetE
  • docker介绍

    公式 Usage docker OPTIONS COMMAND A self sufficient runtime for containers Options config string Location of client config
  • Ipv4学习笔记之实践篇

    什么是IP 学习IP是入门网络的第一步 要想了解网络的工作原理 首先要了解的就是IP协议 IP standards for Internet Protocol 也就是说IP是Internet Protocol的缩写 是internet通信协
  • 【Termux Python3.11开发】安装opencv-contrib-python后终于可以尝鲜airtest,poco

    无意看到airtest的一些介绍 正好在找一些工具 Python自动化的轮子 好放在Termux环境下进行测试效果如何 经过一些时间的折腾 总算顺利解决 安装好几个相关的库 点击链接加入群聊 Termux友情赞助群 897177804 pi
  • uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

    放点击事件里面即可 uni navigateToMiniProgram appId 跳转的小程序的aooId path pages index index id 123 如果这里不填 默认是跳转到对方小程序的主页面 extraData 需要
  • 无人机+三维实景建模助力古建筑保护,传承历史记忆

    历史文化建筑 承载着过去各个时代的文化记忆 无论是保存还是修缮古建筑 都需要将其基本信息进行数字化建档 为修缮提供精准参考 根据住建部的要求 从2020年开始到2022年 全国需完成历史建筑100 测绘及系统录入工作 并且明确鼓励采用摄影测
  • iOS-根据系统语言更改App名称或其他配置

    要求 要根据系统的语言更改app的名字 解决方案 在xcode中进行打包前的配置 我用的是xcode11版本 一 Bundle display name 可以通过直接修改Bundle display name来确定app的名称 Bundle
  • 用云服务器搭建虚拟主机,如何用云服务器搭建虚拟主机

    如何用云服务器搭建虚拟主机 内容精选 换一换 在云服务器上搭建网站后 部分客户通过本地网络访问网站时出现偶发性无法访问的情况 确认客户使用的本地网络 若客户的本地网络是NAT网络 本地主机通过NAT功能使用公网IP地址访问弹性云服务器 可能
  • Windows 11开启硬件加速后出现的黑屏、闪屏(如Edge浏览器、照片)问题的两种解决方案

    2022年3月21日更新 若只有Edge出现闪屏问题 可跳到下方查看原文章 若其他软件也出现闪屏问题的话 可能是Intel核显驱动的问题 可以到Intel官网搜索相应的驱动程序 不要下载最新版 core 6 11代驱动下载地址 https
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 【数学建模】随机森林预测(Python代码实现)

    目录 1 参数 2 算例实现 2 1 算例 2 2 单目标预测 DecisionTreeRegressor 2 3 多目标预测MultiOutputRegressor 1 参数 n estimators 森林中决策树的数量 默认100 表示
  • Oracle 查询技巧与优化(二) 多表查询

    前言 上一篇blog介绍了Oracle中的单表查询和排序的相关技巧 http blog csdn net wlwlwlwl015 article details 52083588 本篇blog继续介绍查询中用的最多的 多表查询的技巧与优化方
  • VM装MACos

    准备工具 下载macOS Ventura 13 ISO镜像文件 VMware Workstation Pro最新版并激活 自行官网下载即可 需要镜像和key可以最下边的云盘自取 下载Unlocker for VMware Workstati
  • JAVA多线程介绍

    1 什么是多线程 得益于计算机的时间片机制 每一个应用程序的都可以在一段很小的时间段内执行 相比于单线程串行执行 得不到时间片就停止执行 多线程当中线程1得不到时间片 线程2有可能得到 可以更多的完成任务 还有一种场景 单线程要操作IO设备
  • Charles微信小程序抓包(详解)

    一 Charles官网下载安装包 https www charlesproxy com download latest release 官网下载不了的可去百度网盘获取 链接 https pan baidu com s 1NMqiGPLtEP
  • 最短路径-C++算法

    C 算法之 最短路径 基础2 2020版 前记 通过前面那份讲义 你应该对基础知识有所了解 今天我们来看下floyed算法的实现 复习 什么是最短路径 百度中的定义 用于计算一个节点到其他所有节点的最短路径 主要特点是以起始点为中心向外层层
  • Mixed Reality Toolkit-Unity 开发系列—Input 模块

    在 Mixed Reality Toolkit Unity 开发系列 Sharing 模块 中 我们首次开讲 HoloLens 开发神器 微软原生开发包 Mixed Reality Toolkit Unity 简称 MRTK 并介绍了 Sh