Leap Motion 教你玩转手势


        刚尝试手势的时候我差点选择放弃,现在想想还是自己不好好看SDK,小心使得万年船啊。

        废话不多说,直接贴代码,这段代码实现的是在画圈停止后输出一个Gesture通知,代码很顺利,结果很粗糙。由于手部肌肉连带,食指动的时候必然中指也动,加上Leap“超凡的精确度”,导致动了右手食指,出来四胞胎结果——拇指,食指,中指,无名指。


[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public override void OnFrame(Controller arg0)  
  2.         {  
  3.             Frame frame = arg0.Frame();  
  4.             GestureList gestures = frame.Gestures();  
  5.             for (int i = 0; i < gestures.Count; i++)  
  6.             {  
  7.                 Gesture gesture = gestures[i];  
  8.   
  9.                 switch (gesture.Type)  
  10.                 {  
  11.                     case Gesture.GestureType.TYPE_CIRCLE:  
  12.                         CircleGesture circle = new CircleGesture(gesture);  
  13.   
  14.                         // Calculate clock direction using the angle between circle normal and pointable  
  15.                         String clockwiseness;  
  16.                         if (circle.Pointable.Direction.AngleTo(circle.Normal) <= Math.PI / 2)  
  17.                         {  
  18.                             //Clockwise if angle is less than 90 degrees  
  19.                             clockwiseness = "clockwise";  
  20.                         }  
  21.                         else  
  22.                         {  
  23.                             clockwiseness = "counterclockwise";  
  24.                         }  
  25.   
  26.                         float sweptAngle = 0;  
  27.   
  28.                         // Calculate angle swept since last frame  
  29.                         if (circle.State != Gesture.GestureState.STATE_START)  
  30.                         {  
  31.                             CircleGesture previousUpdate = new CircleGesture(arg0.Frame(1).Gesture(circle.Id));  
  32.                             sweptAngle = (circle.Progress - previousUpdate.Progress) * 360;  
  33.                         }  
  34.   
  35.                         if(circle.State==Gesture.GestureState.STATE_STOP)  
  36.                             Console.WriteLine("  Circle id: " + circle.Id  
  37.                                             + ", " + circle.State  
  38.                                             + ", progress: " + circle.Progress  
  39.                                             + ", radius: " + circle.Radius  
  40.                                             + ", angle: " + sweptAngle  
  41.                                             + ", " + clockwiseness);  
  42.                         break;  
  43.                 }  
  44.                       
  45.             }  
  46.         }  


        修改过一个小东西后,手势明显变得好用了,就是阈值。图上是检测Key_Tap时候的反馈数据,由于设定了min_distance,即最小移动检测阈值,反馈良好,基本不会出现误操作的问题。由此可见好好看SDK是多么重要啊!阈值参数表如下:

画圈手势
Gesture.Circle.MinRadius float5mm
Gesture.Circle.MinArc float1.5 * piradians
按键手势
Gesture.KeyTap.MinDownVelocity float50mm/s
Gesture.KeyTap.HistorySeconds float0.1s
Gesture.KeyTap.MinDistance float3mm
横扫手势
Gesture.Swipe.MinLength float150mm
Gesture.Swipe.MinVelocity float1000mm/s
触摸手势
Gesture.ScreenTap.MinForwardVelocity float50mm/s
Gesture.ScreenTap.HistorySeconds float0.1s
Gesture.ScreenTap.MinDistance float5mm


       第一项为名称,第二项是数据类型(都是float),第三项是默认阈值大小,第四项是单位,csdn的表格有点不方便,然而对于一个写程序刚入门的,还去用dreamwaver编个表格粘到源码里,太麻烦,大家就这么一看,我就这么一画吧。修改阈值的方式也很简单:这里用Circle手势作为参考,修改了最小半径和最小角速度,然后记得保存。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. controller.Config.SetFloat ("Gesture.Circle.MinRadius", 10.0f);  
  2. controller.Config.SetFloat ("Gesture.Circle.MinArc", .5f);  
  3. controller.Config.Save ();  

       那么问题又来了,手势是对了,怎么知道是哪根指头操作的呢,不能玩第二根半价(权值选择不读)的游戏啊,肯定得想办法把所有指头都用上。想了两个办法,第一个操作一个Hand循环,采样手指名称,比如finger.type等于“TYPE_INDEX”是食指,是需要的的指头操作,测试发现问题了,因为是foreach fingers,所以只要手指头被检测到,就会被刷出来,第一种方案胎死腹中。第二个方案比较原始,即判断激发点和手指的位置是不是重合,但是由于Finger中并没有postion参数,只好想其他办法,不过下期一定贴代码!

      另外,细心的朋友发现程序失焦后会不工作,这是Leap的一种保护机制,然而这种保护机制我给零分,明明应该是默认读取数据,我可以选择关闭,现在是默认关闭我可以选择打开,好吧,我服,其实就是加了一句话:

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Controller.SetPolicy(Controller.PolicyFlag.POLICY_BACKGROUND_FRAMES);  

       这样子程序就可以后台继续数据了,回来路上我还纳闷这个问题呢,心想不应该,实在不行创建个新进程单独走,然而SDK再一次告诉我想多了,好好看SDK,东西全在里面,写不出都是自己的问题。现在节奏快,巴不得什么东西都不学,一口吃成个大胖子,唉,急不得啊。

       如果有朋友有finger和gesture匹配的解决方案,记得留言!

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: LeapMotion手势代码是一系列程序代码,用于实现使用LeapMotion手势控制计算机应用程序的功能。LeapMotion是一种“无触控”的手势识别技术,可以通过具备3D姿态跟踪能力的硬件设备,精确地捕捉人类手势的运动,进而识别并执行指令。 LeapMotion手势代码涉及一系列手势类别,包括手势摆动、手势滑动、手势旋转、手势移动和手势缩放等。这些手势代码均基于在LeapMotion控制面板中定义的动态姿势模型,可以在计算机程序中直接使用。 使用LeapMotion手势代码,用户可以实现不同程序功能的快捷操作,比如页面翻转、音乐播放、游戏控制、3D建模等。代码开发人员可以基于LeapMotion手势API接口,实现定制化的手势控制功能,从而提升用户交互性和体验。 需要指出的是,LeapMotion手势代码目前还处于发展阶段,存在一些技术和功能上的限制。同时,LeapMotion硬件产品的市场普及率也较低,需要更广泛地推广和应用。但总的来说,LeapMotion手势代码具有创新性和前瞻性,为计算机交互技术的发展带来了新的思路和方向。 ### 回答2: Leap Motion是一款非常先进的手势识别设备,可以实现与计算机及VR设备的互动。对于开发者而言,掌握Leap Motion手势代码非常关键。Leap Motion手势代码使用C++编写,支持多种手势,包括手势识别、手指跟踪、手势流、手势识别事件等。 在手势识别方面,Leap Motion可以识别基本的手势,如点、捏、握、捏持和滑动等。同时,它还支持高级手势识别,如掌心向下、掌心向上、手指张开等。开发者可以结合这些手势来设计自己的应用程序,实现更加丰富的用户体验。 另外,Leap Motion还支持手势流功能,能够将一系列的手势动作连贯起来形成一种手势流。这种功能非常适合VR手游等应用场景。开发者只需要定义手势流的动作序列和动作之间的时间间隔即可完成手势流的设计。 最后,Leap Motion还支持手势识别事件,通过回调函数将手势识别的结果返回给应用程序。开发者可以基于这些事件进一步扩展自己的应用功能。 总之,掌握Leap Motion手势代码对于开发者而言至关重要。在了解其基本手势的基础上,可以借助手势流和手势识别事件等高级功能,为用户带来更加优秀的交互体验。 ### 回答3: Leap Motion手势代码是针对Leap Motion手势识别设备开发的一类编程代码。Leap Motion手势识别设备是一种基于红外线光学技术的设备,能够识别出人手的动作、手势等信息,并将其转化为电脑上的指令,实现人机互动。 Leap Motion手势代码是基于Leap Motion SDK所开发的,使用这些代码可以快速地控制电脑的一些操作,如打开程序、调整窗口大小、进入屏幕保护等等。具体来说,生成Leap手势代码的主要步骤有三个:首先是设定识别手势的类型,例如缩放(pinch)和旋转(rotate)等;接下来是编写相应的功能代码,例如进行放大还是缩小、旋转还是平移等;最后是测试和调试。 目前,Leap Motion手势代码的应用范围越来越广泛,涵盖游戏、设计、虚拟现实、人机交互等多个领域。例如,在游戏中,玩家可以使用手势代码进行游戏操作,增强游戏的乐趣;在设计中,设计师可以使用手势代码控制模型的操作,提高设计效率;在人机交互中,用户可以使用手势代码进行离线指令控制,将互动体验提高到新的高度。 总之,Leap Motion手势代码是一种创新的编程方式,可以为我们的日常生活和工作带来很多便利,而且随着技术的不断发展,其应用前景也将越来越广阔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值