您当前的位置:首页 VR开发 Unity 正文

如何在Unity中使用Leap Motion进行手势控制

查看: 5550| 评论: 0 2016-9-29 10:42 AM| 发布者: PeckBang |来自: CSDN

Leap Motion作为一款手势识别设备,相比于Kniect,优点在于精确度。

在我的毕业设计《场景漫游器》的开发中,Leap Motion的手势控制作为重要的一个环节。以此,谈谈开发中使用Leap Motion进行手势识别的实现方式以及需要注意的地方。


一、对Leap Motion的能力进行评估

在设定手势之前,我们必须知道Leap Motion能做到哪种程度,以免在设定方案之后发现很难实现。这个评估依靠实际对设备的使用体验,主要从三个方面:

1.Leap Motion提供的可视化的手势识别界面

2.SDK文档说明

3.Leap商店中的APP

基本可以的得出:

1.Leap Motion的识别对于水平方向或者以水平方向为基础手势能够较好的识别。

2.对于握拳或者垂直的行为识别会出现误差,这种误差和具体的手势行为有关。

3.不应该过分依赖高精确度,Leap Motion能检测到毫米级别是没错的,但是有时候会把你伸直的手指识别成弯曲的,所以要做好最坏的打算。


二、实际的需要

移动、旋转、点击按钮、缩放和旋转物体、关闭程序、暂停,基本的功能需求是这样。

有一些原则:

1.相同环境下的手势应该接近和方便的转换。旋转和移动的之间的转换应该设计的很自然。

2.手势避免冲突,手势过于相似不是什么好事。比如三个伸直的手指和四个伸直的手指不应该被设计成两个手势。当然这不是绝对的,如果你进行一个缓慢的动作并且动作是面向Leap Motion的摄像头,这时候应该相信它,至少要针对这个手势做一个单独的测试。


三、考虑基本的数据结构算法的轮廓

Leap Motion的SDK在第一部分的时候已经浏览过,最起码能知道Leap Motion可以包含的信息,从SDK看来这是非常丰富的,既然设计自己的手势,那么最好不要依赖于SKD开发包的炫酷的手势。很可能,这些手势只是官方用来演示或者炫耀的。自己设计手势的基本数据结构也有另外的好处,比如更换了体感设备,但是功能是相似的,这时候只需要更改获取数据的方式就可以了(从一个SDK更换到另一个SDK),而不要修改算法。

算法的轮廓与基本数据有很大的关系。所以数据结构一定要尽量的精简并且允许修改(可能某个算法占据了决定性因素,但是开始没考虑到)。

[csharp] view plain copy
  1. public class HandAndFingersPoint : MonoBehaviour   
  2. {  
  3.     const int BUFFER_MAX=5;  
  4.     Controller m_LeapCtrl;  
  5.   
  6.     "white-space:pre">    public E_HandInAboveView m_AboveView = E_HandInAboveView.None;  
  7.       
  8.     //手指-数据 ,[0]表示左手,[1]表示右手  
  9.     private Dictionary[] m_FingerDatas = new Dictionary[2];  
  10.     //buffer,[0]表示左手,[1]表示右手,[,n](n属于0,3,表示第n次缓存)  
  11.     private Dictionary[,] m_FingerDatasBuffer=new Dictionary[2,BUFFER_MAX];  
  12.     private int m_CurBufIndex=0;  
  13.     //palm 0:左手 和1:右手  
  14.     private PointData[] m_PalmDatas = new PointData[2];  
  15.       
  16.     private readonly PointData m_DefaultPointData = new PointData(Vector.Zero, Vector.Zero);  
  17.         private readonly FingerData m_DefaultFingerData = new FingerData(Vector.Zero,Vector.Zero,Vector.Zero);  
HandAndFingersPoint类中剩下的部分是对数据的填充、清除、刷新等方法。E_HandInAboveView记录哪只手先进入Leap Motion的视野,用于设定优先级。
另外两个基本的数据结构PointData和FingerData:

[csharp] view plain copy
  1. //一个手指的数据包含一个指尖点数据和手指根骨的位置数据  
  2. public struct FingerData  
  3. {  
  4.     public PointData m_Point;//指尖的位置和指向  
  5.     public Vector m_Position;//手指根骨的位置,对于拇指来说是Proximal phalanges近端指骨的位置  
  6.   
  7.     public FingerData(PointData pointData, Vector pos)  
  8.     {  
  9.         m_Point = pointData;  
  10.         m_Position = pos;  
  11.     }  
  12.   
  13.     public FingerData(Vector pointPos, Vector pointDir, Vector pos)  
  14.     {  
  15.         m_Point.m_Position = pointPos;  
  16.         m_Point.m_Direction = pointDir;  
  17.         m_Position = pos;  
  18.     }  
  19.   
  20.     public void Set(FingerData fd)  
  21.     {  
  22.     m_Point = fd.m_Point;  
  23.     m_Position = fd.m_Position;  
  24.     }  
  25. }  
  26. //一个点的数据,包括方向和位置  
  27. public struct PointData  
  28. {  
  29.     public Vector m_Position;//位置  
  30.     public Vector m_Direction;//方向  
  31.   
  32.     public PointData(Vector pos,Vector dir)  
  33.     {  
  34.         m_Position = pos;  
  35.         m_Direction = dir;  
  36.     }  
  37.   
  38.     public void Set(PointData pd)  
  39.     {  
  40.         m_Position = pd.m_Position;  
  41.         m_Direction = pd.m_Direction;  
  42.     }  
  43.   
  44.     public void Set(Vector pos,Vector dir)  
  45.     {  
  46.         m_Position = pos;  
  47.         m_Direction = dir;  
  48.     }  
  49. }  
  50.   
  51. //先被看到的手  
  52. public enum E_HandInAboveView  
  53. {  
  54.     None,  
  55.     Left,  
  56.     Right  
  57. }  

基本数据定义好之后,最好确认数据的填充是没问题的,实际通过Frame frame = Leap.Controller.Frame();来获取最新的数据。这时候并不急着写完和基本数据相关的方法,现在最终要的是手势算法的合理性。要判断是否合理,最好先写一个算法。

最简单的是伸掌手势,在控制中水平的伸掌用于漫游,垂直的伸掌用于暂停。我发现手掌依赖于手指,而手指包括两个状态——伸直和弯曲。另外,其他的手势,也都是手指的伸直或者弯曲,外加方向的判定累积出各种效果。理所当然的,应该单独写出手指的弯曲和伸直判定算法:

[csharp] view plain copy
  1. ///   
  2. /// 该方法提供对于单个手指匹配的算法,如伸直,弯曲  
  3. /// 以后可能的改变:对于不同的场景可能要求有所不同,这里的阈值也许会随之改变  
  4. ///   
  5. public class FingerMatch  
  6. {  
  7.     
52VR.COM微信扫一扫
52vr公众号
专注于VR的学习、开发和人才交流

52VR开发交流

相关推荐

已有 0 人参与

发表评论

您需要登录才可以回帖 登录 | 立即注册

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-22 08:45 PM

返回顶部