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

By | 2018年7月5日

在《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 重置位置和角度

【转自:微软 Hololens 微信公众号】

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注