关闭

Leap Motion 探究 【第三篇】

787人阅读 评论(2) 收藏 举报
分类:


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

        五一不想断更的,实在是没办法,出去的急忘了带笔记本,只好断更。下午才回来,毕竟这种万年没休的也习惯这种生活方式了,反而出去溜达感到闲的蛋疼。

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


public override void OnFrame(Controller arg0)
        {
            Frame frame = arg0.Frame();
            GestureList gestures = frame.Gestures();
            for (int i = 0; i < gestures.Count; i++)
            {
                Gesture gesture = gestures[i];

                switch (gesture.Type)
                {
                    case Gesture.GestureType.TYPE_CIRCLE:
                        CircleGesture circle = new CircleGesture(gesture);

                        // Calculate clock direction using the angle between circle normal and pointable
                        String clockwiseness;
                        if (circle.Pointable.Direction.AngleTo(circle.Normal) <= Math.PI / 2)
                        {
                            //Clockwise if angle is less than 90 degrees
                            clockwiseness = "clockwise";
                        }
                        else
                        {
                            clockwiseness = "counterclockwise";
                        }

                        float sweptAngle = 0;

                        // Calculate angle swept since last frame
                        if (circle.State != Gesture.GestureState.STATE_START)
                        {
                            CircleGesture previousUpdate = new CircleGesture(arg0.Frame(1).Gesture(circle.Id));
                            sweptAngle = (circle.Progress - previousUpdate.Progress) * 360;
                        }

                        if(circle.State==Gesture.GestureState.STATE_STOP)
                            Console.WriteLine("  Circle id: " + circle.Id
                                            + ", " + circle.State
                                            + ", progress: " + circle.Progress
                                            + ", radius: " + circle.Radius
                                            + ", angle: " + sweptAngle
                                            + ", " + clockwiseness);
                        break;
                }
                    
            }
        }


        修改过一个小东西后,手势明显变得好用了,就是阈值。图上是检测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手势作为参考,修改了最小半径和最小角速度,然后记得保存。

controller.Config.SetFloat ("Gesture.Circle.MinRadius", 10.0f);
controller.Config.SetFloat ("Gesture.Circle.MinArc", .5f);
controller.Config.Save ();

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

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

Controller.SetPolicy(Controller.PolicyFlag.POLICY_BACKGROUND_FRAMES);

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

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

1
0
查看评论

初识Leap motion

Leap motion
  • shiwq13
  • shiwq13
  • 2016-04-26 21:11
  • 452

Unity leapmotion开发实录(5)完结篇

本系列文章将会从一个初学者的脚步去讲解unity和leapmotion协同开发的一系列问题: 基础 环境搭建 场景创建 核心组件使用 sdk使用 脚本编写与功能实现方法 代码优化 UI交互部分 特:本人水平有限所以有错误请及时指正 本人也会引用一些代码如果有所侵犯请联系删除 自...
  • admintan
  • admintan
  • 2015-12-24 19:11
  • 9237

LeapMotion官方开发翻译文档现在免费下载

该文档原本在淘宝网进行售卖,但由于LeapMotion的SDK发展很迅速,没想到一个这么小的硬件可以搞这么代多SDK。我也无暇去更新SDK信息,并且对体感开发没有之前那么热情了。现在我在这里公布出以前售卖的LeapMotion SDK翻译,供大家参考。 下载地址:http://pan.baid...
  • guoming0000
  • guoming0000
  • 2016-03-27 23:19
  • 1058

关于leap motion的原理和疑点

关于leap motion的原理和疑点 转载来自    http://www.cnblogs.com/CVArt/archive/2012/05/28/2520967.html, 感觉介绍的很不错。牛人啊   一、关于原理的讨论 ...
  • m_kiss
  • m_kiss
  • 2012-05-28 14:40
  • 13397

ubuntu 16.04安装使用leap motion

1、http://www.linuxdiyf.com/linux/23737.html 2、https://www.leapmotion.com/setup/desktop/linux
  • StefanSalvatore
  • StefanSalvatore
  • 2017-06-01 20:48
  • 448

使用Leap Motion可视化工具

持续维护地址 http://52coding.com/using-the-leap-motion-visualizer 使用Leap Motion可视化工具 这篇文章描述Leap Motion可视化工具应用程序(Visualizer),它可以让你看到Leap Motion控制器捕获的...
  • guoming0000
  • guoming0000
  • 2013-07-28 14:51
  • 3956

LeapMotion开发(一)--下载安装以及C++环境配置

LeapMotion的配置入门,以C++的demo为例,介绍了如何下载安装以及配置lib以及dll环境~
  • zmdsjtu
  • zmdsjtu
  • 2016-09-12 15:57
  • 4650

leap motion 系统简介

从leap motion官网的介绍文章leap motion overview中,提取出个人认为有价值的东西,做下笔记,也是分享,希望能给大家带来帮助。原文地址 https://developer.leapmotion.com/documentation/Languages/C++/Guides/L...
  • smilingeyes
  • smilingeyes
  • 2013-10-30 21:12
  • 4731

Leap Motion 之Unity 开发实战(一. 制作手的HandController)

Leap Motion 之Unity 开发实战,第一部分:如何制作手的HandController。
  • eagle_pre21
  • eagle_pre21
  • 2016-06-28 16:20
  • 6510

Leap Motion 教你玩转手势

刚尝试手势的时候我差点选择放弃,现在想想还是自己不好好看SDK,小心使得万年船啊。         五一不想断更的,实在是没办法,出去的急忘了带笔记本,只好断更。下午才回来,毕竟这种万年没休的也习惯这种生活方式了,反而出去溜达感到闲的蛋疼。   ...
  • qq_26399665
  • qq_26399665
  • 2016-06-02 20:49
  • 4631
    个人资料
    • 访问:14397次
    • 积分:327
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:1篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论