一、引入
相对于HoloLens 1代,HoloLens 2在手势输入方面有了质的飞跃,强大的手势追踪功能,可以准确地识别你双手的26处指关节。对于开发者而言,手势输入的可玩性也变得更加丰富,今天就来分享一下本人在HoloLens 2开发过程中所累积的关于手势追踪方面的经验。
二、Hand Joint 和Hand Mesh的自定义
在Unity导入MRTK工具包以后,只需要简单的设置,就可以启用HoloLens 2强大的手势追踪功能,打开新建的MRTK配置文件,找到其中的HandTracking文件,可以看到我们能够配置的内容。
这里面的几个内容做一个简单的说明:
a. Joint Prefab 手部关节的预制体,默认为一个小方块
b. Palm Prefab 手掌掌心的预制体,默认为一个坐标系
c. Fingertip Prefab 手指指尖的预制体,默认为一个小球
d. Hand Mesh Prefab 手部网格的预制体,默认为灰白相间的网格。
这些Prefab你也可以自行修改和替换,修改后记得保存。下面以修改Hand Mesh Prefab为例子,展示一下效果。
除了以上修改Prefab内容来实现HandTracking的修改,在实际开发过程中运用的更多的还是通过代码去动态的修改手势的状态,具体的代码,在MRTK使用文档中已经有了很多示例。
三、较为简单的手势使用
相信很多小伙伴已经熟知TrackedHandJoint类,在该类中可以看到能够被追踪的26个指关节。在有些时候,单单是让一些游戏物体来追踪这些关节信息,就可以达到一些不错的效果。
比如那只让人印象深刻的蜂鸟,它就是实时的去追踪使用者手掌心的位置,非常有意思。
四、自定义手势
开发属于你自定义的手势,大致可以分成两种思路去实现:
方案一:
第一种方案类型为获取TrackedHandJoint类中26个指关节信息,根据这些信息去做一些逻辑判断,来实现某种手势。示例为MRTK中自带的示例,Assets-MixedRealityToolkit.Examples- Experimental-HandMenuLayout- Scenes- HandMenuLayoutExamples。它所实现的功能是当你的手掌面向用户时候,激活事件(默认为显示面板),同理手背面向用户的时候,则激活另外的事件(默认为隐藏面板),效果如下。我们可以参考其中实现逻辑的核心代码来感受一下实现思路。
以手掌位置和食指尖形成一个向量,再以无名指和食指形成一个向量,获取这两个向量叉乘的结果,然后判断当前活动手部为左手还是右手,如果是右手那么结果不变,如果为左手,结果乘以-1,以此来得到一个参考向量。随后根据手掌在世界坐标系中Position.y的数值和上面得到的一个参考向量角度差的结果与某个约定的数值作比较,以此来实现自定义手势—手掌翻转这么一个动作。
在结合了一些好看的效果以后,在HoloLens2中所呈现出来的最终结果:
方案二:
第二种方案实现起来会比较简单。实现思路为,在手指关节的关键部位绑定一些要素(例如下面会用到的Collider,也可以是一些按钮之类的组件),当这些要素被激活的时候,触发事件,在使用的时候,也会让人感觉是一种自定义手势,接下来演示的是模仿HoloLens 2中Windows按钮的一个示例。
演示效果:
实现思路非常简单,在识别到手势的时候,Collider会一直跟随着掌心的位置和旋转角度,当你用另外一只手去触碰掌心的Collider的时候,触发我们想要的事件。
核心代码:
还有要请大家注意的是,虽然自定义出来的手势可以非常的开放,但是还是有些手势需要去规避。
第一种,不要去做双手交叉或者双手堆叠面积很大的手势,在初期设计过程中,发现这种手势识别率很低,至于为什么,其实也很好解释,上面的手肯定会把下面的手遮挡住,基本的识别都做不到,谈何手势自定义?所以大家都不要去踩这个坑了。
第二种,设计出的自定义手势尽可能的简单,容错率高。那种对于手势精度很高或者基本不存在容错的手势,设计出来的意义也不会很大,也很难在应用中实际用起来。
第三种,如果可以,建议在自定义手势中加入友好提示,一些巧妙的提示设计可以让整个手势看起来非常智能和充满科技感,比如HoloLens 2中的Windows按键。
(文章转载自公众号:微软HoloLens;作者:陶志伟)