本文主要介绍MRTK开发组件针对空间感知网格、解算器、远近距离交互、手部网格、边界框、语音识别以及眼动跟踪等功能的原理与使用方法。
空间感知网格(Spatial Perception)
遮挡或者建模
空间感知网格依托于SLAM的平面检测和空间定位技术,对于从真实获取的位置信息,实时地为对象添加mesh网格,并根据相关配置文件进行对应的贴图,使之空间可见或可用于遮挡空间中距离较远,投影重叠的对象。
MRTK开发套件实现了对空间感知网格的一些接口,开发者可以根据自己的需求设置具体空间感知网格的使用方式。针对MRTK开发套件的配置是无法编辑的只读设定,开发者可以使用开发套件提供的clone方法对相应的配置文件进行克隆,并替代当前场景对应的配置文件,然后对具体的配置文件进行编辑。
解算器(Solver)
跟随同步
解算器实现的功能主要是为应用提供定位,其可以根据用户给对象设定的空间位置规则不断更新对象的位置。相关主要代码如下:
SolverHandler:设置要跟踪的参考对象(例如,主相机变换,手光线等),处理解算器组件的收集,并以正确的顺序执行更新。
Orbital:锁定到指定位置并偏离跟踪参考对象。
ConstantViewSize:缩放以相对于跟踪的参考对象的视图保持恒定的大小。
RadialView:将对象保持在所跟踪参考对象投射的视锥范围内。
SurfaceMagnetism:将射线投射到世界上的表面,然后将对象与该表面对齐。
Momentum:应用加速度/速度/摩擦来模拟其他解算器/组件所移动的对象的动量和弹性。
InBetween:将一个对象保持在两个跟踪的对象之间。
HandConstraint:在不与GameObject用手相交的区域中约束对象跟随手。对于受手约束的交互式内容(例如菜单等)很有用。此解算器旨在与IMixedRealityHand一起使用,但也可与IMixedRealityController一起使用。
HandConstraintPalmUp:派生自HandConstraint,但包含用于在激活之前测试手掌是否面向用户的逻辑。此解算器仅与IMixedRealityHand控制器一起使用,对于其他控制器类型,此解算器的行为将与其基类相同。
为了使用规划求解系统,只需将上面列出的组件之一添加到Game Object。由于所有解算器都需要一个Solver Handler,因此Unity将自动创建一个Solver Handler。
手势交互(Hand Interaction)
开发套件中通过手势交互的方式主要有远距离交互和近距离交互两种。不管远距离交互还是近距离交互都依赖于对象的碰撞组件和manipulation Handler.cs脚本(操作处理程序脚本)。通过对操作处理程序脚本用户可以设置对象手势交互类型:仅单手、仅双手、单双手模式。而不同的交互类型里还包括不同可控制的行为,如旋转、移动、放大缩小等,同时不同行为又可以设置特定的行为轨迹。通过对操作处理程序脚本的设置,用户可以基本设定自己的手势交互行为。
而近距交互不仅要对操作处理程序脚本设置为关闭远距交互,同时要添加Near Interaction Touchable.cs (近距交互可接触对象脚本)或者Near Interaction Grabbable.cs (近距交互可抓取对象脚本)等近距离手势交互的脚本。对象操作的主要逻辑代码都在操作处理程序脚本中设定好了,近距离交互的脚本一般用来识别近距离交互时对对象的具体操作参数设定,使得对不同组件可进行多种不同的交互方式。
手部网格(Hand Grid)
模拟双手
手部网格依托于手势识别算法,可以实现双手全关节模型,通过在关节手上增加刚体运动学效果,可以让手指与虚拟对象的触碰交互更加自然逼真。可识别手部的关节点,都可以被用作交互的对象。通过对该部分识别结果的使用和组合,几乎可以用手势完成所有操作。使用手部网格可以实时刻画使用者的双手,用虚拟双手包裹真实双手,使操作更具真实感。
边界框(BoundingBox)
增加UI效果
边界框在HoloLens 2 中增加了UI显示的效果,实现对象被选中时显示边界框这一功能。只需要Bounding Box.cs脚本和对应的碰撞组件,通过对脚本配置的设定就可以实现当选中对象时,边界框就会出现,凸显操作的显示效果。
语音输入(Speech Input)
语音交互
MRTK集成了语音识别算法,可支持用户进行特定关键字的设置。MRTK配置文件默认是不能被编辑的,MRTK提供它们的clone方法,用户可以通过clone相应的配置文件,用clone的配置文件替代当前场景对应的配置文件。通过修改clone的配置文件可以改变一些默认的配置,层级比较低的配置文件需要从层级高的配置文件一级级clone下来。创建新的语音命令需要先克隆默认的输入系统配置文件,然后在克隆的默认输入系统配置文件中克隆默认的语音命令配置文件,最后再进行新的语音命令的改写。
要实现新的语音命令的监听,只需要在对象中添加 SpeechInput Handler.cs 脚本,取消对象脚本组件里“需要焦点”的复选框,给组件添加对应关键字和 Response()事件就可以通过语音来进行触发。
眼动输入(Eye Movement Input)
眼动交互
HoloLens 2 支持眼动追踪,根据眼球反射特定光线的变化准确获取眼瞳的位置。HoloLens 2 开启后进行的眼动调整,可以根据不同使用者的眼瞳间距动态的设定应用中左右眼相机的位置,更好地适用于用户。
眼球追踪的实现主要依托于Eye Tracking Target.cs 脚本,只要保证对象存在碰撞组件和Eye Tracking Target.cs 脚本就可以用来完成眼球追踪,配合眼球看向和选择的事件可实现一系列通过眼球完成的交互。
眼球的追踪使得用户视野中的虚拟空间和真实空间更加相似,较好地保持了两个空间对象更新的一致性。
(文章转载自公众号:S Dream Lab)